这个驱动本来准备端午节搞的,但后来端午节去了躺北京玩了几天,也就搁置了...最近连续花了4个晚上,大致把它搞的差不多了,有些收获...初学 window驱动,水平很菜,有些东西我也未必清明,加上3环的代码还没有吃透,期间也没有用调试器跟踪,全是IDA(F5)静态分析的,谬误在所难免, 高手请飘过,希望对菜鸟学习有点帮助.
1.SSDT检测
这个功能有三个IoControlCode与之对应,他们分别是22000fh(拷贝KeServiceDescriptorTable); 220007h(拷贝KeServiceDescriptorTable->ServiceTable);22000bh(恢复一个 ssdt hook),这个功能目前还不具备检测和恢复inline hook的功能
2.Shadow SSDT检测
这个功能实现和SSDT差不多,都是从KeSystemServiceDescriptorTableShadow入手,不过3环需要为每个平台配置一张函数名表(ssdt可以不配置函数名表,可以从ntdll.dll中收集),详细文章可以参见zhuwg兄弟写的<<shadow ssdt 学习笔记>>一文
3.进程
3.1 进程检测
IoControlCode是22001Bh,在检测之前会设置检测方式,然后根据检测方式进行检测.这个功能主要由 irp_mj_device_control_dispatch_function函数的is_22001Bh_list_process分支完成,这里集成了4种检测方法,大致如下:
3.1.1 基于PspCidTalbe的检测,这里rku对句柄表做了解析,对每个Object判定是不是EPROCESS,是则插入到输出列表 (icesword也有这中检测,不过在1.22中没有解析句柄表,而是用ExEnumHandleTable搞定这些) 详细代码见 list_process_in_2k_by_handle_table/list_process_in_not_2k_by_handl
1.SSDT检测
这个功能有三个IoControlCode与之对应,他们分别是22000fh(拷贝KeServiceDescriptorTable); 220007h(拷贝KeServiceDescriptorTable->ServiceTable);22000bh(恢复一个 ssdt hook),这个功能目前还不具备检测和恢复inline hook的功能
2.Shadow SSDT检测
这个功能实现和SSDT差不多,都是从KeSystemServiceDescriptorTableShadow入手,不过3环需要为每个平台配置一张函数名表(ssdt可以不配置函数名表,可以从ntdll.dll中收集),详细文章可以参见zhuwg兄弟写的<<shadow ssdt 学习笔记>>一文
3.进程
3.1 进程检测
IoControlCode是22001Bh,在检测之前会设置检测方式,然后根据检测方式进行检测.这个功能主要由 irp_mj_device_control_dispatch_function函数的is_22001Bh_list_process分支完成,这里集成了4种检测方法,大致如下:
3.1.1 基于PspCidTalbe的检测,这里rku对句柄表做了解析,对每个Object判定是不是EPROCESS,是则插入到输出列表 (icesword也有这中检测,不过在1.22中没有解析句柄表,而是用ExEnumHandleTable搞定这些) 详细代码见 list_process_in_2k_by_handle_table/list_process_in_not_2k_by_handl