关于在2003中绕过IS的ZwQueryVirtualMemory

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值