萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

繞過現代 Anti-Rootkit 工具檢測技術探討

作者:MJ0011 | th_decoder@126.com | 2007-10-24

本文描述繞過主流現代 Anti-Rootkit 工具檢測的方法,涵蓋但不限於:Icesword 最新版、Gmer 最新版、Rootkit Unhooker 最新版、DarkSpy 最新版、AVG Anti-rootkit 最新版等。

當前 Anti-Rootkit 掃描技術分類

  1. 恢復 ZwQuerySystemInformation Hook,枚舉 SystemModuleInformation: 如 Icesword。
  2. 遍歷核心物件鏈表: PsLoadModuleList、Driver/Device/Section Object 鏈、TypeList 鏈等 (尋找驅動相關物件),如 Rootkit Unhooker、Gmer。
  3. 核心鏡像暴力搜尋: 掃描 MZ、PE 標誌判斷記憶體中是否有 PE 映像,如 Rootkit Unhooker、rutkowska modgreper,通常顯示 unknown image。
  4. 函數引用與 Hook 檢測: 先 Hook 常用函數,驅動調用時記錄地址;或依據各類 routine (dispatch routine、IDT、Image Notify) 或 hook (inline hook、IAT/EAT hook) 檢測,通常顯示 unknown image/handler。
  5. 系統 ImageLoad Notify + Boot 驅動: 記錄所有模組載入訊息,檢測時分析,如 AVG Anti-rootkit。

繞過技術 1、2、3、5 通用方案

使用 ZwSetSystemInformation 載入驅動,在 DriverEntry 中分配 NonPagedPool 記憶體,將功能程式碼/函數複製至該記憶體,完成必要 Hook 後返回 STATUS_UNSUCCESSFUL。

效果:驅動從 PsLoadModuleList、各物件鏈表消失,自然不在 ZwQuerySystemInformation 枚舉列表中。

注意:複製程式碼須盡量簡單,基本不產生需重定位程式碼,但調用系統函數仍需另想辦法。

實作技巧:內存自定位獲取原函數地址

某 RK 實作:A Function Hook 系統函數 B,需調用系統函數 C。分配記憶體大小 = len(A) + sizeof(ULONG)*2。前兩個 DWORD 放原函數 B 地址與 C 地址,其後放函數程式碼。函數中用 call +5 相對定位自身位置,找到記憶體起始處,取得原函數地址。比複製前用絕對地址更靈活。

相關程式碼片段:Hook CmEnumerateValueKey

void InstallCMRegHook() {
    PVOID _CmEnumerateKeyValueLoc = FindCmEnumerateValueKey();
    HookCodeLen = (ULONG)NopFunc8 - (ULONG)NewCmEnumerateValueKey;
    HookCode3 = ExAllocatePoolWithTag(NonPagedPool, HookCodeLen+4, MEM_TAG_HOOKCODE3);
    *(ULONG*)HookCode3 = *(ULONG*)_CmEnumerateKeyValueLoc;  // 原函數地址
    RtlCopyMemory((PVOID)(HookCode3+sizeof(ULONG)), (PVOID)NewCmEnumerateValueKey, HookCodeLen); // 複製程式碼
    DO_SPINLOCK();
    *(ULONG*)_CmEnumerateKeyValueLoc = HookCode3 + sizeof(ULONG); // 實施 Hook
    EXIT_SPINLOCK();
}

NTSTATUS NewCmEnumearateValueKey(...) {
    // 尋找本函數起始地址,獲取記憶體中保存的 OrgCmEnumerateValueKey 地址
    ...
}
copyright © 萬盛學電腦網 all rights reserved