首页 > 网吧技术 > 进阶殿堂 > IceSword&Rootkit Unhooker驱动简析 订阅

IceSword&Rootkit Unhooker驱动简析

网络  2009年12月02日 13:27  小丸子      网吧技术群5 68896292
网吧技术群6 106313076 网吧技术群7 106313196 网吧技术群8 106313272 更多
5258网吧主页 百台机器每月收入100+ http://lm.5258.net/

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都白扯。

Tag: IceSword

分享收藏到: 新浪ViVi 365Key网摘 和讯网摘 Google书签 Windows Live Del.icio.us Yahoo书签 提交新发现,Dig it 添加到百度搜藏 收藏此页到纯我网 收進你的MyShare個人書籤
RSS订阅】 
现在有人对本文发表评论
评价:
表情: 
匿名发表
相关文章