标 题: 【原创】 隐藏进程中的模块绕过IceSword的检测
作 者: xPLK

时 间: 2008-06-19,17:59:11
链 接: http://bbs.pediy.com/showthread.php?t=66886

【文章标题】: 隐藏进程中的模块绕过IceSword的检测

【文章作者】: 小伟的小伟[0GiNr](看雪ID:xPLK)

【作者主页】: http://www.0GiNr.com    http://hi.baidu.com/zoo%5F  

【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!

--------------------------------------------------------------------------------

【详细过程】

       最近对隐藏DLL来了点兴趣,首先是断了PEB里面的双向链,过了大部分程序。然后呢把MZ标志改掉了过了暴力搜索(感谢aegisys)。

  接下来就是对抗IceSword使用的NtQueryVirtualMemory的方法了。

  我去WRK里面看了下NtQueryVirtualMemory的源码,找到了这里。  

  以下是调试笔记。

  

  lkd> dt_EPROCESS 0x81583B60

  nt!_EPROCESS

     +0x000 Pcb              : _KPROCESS

  ;.............

     +0x11c VadRoot          : 0x816afb68 

  ;.............

  lkd> dt_MMVAD 0x816afb68 ;看到了吧。。。二叉树。。。。。。。。。。。

  nt!_MMVAD

     +0x000 StartingVpn      : 0x30

     +0x004 EndingVpn        : 0x12f

     +0x008 Parent           : (null) 

     +0x00c LeftChild        : 0x813d7748 _MMVAD

     +0x010 RightChild       : 0x816b21d8 _MMVAD  ;选择右节点来遍历

     +0x014 u                : __unnamed

     +0x018 ControlArea      : 0x0a050004 _CONTROL_AREA

     +0x01c FirstPrototypePte : 0x6d665346 _MMPTE

     +0x020 LastContiguousPte : 0x00000001 _MMPTE

     +0x024 u2               : __unnamed

  lkd> dt_MMVAD 0x816b21d8

  nt!_MMVAD

     +0x000 StartingVpn      : 0x400

     +0x004 EndingVpn        : 0x410

     +0x008 Parent           : 0x816afb68 _MMVAD

     +0x00c LeftChild        : 0x81672bb0 _MMVAD

     +0x010 RightChild       : 0x817b58d8 _MMVAD  ;再来一次

     +0x014 u                : __unnamed

     +0x018 ControlArea      : 0x8144a2f8 _CONTROL_AREA   ;这里是进程映像的地方。

     +0x01c FirstPrototypePte : 0xe24faaa0 _MMPTE

     +0x020 LastContiguousPte : 0xfffffffc _MMPTE

     +0x024 u2               : __unnamed

  lkd> dt_MMVAD 0x817b58d8 

  nt!_MMVAD

     +0x000 StartingVpn      : 0x7c920

     +0x004 EndingVpn        : 0x7c9b3

     +0x008 Parent           : 0x816b21d8 _MMVAD

     +0x00c LeftChild        : 0x81731348 _MMVAD

     +0x010 RightChild       : 0x81629b70 _MMVAD

     +0x014 u                : __unnamed

     +0x018 ControlArea      : 0x81f05138 _CONTROL_AREA   ;从这里进去。。

     +0x01c FirstPrototypePte : 0xe1377040 _MMPTE

     +0x020 LastContiguousPte : 0xfffffffc _MMPTE

     +0x024 u2               : __unnamed

  lkd> dt_CONTROL_AREA 0x81f05138 

  nt!_CONTROL_AREA

     +0x000 Segment          : 0xe1377008 _SEGMENT

     +0x004 DereferenceList  : _LIST_ENTRY [ 0x0 - 0x0 ]

     +0x00c NumberOfSectionReferences : 1

     +0x010 NumberOfPfnReferences : 0x6d

     +0x014 NumberOfMappedViews : 0x19

     +0x018 NumberOfSubsections : 5

     +0x01a FlushInProgressCount : 0

     +0x01c NumberOfUserReferences : 0x1a

     +0x020 u                : __unnamed

     +0x024 FilePointer      : 0x81e9d938 _FILE_OBJECT  ;这里可以得到模块信息

     +0x028 WaitingForDeletion : (null) 

     +0x02c ModifiedWriteCount : 0

     +0x02e NumberOfSystemCacheViews : 0

  lkd> dt_FILE_OBJECT 0x81e9d938 ;到这里ntdll.dll已经出来了。。。。

  nt!_FILE_OBJECT

     +0x000 Type             : 5

     +0x002 Size             : 112

     +0x004 DeviceObject     : 0x81dce7b8 _DEVICE_OBJECT

     +0x008 Vpb              : 0x81e9f8e0 _VPB

     +0x00c FsContext        : 0xe13939e0 

     +0x010 FsContext2       : 0xe1393b38 

     +0x014 SectionObjectPointer : 0x81e9338c _SECTION_OBJECT_POINTERS

     +0x018 PrivateCacheMap  : (null) 

     +0x01c FinalStatus      : 0

     +0x020 RelatedFileObject : (null) 

     +0x024 LockOperation    : 0 ''

     +0x025 DeletePending    : 0 ''

     +0x026 ReadAccess       : 0x1 ''

     +0x027 WriteAccess      : 0 ''

     +0x028 DeleteAccess     : 0 ''

     +0x029 SharedRead       : 0x1 ''

     +0x02a SharedWrite      : 0 ''

     +0x02b SharedDelete     : 0 ''

     +0x02c Flags            : 0x44040

     +0x030 FileName         : _UNICODE_STRING "\WINDOWS\system32\ntdll.dll"

     +0x038 CurrentByteOffset : _LARGE_INTEGER 0x0

     +0x040 Waiters          : 0

     +0x044 Busy             : 0

     +0x048 LastLock         : (null) 

     +0x04c Lock             : _KEVENT

     +0x05c Event            : _KEVENT

     +0x06c CompletionContext : (null) 

  lkd> dt_FILE_OBJECT 0x81c08350 ;再往后是kernel32.dll

  nt!_FILE_OBJECT

  ;......................

     +0x030 FileName         : _UNICODE_STRING "\WINDOWS\system32\kernel32.dll"

  ;......................

   

  

  这里是源码,包含了大量硬编码,要编译的话自己搜索一下就可以。

  Code:

  

  

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

  //在Ring0下通过遍历VAD获取进程内的模块(WinXP SP2)

  //By 小伟的小伟[0GiNr](看雪ID:xPLK)

  //http://www.0GiNr.com

  //http://hi.baidu.com/zoo%5F

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

  VOID ShowModules()

  {

      ULONG VAD;

      PEPROCESS TargetProcess;

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

      PsLookupProcessByProcessId( (HANDLE)Pid,TargetProcess);

      if(!TargetProcess)

       {

          dprintf("[EnumModules] Error on Get EProcess By Pid.");

          return;

       }

      VAD = *(ULONG *)((ULONG)TargetProcess + Vad);

      //+0x11c VadRoot : Ptr32 Void

      dprintf("[EnumModules] EPROCESS : 0x%X , VAD : 0x%X",TargetProcess,VAD);

      PreOrderTraverse(VAD);  //遍历二叉树。。。

      dprintf("[EnumModules] Modules count : %d",nCount);

      //start.

  }

  

  VOID PreOrderTraverse(ULONG mmVad)

  {

      if ( MmIsAddressValid( (ULONG *)mmVad ) )

       {

          ShowPath(mmVad);//读取地址

          PreOrderTraverse( *(ULONG *)(mmVad + LeftChild) );

          PreOrderTraverse( *(ULONG *)(mmVad + RightChild) );

       }

  }

  

  VOID ShowPath(ULONG mmVad)

  {

      PUNICODE_STRING pPath;

      ULONG ca;//_CONTROL_AREA

      ULONG fp;//_FILE_OBJECT

      ca = *(ULONG *)(mmVad + ControlArea);

      if( !MmIsAddressValid( (ULONG *)ca ) )

       {

          //dprintf("[EnumModules] ControlArea is not available : 0x%X",ca);

          return;

       }

      fp = *(ULONG *)(ca + FilePointer);

      if( !MmIsAddressValid( (ULONG *)fp ) )

       {

          //dprintf("[EnumModules] FileObject is not available : 0x%X",fp);

          return;

       }

      pPath = (PUNICODE_STRING)(fp + FileName);

      dprintf("[EnumModules] The file name is %S",pPath->Buffer);

      //dprintf("[EnumModules] The MMVAD is 0x%X",mmVad);

      //dprintf("\n");

      nCount++;//计数

  }

  

  

  这样和用NtQueryVirtualMemory扫描出来的结果一样(MemorySectionName),可以在DebugView里看到。输出是这样的。

  [EnumModules] The file name is \Project\VisualC++\HideModule\Release\HideModule.exe

  [EnumModules] The file name is \WINDOWS\system32\ntdll.dll

  [EnumModules] The file name is \WINDOWS\system32\kernel32.dll

  [EnumModules] The file name is \WINDOWS\system32\advapi32.dll

  [EnumModules] The file name is \WINDOWS\system32\rpcrt4.dll

  [EnumModules] The file name is \WINDOWS\system32\gdi32.dll

  [EnumModules] The file name is \WINDOWS\system32\user32.dll

  [EnumModules] The file name is \WINDOWS\system32\imm32.dll

  [EnumModules] The file name is \WINDOWS\system32\msvcrt.dll

  [EnumModules] The file name is \WINDOWS\system32\apphelp.dll

  [EnumModules] The file name is \WINDOWS\system32\version.dll

  [EnumModules] The file name is \WINDOWS\system32\lpk.dll

  [EnumModules] The file name is \WINDOWS\system32\usp10.dll

  [EnumModules] The file name is \WINDOWS\system32\unicode.nls

  [EnumModules] The file name is \WINDOWS\system32\sortkey.nls

  [EnumModules] The file name is \WINDOWS\system32\ctype.nls

  [EnumModules] The file name is \WINDOWS\system32\sorttbls.nls

  [EnumModules] The file name is \WINDOWS\system32\locale.nls

  

  

  所以要隐藏呢,就简单了,当然遍历二叉树找到需要隐藏的DLL的时候,我们可以做手脚。

  当初测试抹掉FileObject会不稳定,运行某些程序会蓝屏。

  

  感谢炉子提示,抹掉_FILE_OBJECT里面的路径就可以了。

  代码如下:

  ////////

  RtlZeroMemory(pPath->Buffer,pPath->Length);

  pPath->Length = 0;

  pPath->MaximumLength = 0;

  ///////

  

  

  效果图如下,我隐藏的是ntdll.dll,IceSword是最新版:

  

  比较有意思的是,隐藏掉了之后,再所有进程中都不会显示该模块(ntdll.dll)。

  经过测试,对新创建的进程同样有效,新进程中也没有ntdll.dll的痕迹(IceSword)。

  抹了这点地方,应该还是有办法检测出来的。

  大家发挥创造力吧。





  再次感谢几位朋友的帮忙:

  aegisys: http://hi.baidu.com/aegisys

  Sysnap :http://hi.baidu.com/sysnap

  炉子 :http://hi.baidu.com/breakinglove_

  FlowerCode: http://hi.baidu.com/flowercode

  

  本人菜鸟,文中难免有所缺漏,敬请各位看官指出不足之处。。



  注:sysnap大牛已经检测出来了,得到了一个基址,十分不错,我把bin放出来,有兴趣的可以玩一下,完整src就不放了,主要是怕流氓啊~。

