背景
很早之前就已经分析过一遍,一直放在。今天突然又看到了,放着也是放着,索性拿出来分享一下,很多东西的细节省略了,这里只是谈及用到了什么技术,具体细节需要自己去学习;这里的版本是22-03-14,时间比较久了,有些可能说的不全,可能和你的分析有差别,以你的为准。
分析
为了方便描述,这里就从驱动入口开始,去掉敏感信息,初始化MJ函数。之后初始化了一个事件。后面会创建了一个符号连接,之后会提到。
这样就有了两个符号连接,这里称为A和B,A是用来初始化的,B是用来获取各个信息。来看看A中有什么东西(通信数据被加密,可逆,这里省略),内容很多,挑感兴趣的说一下。
反调试
每次通信时会检测的东西,前提是打开反调试。获取debugport、检测peb、queryprocess 1f、ticketcount是否大于5000,检测到之后结束被调试的进程
顺便分离内核调试
初始化各种数据
api初始化,获取各个函数的地址
ssdt/shadowssdt、pagelist、gTimerHashTable、lasspid、crsspid、以及win32k的某些偏移(对窗口、绘制等东西不熟,所以这里获取到的某些结构,我也不知道是什么)、ptebase等一些数据。
获取物理内存的使用和vad的偏移,以及获取ssdt表的各个函数
初始化系统线程,每十秒执行一次
枚举受保护进程的FreezeCount
20一次的枚举debugport、threadhinden、检测内核线程、以及和时间相关的东西
30s一次的内核调试器分离,vm代码中有SharUserData的相关检测、以及KdRefreshDebuggerNotPresent,检测到bugcheck蓝屏
其他功能
进程、线程、dll回调、ob都注册了,看看检测了什么东西。
时间检测
vt和SharUserData检测
mapping检测
shellcode检测,和mdl有关,这里先看一看
一些不常见检测
intelPT和nmi中断相关的blog在分析之后也看到过,不过比我当时分析的更详细,更具体,这里简单描述一下,这两个功能的目的都是中断下来检测当前的rip是否在收保护的进程中操作,如果是这里会保存下来,给你标记下来。
https://bbs.pediy.com/thread-273980.htm
https://bbs.pediy.com/thread-274613.htm
hook 0e是的,它真的还在,不过做的方式是替换页表,而且在kpti开启的情况下会蓝屏,具体可以参考看雪的blog,这里就是给一个假的cr3,记录访问这个cr3的进程,好消息是17763不支持(难道是有什么难言之隐,就算没有,也只有在不支持内核页表隔离的系统上跑)
MiTrackPtesAborted、MiDeadPteTrackerSListHead、MmTrackPtes mdlmapping映射检测,简单来说就是当mapp结束之后会插入到MiDeadPteTrackerSListHead链表,这里会开一个线程去检测这里面的数据
其他地方的线程暂停检测
检测线程的栈信息
当前计算机信息收集获取ataport.sys、storport.sys、CLASSPNP.sys、ndis、scsi等一些计算机网络、串口、文件的驱动,调用他们并获取计算机的信息,这里需要注意的是只支持19041一下的版本,瞧不起我19041以上的用户?这里的信息可以通过符号路径B获取到对应的数据
还有很多接口,这里就不一一列举了。
符号链接B的接口
这里也列举几个有意思的接口,其中有几个可以利用的接口,mdlread,以及内核内存读,这里没有写。
以及很多接口
这里选两个受害者出来看看,第一个是取消apc,通过将ethread下的SchedulerApc直接ret的方式取消apc的调用
第二个是调整当前进程的vad属性,参考blog可以看看。
其实里面还有很多内容,有兴趣的可以自己去学习学习。