2013-08-03 46 views
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); 
} 
+0

的OpenProcess的參數是在棧上傳遞後勾傾倒你的目標函數。你做的第一件事是改變堆棧。這不好。您的代碼需要保存cpu寄存器*和*不會損壞堆棧。這是不重要的,最好不要自己寫這個代碼。已經完成了,你已經用[繞道]標記了這個問題,所以你已經知道了一個好的解決方案。期待另一個沒什麼意義。 –

+0

@HansPassant:儘管我完全同意沒有理由編寫自己的代碼來執行此操作,但由於相同的PUSH操作與POP操作相匹配,所以堆棧正在被上面的消息提供的參數不適用 - 至少不適用於原始功能的調用。更有可能的是,「我的行爲在這裏」被破壞了(或者「原始」可能不包含正確的地址)。 –

+1

[當然假設這是爲32位代碼編譯的 - 但我認爲內聯彙編程序在64位模式下不受支持,而內聯彙編程序應該知道PUSHFD和POPFD,PUSHAD和POPAD不適用於X86-64。 –

回答

1

「//我的行動在這裏」會很有趣,也許你正在破壞堆棧。 或者可能錯誤在您的DetourFunction中。 你的程序如何失敗?也許與訪問衝突?

你也不必使用裸體功能。你可以掛鉤一個與你的目標具有完全相同簽名的函數。 沒有asm需要。

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); 
} 

如果doesn't工作,檢查GetProcAddress的返回值,如果that's糾正,一些在你的DetourFunction可能會錯誤。

你也可以使用像beaengine反彙編和迂迴,看是否被正確地使用