Сейчас на форуме: tyns777, zombi-vadim (+4 невидимых)

 eXeL@B —› Программирование —› Перехват CreateThread API
Посл.ответ Сообщение

Ранг: 36.7 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 ноября 2007 15:09 · Поправил: Hill
· Личное сообщение · #1

Народ подскажите как сделать сабж?
А то чето притомился с ним. Вот собсна код:

.
.
if (EnableDebugPrivilege()) //задаем дебаг привилегии
gcnew intercept(CrThrAddress);
else
.
.
bool Interception(PROC pfnCurrent)
{
DWORD bw,Writen;
Byte* Buffer,Buff;
HANDLE hProcess;
intercept^ MyProc;
try
{
hProcess= OpenProcess(PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,fals e, GetCurrentProcessId());
MyProc=gcnew intercept(gcnew Interceptor(),&Interceptor::MyCreateThread);
//инициализация структуры перехвата CreateThread
//сохраняем старое начало функции
ReadProcessMemory(hProcess, pfnCurrent, &Buff, sizeof(Buffer), (SIZE_T *)bw);
DWORD dwDummy;
//Разрешим запись в эту страницу
VirtualProtect(pfnCurrent, sizeof(Buffer), PAGE_EXECUTE_READWRITE, &dwDummy);

//записываем новое начало CreateThread
if (!WriteProcessMemory(hProcess, pfnCurrent,Buffer,sizeof(Buffer),(SIZE_T*) Writen))

//Interceptor::RunThreads();
return true;
}
catch (...)
{

}
return false;
}

уже как только не пытался... погуглил, пересмотрел... а результат один: либо ребут, либо ERROR_NOACCESS
P.S. пыпытка остановить все левые потоки приводит к полному зависанию...
То ди я где то накосячил то ли это такие особенности 2005 студии и дллок с CLR заголовками...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 27 ноября 2007 15:56 · Поправил: Rascal
· Личное сообщение · #2

//Разрешим запись в эту страницу
VirtualProtect(pfnCurrent, sizeof(Buffer), PAGE_EXECUTE_READWRITE, &dwDummy);

Если в чужом процессе хочешь открыть доступ для изменения, почему функция не VirtualProtectEx?
Если это длл, то зачем ваще WriteProcessMemory с ридом. проще через асм вставку. Синтаксис паленый. Я не уверен, что это компилится в натив код... И так и не понял что ты пишешь через WritePRocessMemory

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 36.7 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 ноября 2007 16:13
· Личное сообщение · #3

писдетс.... спать надо больше! найди 10 ошибок и посмотри как система на них реагирует! мда... тему можно смело в юмор...
2 Rascal:
прописывается что-то вроде jmp MyProc, изменить надо в родном процессе и перехватывать тоже в родном... Рид нужен чтобы потом все вернуть...




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 27 ноября 2007 16:21
· Личное сообщение · #4

асм вставки нерулят? протектить память не требуется при записи через WriteProcessMemory

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 27 ноября 2007 16:25
· Личное сообщение · #5

Rascal пишет:
протектить память не требуется при записи через WriteProcessMemory


сомнительное утверждение




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 27 ноября 2007 16:31 · Поправил: Ice-T
· Личное сообщение · #6

тоже прогнал сначала, но все же для записи в длл, протектить память надо...

-----
invoke OpenFire




Ранг: 36.7 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 27 ноября 2007 16:44
· Личное сообщение · #7

асм не рулит ибо говноменеджд код... либу грузит прилога писаная в С решетке.... просто через CreateRemoteThread не получилось, ибо кросс-поточность "защищена" значит выход один: ловить создание потока и запускать от имени текущего процесса а не удаленного...




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 ноября 2007 16:56 · Поправил: Hellspawn
· Личное сообщение · #8

__ пишет:
сомнительное утверждение


почему это? раскал как раз прав...

WriteProcessMemory:
...
7C802238 |. 50 PUSH EAX
7C802239 |. 57 PUSH EDI
7C80223A |. 895D FC MOV [LOCAL.1],EBX
7C80223D |. FFD6 CALL ESI ; <&ntdll.NtProtectVirtualMemory>
7C80223F |. 3D 4E0000C0 CMP EAX,C000004E
7C802244 |. 74 5C JE SHORT kernel32.7C8022A2

