首页
社区
课程
招聘
[原创]基于PMI实现对读写行为检测
发表于: 2022-10-1 07:46 22636

[原创]基于PMI实现对读写行为检测

2022-10-1 07:46
22636

这几天分析某驱动样本发现几种检测读写的方法,就有意思的一种和大家分享。

使用CPU提供的性能监视(PM)功能,
对内存读写时的关键挂靠函数(KeStackAttachProcess, KeAttachProcess)实现了一种类似hook的技术。
通过监视调用情况,来判断进程内存是否被读取。

关于处理器的性能监视功能,不同的处理器架构都有差异,可以参考白皮书。
或者这个翻译的帖子:https://www.codenong.com/cs106475009/

大致原理:
设置ICACHE_MISS类型的监视事件开启性能监视功能。
当L1指令高速缓存未命中次数达到溢出值时,触发PM中断,执行样本注册的PMI回调函数。
在回调函数中判断中断的位置是否处于监视函数代码的序言部分(这样才能获取到正确的调用参数),
如果处于那么通过调用参数判断挂靠的目标进程是否为被保护的进程,进而记录下调用信息。
不处于则使用clflush或clflushopt指令使监视函数代码从缓存中失效,以提高下次被中断到的概率。

下面是详细的流程:

通过cpuid的0号功能来判断处理器是不是intel(看代码样本尚未支持amd)。

Cupid的a号功能判断处理器是否支持版本2以上的性能监视功能

单个核心是否支持4个以上的计数器

是否支持clflush指令,并且处理器是否支持ICACHE_MISS类型的监视事件

解析nt模块的导出表得到两个监视函数地址,并解析异常表得到两个监视函数的序言部分的大小(SizeOfProlog),应该是为了兼容不同系统的做法。

获取nt模块导出的HalDispatchTable地址,这是hal提供的一张函数地址表。
调用其中的hal!HalpSetSystemInformation并指定HalProfileSourceInterruptHandler来注册自己的PMI回调函数。
其中的foo就是注册的回调函数地址。

样本使用Windows提供的接口来注册回调函数,当然也可以通过配置IA32_X2APIC_LVT_PMI寄存器来指定PMI发生时的中断向量号。
Windows系统中配置的向量号是0xfe。

中断历程实际是_KINTERRUPT.ServiceRoutine字段指向的函数:hal!HalpPerfInterrupt
而这个函数很简单就是逐个调用hal!HalpPerfInterruptHandler中注册的PMI回调函数。

所以hal!HalpSetSystemInformation的作用很简单就是指定的foo参数设置到HalpPerfInterruptHandler中。

开启参数中CounterMode_0指明计数器的类型(固定用途、通用),当然样本只用到了通用的性能监视计数器。
CtrxIndex_4是每个处理器核心中开启的计数器的索引。
EVESEL_8是选择的性能监视事件,也就是在一开始提到的ICACHE_MISS类型。
CtrCount_C是计数值,这个参数直接决定了PMI发生的频率,计数值越低,频率越高,当然中断到监视函数的概率也越高。

开启前保证计数器处于停止状态

重置指定计数器的计数值

选择监视事件

开启性能监视

样本注册的回调函数为PMICallBackMode0_140058d40,唯一的参数是_KTRAP_FRAME,记录了发生中断的寄存器环境

通过_KTRAP_FRAME,可以拿到发生中断的地址,用来判断是否命中监视函数的序言部分。

如果命中,进而判断是否挂靠指定进程。

如果未命中,将定时使用clflush或clflushopt指令让监视函数代码从缓存中失效


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-10-1 07:49 被晚安玛卡巴卡编辑 ,原因:
上传的附件:
收藏
免费 18
支持
分享
最新回复 (22)
雪    币: 9
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
太牛了,理论上所有的读写方式都可以被检测到了
但是如果你自己构建序言部分再跳到系统函数,这种检测是不是就被bypass了
2022-10-1 10:34
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
3

牛的,这种思路能拿来反作弊,好卷

