ak922.sys分析

来源:互联网 发布:java 批量 ping ip 编辑:程序博客网 时间:2024/04/18 23:45

-*- begin -*-
 
这是一个 C 语言编写的驱动级的 rootkit 程序。这个驱动可以隐藏名为 AK922.SYS 的文件。

 

该驱动加载后首先获取 nt!IofCompleteRequest 函数的地址。以及在 kpeb 中定位进程名的偏移。之后,该驱动会依次完成以下操作:

 

1、通过 nt!ObReferenceObjectByName 打开磁盘驱动 /Driver/Disk,并遍历该驱动创建的所有设备对象,该驱动会保存 Disk 创建的名字以 '/DR' 开头并且类型为磁盘设备类型的设备对象指针,最多可以存 8 个设备对象指针。该驱动记录这些设备对象的地址用来在将来进行文件隐藏操作时用。

2、创建一个名为 /Device/AzyKit922 的设备,目前截获的版本没有创建符号链接,或许以后的版本会进行创建符号连接以便可以通过用户态程序控制来灵活地控制要隐藏的文件。

 

3、设置 irp 处理回调以及卸载驱动的回调例程。

 

4、通过把 nt!IofCompleteRequest 函数的入口前 6 个字节替换成 push hook_IofCompleteRequest / ret 实现对该函数的挂钩。该驱动对文件的隐藏操作全部在 nt!IofCompleteRequest 的钩子处理例程中完成。

 

完成上述操作后,该驱动会保存自身的驱动对象以及设备对象指针并返回成功给 i/o 管理器。当系统中发生的文件 i/o 操作完成时,rootkit 的钩子会被激活,并依次完成以下操作:

 

1、关闭可屏蔽中断。
2、对已经完成的 irp 进行修改来实现文件隐藏。
3、恢复 eflags 并跳回执行 nt!IofCompleteRequest 的原入口代码。

 

以下是 rootkit 实现文件隐藏的流程分析:

 

流程1、判断该 i/o 请求是否为 IRP_MJ_DIRECTORY_CONTROL,并且 MinorFunction 为 IRP_MN_QUERY_DIRECTORY。如果不是则转入下一个流程;如果是,则判断传入的请求结构类型,并查找文件系统返回的遍历结果,如果发现文件系统遍历到的结果为 'AK922.sys',则对结果进行修改(根据该结构在整个结构链中的位置决定是截断该链还是只断开一个节点)。

 

流程2、依次执行以下操作:
1、如果 i/o 请求不是 IRP_MJ_READ,则该 rootkit 不再进行处理,并直接返回。

 

2、检查传入的设备对象指针是否是之前保存的 8 个 /Driver/Disk 创建的设备对象之一,如果不是则不再进行处理,直接返回。

 

3、判断是否当前在 system 进程下运行,如果是则直接返回。

 

4、检查当前的 irql,如果不在 DISPATCH_LEVEL 则直接返回不进行下一步处理。

 

5、排队一个 WorkItem 来对磁盘驱动读出的 AK922.SYS 文件记录的元数据进行修改实现磁盘级的隐藏。

 

该驱动隐藏的文件可以躲过目前绝大多数安全检测工具,包括类似 WinHex 的基于磁盘分区格式遍历的工具。

原创粉丝点击