IceSword&Rootkit Unhooker驱动简析

转载 2007年09月29日 17:29:00
IceSword版本:1.20cn 修订号:061022
----------------------------------------------------

0. 进程
  (略)

1. 端口
  IS调用IoBuildDeviceIoControlRequest分别向Tcpip.sys所创建的TCP设备对象和UDP设备对象发送IRP,在输出缓冲区中将返回端口/IP/状态/PID的结构数组(DS也是这么搞的,只不过没关联到进程)。

2. 驱动
  IS在驱动部分中通过调用NtQuerySystemInformation (SYSTEMMODULEINFORMATION) 来枚举内核模块,这里顺便插一句,在应用部分中,IS调用EnumServiceStatusExA函数把所有已运行模块枚举出来。每当枚举出一个模块时,到注册表中查找其ImagePath值,并与在内核部分列举出来的相应模块对比路径,若路径相同则认为已存在,若不同或没找到则说明是隐藏模块。

3. 注册表
  IceSword中注册表处理比较简单,即调用ZwOpenKey,ZwQueryKey,ZwClose,ZwEnumerateKey,ZwEnumerateValueKey来枚举。在调用它们之前都要对其前几十字节进行恢复。

4. 文件系统
  这部分算是重点了,也是IS处理得比较巧妙的地方,即采用所谓的Raw FSD I/O来枚举文件和目录。其实就是调用IoAllocateIrp,然后自己填好各个域(先发IRP_MJ_CREATE,再发IRP_MJ_DIRECTORY_CONTROL(IRP_MN_QUERY_DIRECTORY)),最后“直接”发到ntfs.sys/fastfat.sys的DispatchCreate和DispatchDirecotryControl派遣例程,但这里有两个问题需要注意:

a. IS在填充IRP_MJ_DIRECTORY_CONTROL的IRP时,在下层堆栈中设立了SL_RETURN_SINGLE_ENTRY标志,这就直接导致FSD每次只会返回给我们一个FILE_BOTH_DIRECTORY_INFORMATION结构,而不是全部返回(DS是全部返回的)。当IoStatus.Status == STATUS_NO_MORE_FILES时确认枚举完毕。

b. IS是有办法直接定位到上面说的派遣例程的地址的(通过特征搜索),人家也没直接调用IoCallDriver,而是直接call过去的,并且会变态的不停恢复派遣例程的前几十个字节,所以你用什么FSD dispatch routine table HOOK,什么FSD HOOK都白扯。  


RkU版本:3.30.150.400
------------------------------------------------

0. 进程
  (略)

1. 驱动
"Hidden drivers detection
Detection of drivers hidden from Windows API
combines four different methods of detection and including special five (c) Stealth Walker technology
and six (c) KMSE - Kernel Memory Scanning Engine"   ---- RkU

  正如其在帮助文档中所说的那样,RkU确实费了一定量代码在驱动枚举模块上,分析时差点被它搞疯,还是分条列举吧:
a. 遍历IoDriverObjectType对象类型的类型链表(POBJECT_TYPE->TypeList),这样可以获得所有DRIVER类型的对象体信息,也即DRIVER_OBJECT结构。然后取出:PDRIVER_OBJECT->DeviceObject,再遍历DeviceObject->AttachedDevice,得到相应DRIVEROBJECT信息,这些东西凡是不重复的统统放入输出缓冲区。
b. 遍历IoDeviceObjectType对象类型的类型链表,思路同上。

  当然a和b成功实现枚举的前提是NtGlobalFlags变量设置了Maintain type list标志,否则输出缓冲区什么也没有。

c. 先调用ZwOpenDirectoryObject打开目录对象获得句柄,然后调用ObReferenceObjectByHandle获得目录对象的指针(其结构为OBJECT_DIRECTORY),然后开始枚举:    
I. 先从HashBuckets数组中取得索引为0的对象目录项指针
II. 判断是否为0,若为0则取下一项。
III. 若不为0,取得POBJECT_DIRECTORY_ENTRY->Object,即对象体。然后根据对象头Object_Header中的类型域判断是否是IoDriverObjectType或IoDeviceObjectType,按照a,b的方式分别处理。若都不是则判断是否是“目录”类型,若是则递归枚举。否则,从POBJECT_DIRECTORY_ENTRY->ChainLink中取下一项继续遍历。

