2017-02-09 171 views
4

我一直在嘗試檢測API鉤子,內聯和EAT鉤子。如何檢測API掛鉤?

現在我沒有找到如何檢測EAT鉤東西。

內聯環掛鉤,是我到目前爲止有:

FARPROC Address = GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess"); 
if (*(BYTE*)Address == 0xE9 || *(BYTE*)Address == 0x90 || *(BYTE*)Address == 0xC3) 
{ 
printf("Api hooked\n"); 
} 

的問題是,有幾個操作碼,可以用來鉤/改變功能的序幕,檢查JMP/NOP/RET是微不足道的,我已經看到很多HOOK類型,如PUSH RET,MOV,RETN等...

我不知道是否有人知道如何檢測API中的這些掛鉤(繞行)或修改。 還有一些方法來檢測EAT鉤子。

謝謝。

+7

如果有人鉤住了你的程序,那麼他們可以鉤住你的鉤子檢測器。 –

+1

那麼,查看導出地址表是否已被掛鉤的一個顯而易見的方法是查看錶中的任何地址是否指向EAT所屬的DLL之外的某個地方。雖然,我相信一些標準DLL通過EAT將一些函數轉發給其他DLL,所以你必須處理這種情況。 –

回答

1

GetProcAddress可也大呼過癮。此外,由於您無法知道將要修補的確切API,因此您必須檢查所有導入的函數,這非常繁瑣。由於入侵者具有足夠的權限來注入進程地址空間和鉤子API方法,所以實際上幾乎沒有辦法阻止他完全修補任何保護機制。通常現代軟件保護系統包括內核模式驅動程序,它掃描程序內存並防止dll注入和遠程內存修改。此外,使用代碼加密/混淆系統(例如Themida),甚至是內部虛擬執行機器以及完全不相同的處理器指令集都很常見,這使得修補代碼變得非常困難。

+1

你說得對,當然,但我已經看到了一些非常有效的措施 - 加載KERNEL32.DLL從磁盤手動,確保文件進行簽名,以及比較指令前奏曲等,像GetProcAddress的關鍵功能。如果GPA被掛鉤,他們必須在比較數據之前動態解除綁定,以避免檢測。之後,您可以比較磁盤和內存中的功能指令校驗和等等。但是,它是一款貓捉老鼠遊戲,沒有任何傻瓜式的方法。 –

0

我相信你應該比從磁盤上的Kernel32.dll在存儲當前的DLL,你也應該忽略IAT和修復搬遷,否則你會得到不同的哈希值。

如果你想要一個簡單的解決方案只是重命名kernel32.dll中,並從您更名DLL讓你的API調用。

0

您需要掛鉤IAT地址爲您當前的進程,然後立即保存字節。

之後,你有原始字節,這樣你就可以在以後嘗試複製他們再次使用memcmp()比較舊的(原來的)用新的字節,如果他們是不同的,那麼您IAT地址有被另一個進程所吸引。