【发布时间】:2013-08-03 13:10:26
【问题描述】:
你知道为什么我在挂钩 kernel32 函数之一时无法运行程序吗?我正在写反作弊,并希望对其进行更多优化,因为目前它正在线程中,但是有问题...
写了OpenProcess,因为我之前试过hook它,同样的问题。
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 寄存器 并且 不损坏堆栈。这很重要,最好不要自己编写此代码。已经完成,您已经用 [detours] 标记了问题,因此您已经知道了一个好的解决方案。期待另一个没有意义。
-
@HansPassant:虽然我完全同意没有理由编写自己的代码来执行此操作,但堆栈正在向上传递消息的论点并不适用,因为相同的 PUSH 操作是与 POP 操作相匹配 - 至少不适用于对原始函数的调用。
//my actions here更有可能以某种方式损坏(或者original可能不包含正确的地址)。 -
[当然假设这是为 32 位代码编译的 - 但我认为内联汇编程序无论如何都不支持 64 位模式,并且内联汇编程序应该知道 PUSHFD 和 POPFD 和 PUSHAD和 POPAD 不适用于 x86-64。
-
@MatsPetersson:原件地址不正确,问题已解决。