最后于 2022-10-1 11:09 被はつゆき编辑 ,原因:
2022-10-1 11:08
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
经典tvm
2022-10-1 12:17
0
雪    币: 6172
活跃值: (4952)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
5
经典ACE_BASE
2022-10-1 16:31
0
雪    币: 6124
活跃值: (4671)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
经典偷偷人
2022-10-6 06:38
0
雪    币: 178
活跃值: (1278)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
完美公司的CSGO 可能会爆锤你
2022-10-6 19:15
0
雪    币: 6172
活跃值: (4952)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
8
hackflame 完美公司的CSGO 可能会爆锤你
完美说 好偷!
2022-10-6 22:59
0
雪    币: 193
活跃值: (532)
能力值: ( LV2,RANK:16 )
在线值:
发帖
回帖
粉丝
9
hackflame 完美公司的CSGO 可能会爆锤你
2022-10-7 05:37
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
10
你说的就是git 上面跟这个类似
https://github.com/KelvinMsft/PerfMon/tree/3282309cecf878148ac4e8d4ec0cc31db00ae18c 
这玩意局限性还是很强的,另外还能在intel 中断IDT 第XX个进行IDT HOOK,PG不存在着的因为那个是intel cpu 注册的
2022-10-8 17:05
0
雪    币: 193
活跃值: (532)
能力值: ( LV2,RANK:16 )
在线值:
发帖
回帖
粉丝
11
viphack 你说的就是git 上面跟这个类似 https://github.com/KelvinMsft/PerfMon/tree/3282309cecf878148ac4e8d4ec0cc31db00ae18 ...
嗯,看了代码确实原理大差不差
当时分析的当时没找着详细的资料代码,原来前辈几年前就开始玩了
感谢指出,学习了
2022-10-8 19:42
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
12
viphack 你说的就是git 上面跟这个类似 https://github.com/KelvinMsft/PerfMon/tree/3282309cecf878148ac4e8d4ec0cc31db00ae18 ...
不懂就问,为什么idt hook不会pg?
2022-10-8 20:13
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
13
はつゆき 不懂就问,为什么idt hook不会pg?
IDT 有个保护范围的,不是全部 对象都在列表的,并不是说IDT hook不会引起PG
2022-10-9 10:53
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
14
晚安玛卡巴卡 嗯,看了代码确实原理大差不差 当时分析的当时没找着详细的资料代码,原来前辈几年前就开始玩了 感谢指出,学习了[em_13]
你可以看看CE的ultimap2,另外微软的PT项目也可以看看,这几个项目都被人魔改虚拟机脱壳了,什么监控读写都是小儿科的,利用PT来搞页面劫持才刺激,任何CRC在PT面前都是渣渣,关键不需要启用EPT扩展
2022-10-9 10:57
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
15
viphack IDT 有个保护范围的,不是全部 对象都在列表的,并不是说IDT hook不会引起PG
你指的是pg只扫了一部分,没有扫整个idt?
2022-10-9 12:11
0
雪    币: 2247
活跃值: (3792)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
16
666
2022-10-10 00:01
0
雪    币: 996
活跃值: (1443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17

没有最强只有更强

最后于 2022-10-10 12:22 被eroy编辑 ,原因:
2022-10-10 12:06
0
雪    币: 2428
活跃值: (2586)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
viphack 你可以看看CE的ultimap2,另外微软的PT项目也可以看看,这几个项目都被人魔改虚拟机脱壳了,什么监控读写都是小儿科的,利用PT来搞页面劫持才刺激,任何CRC在PT面前都是渣渣,关键不需要启用EP ...
请问PT项目是指?
2022-10-11 17:42
0
雪    币: 6552
活跃值: (4346)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
19
dearfuture 请问PT项目是指?
可能是PTE给假表的意思
2022-10-11 17:50
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
viphack 你可以看看CE的ultimap2,另外微软的PT项目也可以看看,这几个项目都被人魔改虚拟机脱壳了,什么监控读写都是小儿科的,利用PT来搞页面劫持才刺激,任何CRC在PT面前都是渣渣,关键不需要启用EP ...
请问PT项目的全称是啥?有连接不?
2022-10-17 09:30
0
雪    币: 0
活跃值: (236)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
viphack 你说的就是git 上面跟这个类似 https://github.com/KelvinMsft/PerfMon/tree/3282309cecf878148ac4e8d4ec0cc31db00ae18 ...
哈哈哈 KelvinMsft
2023-4-17 21:50
0
雪    币: 1558
活跃值: (3460)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
caolinkai 请问PT项目的全称是啥?有连接不?
https://github.com/intelpt/WindowsIntelPT
https://bbs.kanxue.com/thread-266903.htm
2023-8-19 08:23
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
qj111111 https://github.com/intelpt/WindowsIntelPT https://bbs.kanxue.com/thread-266903.htm
感谢
2024-4-7 18:13
0
游客
登录 | 注册 方可回帖
返回
//