你知道为什么在挂钩kernel32函数时我无法运行程序吗?我正在写反作弊,并希望更多地优化它,因为目前它在线程中,但是出了点问题......
已经编写了OpenProcess,因为我之前尝试过将它挂钩并遇到同样的问题。
typedef HANDLE ( WINAPI * pOpenProcess )( _In_ HANDLE hProcess,
_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_ LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_ LPDWORD lpThreadId );
pOpenProcess original;
__declspec(naked) void hOpenProcess()
{
__asm PUSHAD
__asm PUSHFD
//my actions here
__asm POPFD
__asm POPAD
__asm JMP[original]
};
void ZPerformHook()
{
DWORD Address = ( DWORD )GetProcAddress( GetModuleHandle( TEXT( "kernel32.dll" ) ), "CreateRemoteThread" );
original = ( pOpenProcess )DetourFunction( (PBYTE)Address, (PBYTE)hOpenProcess );
}
答案 0 :(得分:1)
“//我在这里的行动”会很有趣,也许你正在破坏堆栈。 或者错误发生在您的DetourFunction中。 你的程序如何失败?可能有访问冲突?
你也不必使用裸功能。您可以挂钩到与目标具有完全相同签名的函数。 不需要。
HANDLE __stdcall hOpenProcess( HANDLE hProcess,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId )
{
// do your stuff here
std::cout << "From hook" << std::endl;
return original( hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId);
}
如果不起作用,请检查GetProcAddress的返回值,如果这是正确的,DetourFunction中的某些内容可能会出错。
您也可以使用像beaengine这样的反汇编程序并在绕行后转储目标函数以查看钩子是否正确应用