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。 –