0
你知道为什么我挂钩kernel32函数时不能运行程序吗?我正在写反作弊,并希望更好地优化它,因为目前它在线程中,但有些错误...挂钩kernel32.dll函数阻止我的程序工作
有写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);
}
的OpenProcess的参数是在栈上传递后勾倾倒你的目标函数。你做的第一件事是改变堆栈。这不好。您的代码需要保存cpu寄存器*和*不会损坏堆栈。这是不重要的,最好不要自己写这个代码。已经完成了,你已经用[绕道]标记了这个问题,所以你已经知道了一个好的解决方案。期待另一个没什么意义。 –
@HansPassant:尽管我完全同意没有理由编写自己的代码来执行此操作,但由于相同的PUSH操作与POP操作相匹配,所以堆栈正在被上面的消息提供的参数不适用 - 至少不适用于原始功能的调用。更有可能的是,“我的行为在这里”被破坏了(或者“原始”可能不包含正确的地址)。 –
[当然假设这是为32位代码编译的 - 但我认为内联汇编程序在64位模式下不受支持,而内联汇编程序应该知道PUSHFD和POPFD,PUSHAD和POPAD不适用于X86-64。 –