簡介
在 IAT Hiding 的情況下,還是會遇到沒辦法隱藏自己使用的 GetProcAddress 以及 LoadLibrary 等等,因此會需要用此方法在同樣隱藏 Import Address Table 的情況下呼叫函式。
主要分成兩步
- 拿到 DLL 的記憶體位置
- 找到
GetProcAddress或其他函式的位置
如何找到 DLL
- 找到 TEB
- 透過
TEB或 直接拿到 PEB 的位置 - 從
PEB拿到_PEB_LDR_DATA - 拿到 InMemoryOrderModuleList 這個 DoubleLinkedList 的進入點 每個節點都指向LDR_DATA_TABLE_ENTRY 中的 InMemoryOrderLinks
- 從 InMemoryOrderLinks 爬到 Reserved4[8] 也就是
DLL的完整名稱 目的是找到 Kernal32.dll - 然後就可以從 DLLBase 找到
DLL的記憶體位置
如何找到GetProcAddress
- 從
DLL找到_IMAGE_NT_HEADER - 找到
_IMAGE_OPTIONAL_HEADER的 DATA_DIRCTORY - 其中第一個就是
IMAGE_EXPORT_DIRCTORY也就是 Export Dirctory Table - 其中的 AddressOfFunctions,AddressOfNames,AddressOfNameOrdinals 是用來找指定函式
- 利用 NumberOfFunctions 作為數量遍歷 AddressOfNames 以找到指定函式
- 得到的第一個 IndexA 是 AddressOfNameOrdinals 的項次然後會得到 IndexB
- 拿 IndexB 作為 AddressOfFunctions 的項次就可以拿到函式的