簡介

IAT Hiding 的情況下,還是會遇到沒辦法隱藏自己使用的 GetProcAddress 以及 LoadLibrary 等等,因此會需要用此方法在同樣隱藏 Import Address Table 的情況下呼叫函式。
主要分成兩步

  1. 拿到 DLL 的記憶體位置
  2. 找到 GetProcAddress 或其他函式的位置

如何找到 DLL

  1. 找到 TEB
  2. 透過 TEB 或 直接拿到 PEB 的位置
  3. PEB 拿到 _PEB_LDR_DATA
  4. 拿到 InMemoryOrderModuleList 這個 DoubleLinkedList 的進入點 每個節點都指向LDR_DATA_TABLE_ENTRY 中的 InMemoryOrderLinks
  5. InMemoryOrderLinks 爬到 Reserved4[8] 也就是 DLL 的完整名稱 目的是找到 Kernal32.dll
  6. 然後就可以從 DLLBase 找到 DLL 的記憶體位置

如何找到GetProcAddress

  1. DLL 找到 _IMAGE_NT_HEADER
  2. 找到 _IMAGE_OPTIONAL_HEADERDATA_DIRCTORY
  3. 其中第一個就是 IMAGE_EXPORT_DIRCTORY 也就是 Export Dirctory Table
  4. 其中的 AddressOfFunctions,AddressOfNames,AddressOfNameOrdinals 是用來找指定函式
  5. 利用 NumberOfFunctions 作為數量遍歷 AddressOfNames 以找到指定函式
  6. 得到的第一個 IndexAAddressOfNameOrdinals 的項次然後會得到 IndexB
  7. IndexB 作為 AddressOfFunctions 的項次就可以拿到函式的