Пишу программу, в которой требуется перехватывать API функции. Просмотрел кучу статей, но так и не нашел ничего на асме, в результате чего переписал на асм код из статьи http://rsdn.ru/article/baseserv/IntercetionAPI.xml Вот код: Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib jmp_far struct push_op db 0 arg dd 0 ret_op db 0 jmp_far ends .data hInstance dd 0 hProcess dd 0 NewCode jmp_far <> OldCode db 6 dup(0) ProcAddr dd 0 LibName db "kernel32.dll",0 ProcName db "GetSystemTime",0 mbError db "Can't get 'GetSystemTime' address",0 mbTitle db "Error",0 .code NewGetSystemTime proc lpSystemTime:DWORD LOCAL bytes :DWORD invoke WriteProcessMemory, hProcess, ProcAddr, addr OldCode, 6, bytes invoke GetSystemTime, lpSystemTime invoke WriteProcessMemory, hProcess, ProcAddr, addr NewCode, 6, bytes ret NewGetSystemTime endp SetHook proc LOCAL bytes :DWORD invoke GetModuleHandle, addr LibName invoke GetProcAddress, eax, addr ProcName mov ProcAddr, eax .if (eax == 0) invoke MessageBox, 0, addr mbError, addr mbTitle, MB_OK+MB_ICONERROR ret .endif mov NewCode.push_op, 68h mov NewCode.arg, offset NewGetSystemTime mov NewCode.ret_op, 0C3h invoke ReadProcessMemory, hProcess, ProcAddr, addr OldCode, 6, bytes invoke WriteProcessMemory, hProcess, ProcAddr, addr NewCode, 6, bytes ret SetHook endp Unhook proc LOCAL bytes :DWORD invoke WriteProcessMemory, hProcess, ProcAddr, addr OldCode, 6, bytes ret Unhook endp DllEntryPoint proc hinstDLL:DWORD,fdwReason:DWORD,lpvReserved:DWORD push hinstDLL pop hInstance call GetCurrentProcess mov hProcess, eax .if (fdwReason == DLL_PROCESS_ATTACH) call SetHook .elseif (fdwReason == DLL_PROCESS_DETACH) call Unhook .endif ret DllEntryPoint endp End DllEntryPoint Батник для компиляции: Код (Text): @echo off if exist time.obj del time.obj if exist time.dll del time.dll \masm32\bin\ml /c /coff time.asm \masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL time.obj dir time.* pause Итак, ошибки (их пока всего 2): 1. Скомпиленная либа не загружается через LoadLibrary до тех пор, пока в DllEntryPoint в DLL_PROCESS_ATTACH не поставить invoke Sleep или invoke MessageBox перед "SetHook" 2. Допустим, я вызвал MessageBox или Sleep перед "SetHook". Все заработало, но в этом случае при вызове GetSystemTime из программы, в которую внедрена библиотека, вылетает ексепшн. Вопрос: что я делаю не так?
Советую воспользоваться отладчиком, а вообще первое что бросается в глаза: invoke WriteProcessMemory, hProcess, ProcAddr, addr OldCode, 6, bytes Последний параметр должен быть указателем, и снимать перехват для вызова оригинальной функции как минимум плохой метод лучше использовать дизасм длин инструкций сохранить в буфер старые байты и сделать переход на продолжение функции. Читай статьи по перехвату от Ms-Rem'a, да и довольно много в инете готовых сорсов на эту тему мог хотябы поискать.
О! Точно! Спасибо тебе, blast. Действительно забыл проставить addr перед bytes))) Блин. Ночью мозг отключается)))
invoke ReadProcessMemory, hProcess, ProcAddr, addr OldCode, 6, bytes invoke WriteProcessMemory, hProcess, ProcAddr, addr NewCode, 6, bytes addr bytes, а не bytes там указатель куда записать кол-во прочитаных/записаных байт чорт. написал месагу а там уже ответит висит) сорри)