--------------------------------------------------------------------------------

【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!



                                                       2008年06月19日 18:02:30*转载请注明来自看雪论坛@PEdiy.com

jpg改rar 

隐藏进程中的模块绕过IceSword的检测的更多相关文章

  1. VC中遍历目标进程中的模块

    VC中遍历目标进程中的模块 MFC代码win32 也可以用 在下面代码进行修改转换就可以了CString strModule; 可以换成 char* 但是MODULEENTRY32结构中的szModu ...

  2. 【旧文章搬运】再谈隐藏进程中的DLL模块

    原文发表于百度空间,2009-09-17========================================================================== 相当老的话 ...

  3. 使用ptrace向已运行进程中注入.so并执行相关函数

    这个总结的很好,从前一个项目也用到这中技术 转自:http://blog.csdn.net/myarrow/article/details/9630377 1. 简介 使用ptrace向已运行进程中注 ...

  4. 使用ptrace向已运行进程中注入.so并执行相关函数(转)

    1. 简介 使用ptrace向已运行进程中注入.so并执行相关函数,其中的“注入”二字的真正含义为:此.so被link到已运行进程(以下简称为:目标进程)空间中,从而.so中的函数在目标进程空间中有对 ...

  5. Electron结合React,在渲染进程中使用 node 模块

    Electron结合React,在渲染进程中使用 node 模块 问题 将create-react-app与electron集成在了一个项目中.但是在React中无法使用electron.当在Reac ...

  6. 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程

    1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...

  7. 在iOS应用程序中使用Frida绕过越狱检测

           阿里聚安全在之前的三篇博客中介绍了利用Frida攻击Android应用程序,整个过程仿佛让开发者开启上帝视角,在本篇博客中,我们将会介绍在iOS应用程序中使用Frida绕过越狱检测.即使 ...

  8. Python之进程 2 - multiprocessing模块

    ​ 我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程.多个进程可以实现并发效果,也就是说, ...

  9. 网络基础之 并发编程之进程,多路复用,multiprocess模块

    并发 1. 背景知识 2. 什么是进程 3. 进程调度 4. 并发与并行 5 同步\异步\阻塞\非阻塞(重点) 6.multiprocess模块 7.僵尸进程与孤儿进程 1.背景知识 一操作系统的作用 ...

