пишу формграббер. успел набросать вот так вота: PHP: #include <windows.h> #include "module_disasm.h" #include "ffhook.h" HINSTANCE hInst=NULL; HHOOK SH = 0; HANDLE MutexHandle=(HANDLE)(-1); long __stdcall MsgProc(int code, unsigned int wParam,long lparam) { return CallNextHookEx(SH,code,wParam,lparam); } void __stdcall SetWindowsHook(bool e) { if(e){ HANDLE M=CreateMutex(0,false,"__API_HOOK"); if(GetLastError()!=ERROR_ALREADY_EXISTS){ SH=SetWindowsHookEx(WH_GETMESSAGE,MsgProc,hInst,0); MutexHandle=M; }else CloseHandle(M); } else { UnhookWindowsHookEx(SH); CloseHandle(MutexHandle); } } BOOL __stdcall DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: hInst=hModule;//инициализируем дескриптор приложения SetWindowsHook(true); SetFFHook(); case DLL_PROCESS_DETACH: SetWindowsHook(false); } return 0; } это главный модуль, а сама установка хука вот так выглядит: PHP: #include <windows.h> #include "module_disasm.h"//(c) slesh unsigned char *opcode=NULL; int PR_WRITE_tramp( DWORD *fd, void *buf, DWORD amount ) { __asm{ jmp opcode } } int PR_WRITE_hook( DWORD *fd, void *buf, DWORD amount ) { MessageBox(0,"ok",NULL,0); return PR_WRITE_tramp(fd,buf,amount); } bool SetFFHook()//хукаем nspr { HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки if(hNspr==0) return false;//если dll не загружена а значит мы не в том процессе - выходим DWORD dwPAddr=(DWORD)GetProcAddress(hNspr,"PR_Write"); if(dwPAddr<=0) return false;//если не нашли функцию, значит dll левая - выходим MessageBox(0,"ok",NULL,0); int buflen=MDAL_GetOpcodesLenByNeedLen((BYTE *)dwPAddr,5);//сколько надо перенести на трамплин чтоб записать 5 байт unsigned char *op=new unsigned char[buflen];//выделяем память opcode=new unsigned char[buflen+5]; ReadProcessMemory(INVALID_HANDLE_VALUE,(LPCVOID)dwPAddr,opcode,buflen,new DWORD);//копируем начало unsigned char jmp=0xE9; unsigned char nop=0x90; memcpy(op,(const void *)&jmp,1);//jmp DWORD offset=(DWORD)&PR_WRITE_hook - dwPAddr - 5; memcpy( (void *)((DWORD)op+1),(const void *)&offset,4); WriteProcessMemory(INVALID_HANDLE_VALUE,(LPVOID)dwPAddr,op,5,new DWORD); for (int i=5;i<buflen;++i) WriteProcessMemory( INVALID_HANDLE_VALUE,(LPVOID)(dwPAddr+i),&nop,1,new DWORD); DWORD tramp_offset=dwPAddr-(DWORD)opcode-5; if(!VirtualProtect(opcode, buflen+5, PAGE_EXECUTE_READWRITE, new DWORD)) return false; memcpy((void *)((DWORD)opcode+buflen),(const void *)&jmp,1);//jmp memcpy( (void *)((DWORD)opcode+buflen+1),(const void *)&tramp_offset,4); return true; } дак вот. почемуто выполняется только: PHP: HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки if(hNspr==0) return false;//если dll не загружена а значит мы не адрес базы nspr4(hNspr) равен нулю даже когда длл грузиться в процесс фокса. грузится она лоадреом во все процессы за счет установки глобального хука. прошу заметить что аналогичный код на дельфе работает так как надо(только глобальный хук немного по другому ставиться но я думаю это не столь важно ибо длл точно грузиться во все процессыт.к. мессаджбокс прописанный в dllmain на dllprocessatach вылазит во всех оконных процессах). в чем дело? чеза хня?
во первых esi в MDAL_GetOpcodeLen не сохраняется замените это Code: int MDAL_GetOpcodesLenByNeedLen(BYTE* opcode, int NeedLen) { int FullLen = 0; int len; do { len = MDAL_GetOpcodeLen(opcode + FullLen); if (!len) { return 0; } FullLen += len; } while (FullLen < NeedLen); return FullLen; } на это Code: int MDAL_GetOpcodesLenByNeedLen(BYTE* opcode, int NeedLen) { int FullLen = 0; int len; do { push esi len = MDAL_GetOpcodeLen(opcode + FullLen); pop esi if (!len) { return 0; } FullLen += len; } while (FullLen < NeedLen); return FullLen; } а во вторых вот исходники там есть код для сплайсинга http://webfile.ru/folder?id=17840