стек:

0096FE34 0000004C hProcess
0096FE38 0096FE54 lpAddress
0096FE3C 0096FE58 dwSize
0096FE40 00000040 flNewProtect (PAGE_EXECUTE_READWRITE = $40;)
0096FE44 0096FE70 lpflOldProtect

я думаю комментарии излишни
з.ы. Билли заботится о вас

-----
[nice coder and reverser]




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 27 ноября 2007 17:07
· Личное сообщение · #9

Hellspawn
у вас теоретические изыскания, у меня практические
много раз видел как WriteProcessMemory возвращает 0, а после VirtualProtect отрабатывает
нормально, причина меня не интересовала



Ранг: 72.4 (постоянный), 33thx
Активность: 0.050.03
Статус: Участник

Создано: 27 ноября 2007 17:59
· Личное сообщение · #10

__ пишет:
много раз видел как WriteProcessMemory возвращает 0, а после VirtualProtect отрабатывает

анологично




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 ноября 2007 18:07
· Личное сообщение · #11

ниразу такого не встречал + к тому же в основном я пользуюсь ZwWriteVirtualMemory, чтобы
полность контролировать ситуацию

-----
[nice coder and reverser]





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 27 ноября 2007 18:10
· Личное сообщение · #12

потому что в VirtualProtect скорее всего юзаюцо еще какие-то функи, а не только ZwVirtualProtectMemory, которой не всегда видемо достаточно..

-----
invoke OpenFire




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 27 ноября 2007 18:24
· Личное сообщение · #13

это чтоб сомнения пропали
#include <windows.h>

#pragma comment(linker, "/ENTRY:start")

#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")


void start()
{
char buff[4096] = {0};

if ( WriteProcessMemory(GetCurrentProcess(), GetModuleHandle(NULL), buff, 4096, NULL) )
MessageBox(NULL, "Done!", NULL, MB_OK | MB_ICONINFORMATION);
else
MessageBox(NULL, "An error occured", NULL, MB_OK | MB_ICONERROR);
ExitProcess(0);
}




Ранг: 260.9 (наставник)
Активность: 0.120
Статус: Участник
John Smith

Создано: 27 ноября 2007 18:34 · Поправил: Rascal
· Личное сообщение · #14

Ну я так со своими процессами не изгалялся, а писал через асм вставки или через разыменовывание указателей. WriteProcessMemory юзал только для записи в чужие процессы - никаких проблем не было.

-----
Недостаточно только получить знания:надо найти им приложение




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 27 ноября 2007 23:02
· Личное сообщение · #15

Rascal пишет:
никаких проблем не было.


будут =) (с) "операция Ы"



Ранг: 228.7 (наставник), 2thx
Активность: 0.120
Статус: Участник
malware research

Создано: 27 ноября 2007 23:59 · Поправил: Error_Log
· Личное сообщение · #16

Hill пишет:
изменить надо в родном процессе и перехватывать тоже в родном


1) Писать в своем процессе через WriteProcessMemory -- это жесть, для этого есть memcpy.
2) Чтобы задать права на запись -- VirtualProtect
3) В доке по WriteProcessMemory сказанно
>>The entire area to be written to must be accessible. Имхо accessible не значит PAGE_READWRITE, насчет VirtualProtect там молчек; правда я сам не проверял, может от DEBUG_PROCESS зависит.
4) Кстати sizeof(Buffer) - это размер указателя если jmp - поставь 5

-----
Research is my purpose




Ранг: 36.7 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 28 ноября 2007 07:56
· Личное сообщение · #17

2 Error_Log
Да я ошибки нашел почти сразу как только тему написал! Так что исправил...
Error_Log пишет:
1) Писать в своем процессе через WriteProcessMemory -- это жесть, для этого есть memcpy.

извините мне WriteProcessMemory привычнее, хотя тут ты прав.
Error_Log пишет:
4) Кстати sizeof(Buffer) - это размер указателя если jmp - поставь 5

у мну нормально работат...
кстати косяк был не тут а тут:
if (!WriteProcessMemory(hProcess, pfnCurrent,Buffer,sizeof(Buffer),(SIZE_T*) Writen))
Хохотал долго...


 eXeL@B —› Программирование —› Перехват CreateThread API
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати