首页
论坛
专栏
课程

[原创]在2003中绕过IS的ZwQueryVirtualMemory

2008-7-6 18:25 6729

[原创]在2003中绕过IS的ZwQueryVirtualMemory

2008-7-6 18:25
6729
http://hi.baidu.com/sysnap
枚举DLL的方法很多
CreateToolhelp32Snapshot.算是最原始的..

枚举PEB..(IS使用的方法之一)缺点是断链也就无能为力了

ZwQueryVirtualMemory.(IS使用的方法之一)..不过这个小伟在XP下已经成功绕过了,但是

由于2003和XP的内核数据结构不一样,造成在2003下不兼容,我看了2003下的数据结构后,

简单的实现了下,跟XP的差别不是很大.

一般的断链IS的ZwQueryVirtualMemory是可以枚举到的
因为IS只有在完全得不到模块才会使用PEB.否则用ZwQueryVirtualMemory/...这倒是给我

们个很好绕的机会,因为你会发现效果是垮进程的,所以很适合全局钩子...自己隐藏了,所

有进程都隐藏

XP中用到的是
+0x11c VadRoot : Ptr32 Void

2003下却是
+0x258 VadRoot : _MM_AVL_TABLE

俩个数据结构变了,多了个_MM_AVL_TABLE和_MMADDRESS_NODE..到底跟原来的还有什么关



在2003中,下面几个dt命令你就知道是怎么回事了

lkd> dt _eprocess 82256cf8
nt!_EPROCESS

+0x258 VadRoot : _MM_AVL_TABLE

lkd> dt _MM_AVL_TABLE 0x82256cf8+0x258
nt!_MM_AVL_TABLE
+0x000 BalancedRoot : _MMADDRESS_NODE

lkd> dt _MMADDRESS_NODE 0x82256cf8+0x258
nt!_MMADDRESS_NODE
+0x000 u1 : __unnamed
+0x004 LeftChild : (null)
+0x008 RightChild : 0x824434b8 _MMADDRESS_NODE

//_MMADDRESS_NODE就是我们想要的东西,2003中才有这个结构,XP中没有

lkd> dt _MMADDRESS_NODE 0x824434b8
nt!_MMADDRESS_NODE
+0x000 u1 : __unnamed
+0x004 LeftChild : 0x82443e28 _MMADDRESS_NODE
+0x008 RightChild : 0x821f9698 _MMADDRESS_NODE

//到了这里,我们会说,_MMADDRESS_NODE与_MMVAD有什么关系呢??..别糊涂,我们转化下就

行了

lkd> dt nt!_MMVAD 0x824434b8
+0x000 u1 : __unnamed
+0x004 LeftChild : 0x82443e28 _MMVAD
+0x008 RightChild : 0x821f9698 _MMVAD
+0x00c StartingVpn : 0x1000
+0x010 EndingVpn : 0x10f0
+0x014 u : __unnamed
+0x018 ControlArea : 0x8219df30 _CONTROL_AREA -------------->>信息1
+0x01c FirstPrototypePte : 0xe16009c8 _MMPTE
+0x020 LastContiguousPte : 0xfffffffc _MMPTE
+0x024 u2 : __unnamed
lkd> dt _CONTROL_AREA 0x8219df30
nt!_CONTROL_AREA
+0x000 Segment : 0xe1600990 _SEGMENT
+0x004 DereferenceList : _LIST_ENTRY [ 0x0 - 0x0 ]
+0x00c NumberOfSectionReferences : 1
+0x010 NumberOfPfnReferences : 0x50
+0x014 NumberOfMappedViews : 1
+0x018 NumberOfSystemCacheViews : 0
+0x01c NumberOfUserReferences : 2
+0x020 u : __unnamed
+0x024 FilePointer : 0x82268f68 _FILE_OBJECT------------->>信息2
+0x028 WaitingForDeletion : (null)
+0x02c ModifiedWriteCount : 0
+0x02e FlushInProgressCount : 0
lkd> dt _FILE_OBJECT 0x82268f68
nt!_FILE_OBJECT
+0x000 Type : 5

+0x030 FileName : _UNICODE_STRING "\WINDOWS\explorer.exe"--->>信息3

ZwQueryVirtualMemory的枚举最终是用到了+0x030 FileName :