d. 通过DRIVER_OBJECT.DriverSection(即PsLoadedModuleList链表)枚举驱动模块。

  好了,已经说了4项了,至于最后的"special five (c) Stealth Walker technology and six (c) KMSE",其实就是从内核地址空间0x80000000-0xffff0000之间暴力搜PE映像,然后综合某些条件来判断是否驱动的PE映象,变态吧???

2. Disk Low-Level Scanning
  调用IoBuildAsynchronousFsdRequest创建一个主功能码为IRP_MJ_READ的IRP发到下层卷管理器驱动ftdisk.sys读磁盘扇区信息,这里是绕过了FSD的。 

IceSword&Rootkit Unhooker驱动简析

IceSword版本:1.20cn 修订号:061022 ----------------------------------------------------0. 进程   (略) 1. 端口  ...
  • iiprogram
  • iiprogram
  • 2008年05月22日 16:54
  • 1043

Rootkit Unhooker驱动逆向分析

作 者: linxer时 间: 2008-06-19,00:31链 接: http://bbs.pediy.com/showthread.php?t=66839这个驱动本来准备端午节搞的,但后来端午节...
  • iiprogram
  • iiprogram
  • 2008年06月24日 09:35
  • 790

Rootkit Unhooker驱动逆向分析

 这个驱动本来准备端午节搞的,但后来端午节去了躺北京玩了几天,也就搁置了...最近连续花了4个晚上,大致把它搞的差不多了,有些收获...初学 window驱动,水平很菜,有些东西我也未必清明,加上3环...
  • iiprogram
  • iiprogram
  • 2008年07月25日 09:11
  • 1232

我见过最牛的rootkit

出售过还原软件代码2007-07-24 16:10 类型1:过各类还原软件保护写入文件 ...
  • valiant1ster
  • valiant1ster
  • 2007年08月08日 21:35
  • 619

S3C2440驱动简析——I2C驱动

这次来研究内核自带I2C驱动的代码,在深入代码之前,首先简单了解一下I2C核心数据结构的相互关系。由此来展开,也许能够对驱动代码有更好地理解。软件数据结构的设计、数据结构之间的关系就至少应该描述硬件物...
  • fyyy4030
  • fyyy4030
  • 2012年01月19日 22:58
  • 893

S3C2440驱动简析——串口驱动 .

S3C2440驱动简析——串口驱动      对于驱动的学习停歇了几乎一周的时间,期间忙于补习Linux应用编程和搜索驱动、内核相关书籍,以便之后更进一步地学习。在之前友善提供的驱动例程里面,涉...
  • wuhuan_001
  • wuhuan_001
  • 2012年11月04日 10:43
  • 309

S3C2440驱动简析——看门狗驱动

     本文假设各位看官已经了解看门狗的工作原理,而且手上有2440的datasheet,可以随时查看看门狗相关的寄存器。我在这里仅仅专注于对驱动程序的分析,望见谅~  借用网上的朋友☆&寒 烟☆的...
  • jarvis_xian
  • jarvis_xian
  • 2011年06月03日 22:38
  • 935

【Linux开发】V4L2驱动框架分析学习

Author:CJOK Contact:cjok.liao#gmail.com SinaWeibo:@廖野cjok   1、概述 Video4Linux2是Linux内核...
  • LG1259156776
  • LG1259156776
  • 2016年08月28日 09:52
  • 2403

S3C2440驱动简析——串口驱动

对于驱动的学习停歇了几乎一周的时间,期间忙于补习Linux应用编程和搜索驱动、内核相关书籍,以便之后更进一步地学习。在之前友善提供的驱动例程里面,涉及的知识面非常有限,需要研究更多的驱动源码,了解更多...
  • Aniu127
  • Aniu127
  • 2014年08月06日 21:52
  • 416

android lcd驱动简析

对于lcd驱动的分析主要分为三部分: 底层硬件结构浅析 framebuffer浅析 MIPI浅析 底层硬件结构浅析 1、    要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相...
  • ly601579033
  • ly601579033
  • 2015年08月14日 16:54
  • 660
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IceSword&Rootkit Unhooker驱动简析
举报原因:
原因补充:

(最多只允许输入30个字)