Хочю перехватить меседжбокс. При после перехода на NewMessageBox падает код с ошибкой чтение невозможно. Обьясните что делаю не правильно? вот код длл Код (Text): CurrProc dd ? AdrMessageBox dd ? szMessageBox db 'MessageBoxA',0 szUser32dll db 'user32.dll',0 JmpCrProcA: .PuhsOp db 0x68 .PushArg dd ? .RetOp db 0xC3 OldCrp: .One dd ? .two dw ? entry $ cmp dword [esp+8], DLL_PROCESS_ATTACH jnz @F push dword [esp+4] start: call SetHook mov eax, 1 retn 0Ch proc SetHook mov eax,NewMessageBox mov [JmpCrProcA.PushArg],eax invoke GetCurrentProcess mov [CurrProc],eax invoke GetModuleHandle,szUser32dll test eax,eax jnz @F invoke LoadLibrary,szUser32dll @@: invoke GetProcAddress,eax,szMessageBox mov [AdrMessageBox],eax invoke ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0 invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],JmpCrProcA,6,0 ret endp NewMessageBox: invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0 ;мой обработчик push [AdrMessageBox] ;на начало Апи ret она подгружается test.exe Код (Text): szName db 'MyDll.dll',0 entry $ invoke LoadLibrary,szName invoke MessageBox,0,szName,0,0 invoke ExitProcess,0 Вот прикрепил код полностью. Компилятор Фасм. Если кому не внапряг посмотрите плиз.
вызывай VirtualProtect для нужной страницы памяти, кодовая секция обычно мапится только с правами на чтение/выполнение
Статьи я читал. Делаю все как у рихтера, за исключением: потоки не останавливаю, но у меня же один поток.
Нифига ты не читал.. перед тем, Как писать куда-то, не помешает убедиться, что туда действительно можно писать
но по адресу точки входа ф-ии меседжбокса вписывается мой код ))) push <адрес возврата> retn а вот процедура из статью Рема Код (Text): Procedure SetHook; var HKernel32, HUser32: dword; begin CurrProc := GetCurrentProcess; //получение адреса CreateProcessA AdrCreateProcessA := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA'); //инициализация структуры перехвата CreateProcessA JmpCrProcA.PuhsOp := $68; JmpCrProcA.PushArg := @NewCreateProcessA; JmpCrProcA.RetOp := $C3; //сохраняем старое начало функции ReadProcessMemory(CurrProc, AdrCreateProcessA, @OldCrp, SizeOf(OldCode), bw); //записываем новое начало CreateProcessA WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), Writen); end; он же здесь пишет туда без проблем
Второй раз за сегодня даю линк на свой недо-вирус: http://twister.orgfree.com/projects/index.php Скачай с этой страницы исходники VeRa v0.01 - там есть перехват MessageBoxExA (перехватывать нужно ее, а не MessageBoxA)
ну причем здесь VirtualProtect кто нибутдь обьяснит мне. У меня эти ф-ии нормально работают, проблема совсем не в них Код (Text): invoke ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0 invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],JmpCrProcA,6,0 ret endp NewMessageBox: invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0
А у меня invoke ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0 так и не заработал... Не хочет читать из Dllки
и invoke VirtualProtectEx,[CurrProc],[AdrMessageBox],6,PAGE_EXECUTE_READWRITE,memoryProtect Не работает, какие бы значения я в memoryProtect не подставлял... Там ведь нельзя чтоб NULL был, по MSDN.
Еще не советую помещать код в выделенную память (malloc, VirtualAlloc). Ради ~5 байт скопированного оригинального кода функции прийдется всю страницу памяти помечать как PAGE_EXECUTE, а ведь в ней могут оказаться данные, которые помещались программой в иной раз при вызове malloc... Если надо перехватывать не очень много функций, то я обычно делаю так, напр.: __declspec(naked) BOOL WINAPI TrueMoveFileEx( LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags ) { __asm { mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi mov edi, edi } } потом сюда при установке перехвата копируется оригинальный код (~5 байт) и переходник на продолжение функции. Или можно сделать отдельную секцию в исполняемом файле: #pragma data_seg( ".hook" ) CHAR hook_section[ HOOK_SECTION_SIZE ] = { 0xCC }; #pragma data_seg( ) #pragma comment( linker,"/SECTION:.hook,ER" ) и потом использовать ее для формирования трамплинов к оригинальной функции.