z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
阅读:5643回复:20

IceSword&Rootkit Unhooker驱动简析

楼主#
更多 发布于:2007-04-29 22:54
  下面的内容是我亲自分析所得,水平有限,如有错漏还望大家指出。也不知这里面有多少已经成为公开的秘密?
 
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的。

最新喜欢:

ljmworkljmwor... zhuwgzhuwg
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-04-30 10:22
对于IS或者DS::
inline hook ObOpenObjectByName
禁止打开ntos*.exe文件
和已经加载的FSD系统和Tcpip.sys.
另外为了防止ObCreateObject大法式打开文件在IRP_MJ_CREATE中也做处理~

对于那个RKU那个玩意,直接Zero掉DriverObject和DeviceObject,并断开那些链表。
最后就是KMSE,用ShadowWalker过滤个读比较简单~
没有战争就没有进步 X3工作组 为您提供最好的军火
xikug
驱动小牛
驱动小牛
  • 注册日期2001-09-25
  • 最后登录2013-09-27
  • 粉丝1
  • 关注0
  • 积分1001分
  • 威望169点
  • 贡献值0点
  • 好评度168点
  • 原创分1分
  • 专家分0分
板凳#
发布于:2007-04-30 11:17
引用第1楼killvxk2007-04-30 10:22发表的“”:
对于IS或者DS::
inline hook ObOpenObjectByName
禁止打开ntos*.exe文件
和已经加载的FSD系统和Tcpip.sys.
另外为了防止ObCreateObject大法式打开文件在IRP_MJ_CREATE中也做处理~
.......


邪恶。。。
http://www.debugman.com
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-30 12:43
还有谁?~
直接Disk的那个也可以过滤~哼哼哈嘿~
用更邪恶的~
没有战争就没有进步 X3工作组 为您提供最好的军火
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-04-30 16:40
killvxk是一贯走邪恶路线啊,哈哈,俺还是更喜欢做得神不知鬼不觉,装死:)
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
5楼#
发布于:2007-04-30 16:47
disk low-level i/o bypassing做好的话什么winhex,filereg,rku,rootkitrevealer...统统拿下
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
6楼#
发布于:2007-04-30 21:30
disk low i/o 可以完全不走Windows的驱动体系~
没有战争就没有进步 X3工作组 为您提供最好的军火
uuuty
驱动牛犊
驱动牛犊
  • 注册日期2005-02-04
  • 最后登录2010-09-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望25点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-30 21:34
io port读硬盘
试了效果还不错
只是不通用....
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2007-04-30 21:45
自然不是io port,而是另外的方法~
没有战争就没有进步 X3工作组 为您提供最好的军火
uuuty
驱动牛犊
驱动牛犊
  • 注册日期2005-02-04
  • 最后登录2010-09-15
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望25点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-04-30 21:51
再给说说贝....
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-05-06 08:36
分析的真好,原理讲的真清楚.拜一个.
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2007-05-07 12:56
不直接IO的话,你少不了要发IRP的或其他数据包的,不管你发给谁,难免不给HOOK,困难啊......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2007-05-07 12:58
引用第1楼killvxk2007-04-30 10:22发表的“”:
对于IS或者DS::
inline hook ObOpenObjectByName
禁止打开ntos*.exe文件
和已经加载的FSD系统和Tcpip.sys.
另外为了防止ObCreateObject大法式打开文件在IRP_MJ_CREATE中也做处理~
.......

DS使用内建的文件系统,来读写所有系统文件,应该不受HOOK影响的.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
13楼#
发布于:2007-05-07 14:32
引用第12楼wowocock2007-05-07 12:58发表的“”:

DS使用内建的文件系统,来读写所有系统文件,应该不受HOOK影响的.


改下文件系统名称,你内建能行么??
识别不了吧~~哈哈~~
没有战争就没有进步 X3工作组 为您提供最好的军火
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
14楼#
发布于:2007-05-07 14:54
改下文件系统名称??什么意思??我们实现自己的MINI OS来处理系统,除非你用自己的文件系统,如果是标准的文件系统应该没问题的。当然目前公开的DS版本由于基本垃圾,就没什么好说的了。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
15楼#
发布于:2007-05-07 16:56
引用第14楼wowocock2007-05-07 14:54发表的“”:
改下文件系统名称??什么意思??我们实现自己的MINI OS来处理系统,除非你用自己的文件系统,如果是标准的文件系统应该没问题的。当然目前公开的DS版本由于基本垃圾,就没什么好说的了。。。。



老v的意思是把文件系统的标识改掉.hehe
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
16楼#
发布于:2007-05-09 22:55
还是想知道不走驱动体系的做法,哪位給说说呗....
wangjianfeng
驱动小牛
驱动小牛
  • 注册日期2004-05-28
  • 最后登录2013-10-02
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望263点
  • 贡献值0点
  • 好评度260点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-05-10 09:00
MINIOS恐怖.
qiweixue
驱动小牛
驱动小牛
  • 注册日期2004-07-21
  • 最后登录2011-12-19
  • 粉丝0
  • 关注0
  • 积分1006分
  • 威望274点
  • 贡献值0点
  • 好评度268点
  • 原创分1分
  • 专家分0分
18楼#
发布于:2007-05-11 11:51
楼上的几位真是少见的BT行为
俺来凑凑热闹学学习....
z.b.Azy
驱动牛犊
驱动牛犊
  • 注册日期2006-03-11
  • 最后登录2013-04-29
  • 粉丝0
  • 关注0
  • 积分263分
  • 威望95点
  • 贡献值0点
  • 好评度91点
  • 原创分2分
  • 专家分0分
19楼#
发布于:2007-05-11 22:31
Share your old stuff, keep your good stuff.
上一页
游客

返回顶部