随机推荐

  1. C# HttpWebRequest获取COOKIES

    C# HttpWebRequest获取COOKIES byte[] bytes = Encoding.Default.GetBytes(_post); CookieContainer myCookie ...

  2. js删除数组指定元素

    删除js数组中制定的元素,这里用到了jquery. var a = new Array("a","b","cc","d3" ...

  3. 【jQuery】选择器

    jQ提供了很多选择器:(注:$("p").action() action为后续动作) 元素选择器 $("p").action() ; //选取所有p标签 id选 ...

  4. Git 账户认证的一些问题

    Mac被水浇了之后,只好用Window 开发了.但是在往Github上提交代码出现了些问题. 1. 提交时总是出现弹出框提示账号认证 之前Mac没有出现过这问题,所以有些怀疑Windows开发环境不友 ...

  5. Redis实战阅读笔记——第一章

    Redis 实战 中文版 的20-21页看的人郁闷死了,最后看英文版才明白意思,哎,我理解能力差成这样了 其中,图 1-12 有错误,草,这个是英文版的错--应该是group:programming

  6. UvaLA 3938 "Ray, Pass me the dishes!"

                            "Ray, Pass me the dishes!" Time Limit: 3000MS   Memory Limit: Unkn ...

  7. TCP/IP模型详解

    上述为TCP/IP的协议模型,主机到网络层又被称为网络接口层,网络互联层又被称为网间层. 网络接口层:实际上,TCP/IP参考模型并没有真正描述这一层的实现,只是要求能够提供给其上层一个访问接口,以便 ...

  8. 转载:gulp文件

    这是我的文件目录结构图  下面是我gulpfile.js的配置 'use strict' var gulp=require('gulp'); var gutil=require('gulp-util' ...

  9. 关于robotframework,app,appium的xpath定位问题及常用方法

    关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...

  10. Decode Ways

    https://leetcode.com/problems/decode-ways/ A message containing letters from A-Z is being encoded to ...