inline hook一点问题
今天在写R3下的inline hook的时候,想hookCreateProcessInternalW这个函数,反汇编得到这个函数的第一条指令是push指令,所以修改前5个字节,最后的程序使得能够执行到自己的钩子,但是在钩子中执行原来的CreateProcessInternalW的时候出问题了,程序崩溃。我的MyCreateProcessInternalW函数如下:
BOOL WINAPI MyCreateProcessInternalW( HANDLE hToken, LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation , PHANDLE hNewToken ){ MessageBox(NULL,"MyCreateProcessInternalW","",MB_OK); //恢复API头5个字节 if(!WriteProcessMemory( INVALID_HANDLE_VALUE, (void*)RealCreateProcessInternalW,(void*)OldBytes,5, NULL)) printf("write error!\n"); //调用正确函数[color=#FF0000],(这句程序崩溃) [/color] BOOL Flag=(BOOL)(PFNCreateProcessInternalW)RealCreateProcessInternalW(hToken,lpApplicationName, lpCommandLine,lpProcessAttributes, lpThreadAttributes,bInheritHandles, dwCreationFlags,lpEnvironment, lpCurrentDirectory,lpStartupInfo, lpProcessInformation,hNewToken); printf("OK!\n"); //写入跳转语句,继续hook WriteProcessMemory( INVALID_HANDLE_VALUE, (void *)RealCreateProcessInternalW,(void*)NewBytes,5, NULL); return Flag; }
HMODULE hHand= LoadLibrary("Kernel32.dll"); RealCreateProcessInternalW=(PFNCreateProcessInternalW)GetProcAddress(hHand,"CreateProcessInternalW"); if(ReadProcessMemory(INVALID_HANDLE_VALUE,(void *)RealCreateProcessInternalW,OldBytes,5,NULL)==0) { printf("ReadProcessMemory error\n"); return; }
*(DWORD*)(NewBytes + 1) = (DWORD)MyCreateProcessInternalW-(DWORD)RealCreateProcessInternalW-5;