_UNICODE_STRING "\WINDOWS\explorer.exe"之类的信息
所以如果把这个地方抹掉..就可以成功绕过ZwQueryVirtualMemory...试了下.IS果然不能

枚举.只时候IS用了第二种方法,枚举PEB....还是能正常妹举的...但这时候只要我们在进

行断链处理..IS就枚不到了..
抹掉 +0x030 FileName : _UNICODE_STRING "\WINDOWS\explorer.exe"的代码简

单如下

//////////////////////////////////////////////////////

void ParseVadTree(IN ULONG ParentNode)
{
ULONG LeftChild,RightChild;
NoPathPath(ParentNode);
if ( MmIsAddressValid( (ULONG *)ParentNode ) )
{
LeftChild = *(ULONG*)((ULONG)ParentNode+0x4);
RightChild =*(ULONG*)((ULONG)ParentNode+0x8);
ParseVadTree(LeftChild);
ParseVadTree(RightChild);
}
}

void NoPath(IN ULONG ParentNode)
{
ULONG ControlArea;
ULONG FileObj;
PUNICODE_STRING FilePath;
if(ParentNode==0)
   return;
if(MmIsAddressValid((ULONG*)((ULONG)ParentNode+0x18)))
ControlArea=*(ULONG*)((ULONG)ParentNode+0x18);
if(MmIsAddressValid((ULONG*)(ULONG*)((ULONG)ControlArea+0x24)))
FileObj=*(ULONG*)((ULONG)ControlArea+0x24);
if(MmIsAddressValid((ULONG*)(ULONG*)((ULONG)FileObj+0x30)))
{
   FilePath=(PUNICODE_STRING)((ULONG)FileObj+0x30);
   ///////////////////////////////////////////////////////////////
   if(*(USHORT*)FileObj==FILETYPE)
   {
//你可以直接打出路径做成妹举模块的.也可以把路经抹掉///
   RtlZeroMemory(FilePath->Buffer,FilePath->Length);
   FilePath->Length = 0;
   FilePath->MaximumLength = 0;

   }
   ///////////////////////////////////////////////////////////////
}

}
就是这样...
所以比较好的隐藏DLL是对DLL进行断链处理,然后抹掉_FILE_OBJECT里面的路径..末掉PE

文件里面的相关信息或者直接reload
////////////////////////////////////////////////////////////////////
下面是演示程序,驱动只能在2003下运行,这一点要注意
附件中
SYS的作用是把notepad.exe这个进程的所有加载模块的路径抹掉...所以在运行驱动前你

先打开notepad.exe

exe的作用是用ZwQueryVirtualMemory来枚举DLL....你可以用他看下是否加载驱动后

ZwQueryVirtualMemory就失效了....

效果是跨进程的...也就是说在目标进程了隐藏了A.DLL...那么其他进程加载了A.DLL..用
ZwQueryVirtualMemory也失效......

IS第一次用的是ZwQueryVirtualMemory...只有在找不到任何模块的时候才采用PEB...所

以如果我们只隐藏一俩个DLL....IS被绕过.....你可以发现,驱动加载后,,..你用IS来看

进程加载的DLL...是找不到NTDLL.DLL之类的DLL的..
PS::只是PASS ZwQueryVirtualMemory..没有进行断链处理,也没有抹PE中的相关信息,更

没reload..一些普通的工具还是可以得到模块的....还有蓝屏不要骂俺啊......

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

上传的附件:
最新回复 (9)
smartqiu 1 2008-7-6 20:34
2
0
请问一下,对Ntdll.dll的API进行HOOK是否是全局的呢
xPLK 3 2008-7-6 20:53
3
0
你应该会遇到COW——奶牛机制



Sysnap弥补了我那个代码的缺陷。
谢谢!
Sysnap 14 2008-7-6 20:58
4
0
呵呵.....断链+抹_FILE_OBJECT+抹PE相关信息.....这样效果不错滴...再来个ring0注DLL
lixupeng 2008-7-6 22:11
5
0
哈哈试试
北极星2003 25 2008-7-7 23:51
6
0
学习+标记!
zhuwg 11 2008-7-9 07:20
7
0
先标记再学习.
漂魂 2008-7-9 09:28
8
0
学习!标记~!
champine 2008-7-9 09:59
9
0
sysnap终于发布出来了,咔咔
xacker 1 2008-8-5 04:43
10
0
盘符信息是从那里取到的啊?
游客
登录 | 注册 方可回帖
返回