首页
社区
课程
招聘
[原创]【抛砖引玉,但是我是玉】一个可以通杀EAC-CR3保护的猜想
2023-8-16 17:03 18506

[原创]【抛砖引玉,但是我是玉】一个可以通杀EAC-CR3保护的猜想

2023-8-16 17:03
18506

众所周知宇宙第一AntiCheat——EasyAntiCheat前段时间在RustClient.exe上部署了假cr3


消息来源:UC新闻网


unknowncheats.me/forum/anti-cheat-bypass/580783-article-unleashing-secrets-easyanticheat-cr3-protection.html


[News] Easy Anti-Cheat CR3 Trashing (unknowncheats.me)


Unleashing the Secrets: EasyAntiCheat’s CR3 Protection :: AVX's Blog (advancedvectorextensions.github.io)


不知道具体原理的这里给大伙儿省个流:


1、偷指针,接管整个系统的异常处理

InternalData = HalpTimerGetInternalData( Timer );
Rax = ( *( __int64 ( __fastcall ** )( __int64 ) )( Timer + 0x70 ) )( InternalData );


2、给EPROCESS.DirectoryTableBase写非法数值,让这个值在SwapContext写入cr3时发生#GP异常


3、接管#GP异常,恢复真实cr3,从异常中恢复



大手子们针对EAC也是八仙过海各显神通




有尝试暴力还原代码手动解密数据的:


[Coding] eac new cr3 decryption routine (unknowncheats.me)


有插NMI的:


[Coding] EAC Decrypted CR3 Method using NMIs & KPRCBs (unknowncheats.me)



那么有没有更简单的无需更新的通杀方法呢?



拜读前辈的文章后我们得知,cr3对应的物理地址在MmPfnDatabase中的表项MMPFN.ListEntry,其实就是加密后的EPROCESS:


win10 1909逆向(通过任意物理帧判断是否是CR3和解密得到所属EPROCESS)-软件逆向-看雪-安全社区|安全招聘|kanxue.com


那么我们是不是可以遍历整个MmPfnDatabase,判断其中的MMPFN.ListEntry是否是游戏的EPROCESS,如果是,岂不是就可以从MMPFN反推出CR3对应的物理地址了?


半分钟随便乱写的伪代码(不保真):

ULONG_PTR  ULONG_PTR = 0;
for(auto i = 0; i < MmPfnDatabaseSize; ++i)
{
  if(  DecryptEProcess(MmPfnDatabase[i]) == TargetGameEProcess)
  {
    RealDirectoryTableBase =  (ULONG_PTR)i << 12ull;
  }
}



[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2023-8-16 17:04 被hzqst编辑 ,原因:
收藏
点赞13
打赏
分享
打赏 + 280.00雪花
打赏次数 2 雪花 + 280.00
 
赞赏  铭濠笙科技   +80.00 2023/09/17
赞赏  铭濠笙科技   +200.00 2023/09/17
最新回复 (22)
雪    币: 1505
活跃值: (3199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hkdong 2023-8-16 17:10
2
1
大手子,你好
雪    币: 5879
活跃值: (4467)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
淡然他徒弟 1 2023-8-16 17:12
3
4
等会5e的就来给你点赞了。
雪    币: 6124
活跃值: (4081)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2023-8-16 17:13
4
0
鉴定为真
雪    币: 3126
活跃值: (3578)
能力值: ( LV8,RANK:158 )
在线值:
发帖
回帖
粉丝
cslime 2 2023-8-16 19:08
5
0

我之前有过一个在内存取证的情境下的思路大致是这样


dtb所在的pfndata的pteaddr是可以被计算出来的

先根据dtb_pteaddr,KUSER_SHARED_DATA,PTE_BASE,MmPfnDataBase的地址作为特征暴力遍历所有可能的dtb,判断dtb内存映射里有没有出现GameProcess.SectionBase,判断内存中的pe头特征是否和磁盘中的pe头特征相同,或者也可以搜索游戏exe里的一个固定的特征码


pte_base_pml4_index=va(pte_base).pml4e_index
dtb_pteaddr=pxe_base+pte_base_pml4_index*8

for pfndata in MmPfnDataBase:
	if pfndata.pteaddr == dtb_pteaddr
		dtb_vma=vma(pfnaddr.physaddr)
		if dtb_vma.checkva(MmPfnDataBase) and readphys_int64array(pfndata.physaddr)[pte_base_pml4_index].valid() and dtb_vma.checkusershareddata()
			if dtb_vma.checkva(gameproc.sectionbase):
				pe = parsepe(dtb_vma,gameproc.sectionbase)
				if pe.checksum == gamefile.checksum:
					print("dtb = {}".format(pfndata.physaddr));
					exit()					
					


最后于 2023-8-16 21:38 被cslime编辑 ,原因: 优化描述
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2023-8-17 11:54
6
0
你这代码保熟不?
雪    币: 1119
活跃值: (2029)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
DiamondH 2023-8-17 14:28
7
0
niubi
雪    币: 1353
活跃值: (2246)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
恒大 2023-8-17 18:07
8
0
雪    币: 19431
活跃值: (29097)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-8-18 09:24
9
1
感谢分享
雪    币: 660
活跃值: (1430)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
lwl 2023-8-18 09:38
10
0
其实系统有默认的回调会记录APP启动的信息,直接取就行了。
雪    币: 258
活跃值: (1751)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
劫局丶 2023-8-18 10:15
11
0
有内鬼,终止交易
雪    币: 961
活跃值: (4972)
能力值: ( LV12,RANK:297 )
在线值:
发帖
回帖
粉丝
L0x1c 3 2023-8-18 10:23
12
0
有内鬼,终止交易
雪    币: 3096
活跃值: (2444)
能力值: ( LV8,RANK:147 )
在线值:
发帖
回帖
粉丝
Roger 1 2023-8-18 17:58
13
1
淡然他徒弟 等会5e的就来给你点赞了。
mark
雪    币: 1792
活跃值: (5199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PEDIY 2023-8-19 06:30
14
1

毛茸茸又软和的大黄也有谦虚地喊“前辈”的时候啊, 哈哈

雪    币: 1703
活跃值: (4340)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Oxygen1a1 2023-8-19 08:44
15
0
大表哥牛逼,顺便问下如果直接附加,此时__readcr3不是也能取出正确的cr3吗?附加一次总不会被橄榄吧
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2023-8-19 11:40
16
1
Oxygen1a1 大表哥牛逼,顺便问下如果直接附加,此时__readcr3不是也能取出正确的cr3吗?附加一次总不会被橄榄吧
1、attach的writecr3会被异常处理捕获,想死号就尽管attach
2、人家是DMA
雪    币: 46
活跃值: (1595)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cheating 2023-8-19 14:07
17
0
我想知道人家是什么时刻把cr3改成非法的,在进程回调那里就改了?,大表哥能说一下不,哈哈。
雪    币: 12
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
clestor 2023-8-19 18:01
18
0
InfinityHook:这个我熟
雪    币: 1792
活跃值: (5199)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PEDIY 2023-8-20 18:05
19
1
clestor InfinityHook:这个我熟

胆敢窃取楼主本尊照片, 当头像!

最后于 2023-8-20 23:18 被PEDIY编辑 ,原因:
雪    币: 218
活跃值: (1674)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
麦瑞鸭 2023-9-12 01:00
20
0
如果应用层拿到读写权限,调用应用层函数读写应该就能绕过,这种保护似乎只能靠判断rip来过滤
雪    币: 1874
活跃值: (1621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
跳舞和kiss 2024-2-7 08:58
21
0
真牛逼,大佬开班吧
雪    币: 155
活跃值: (411)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mb_zdkihfht 2024-3-17 19:59
22
0
我真的在学
雪    币: 1812
活跃值: (4075)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Grav1ty 2024-3-17 21:26
23
0
怪不得最近挂哥变多了
游客
登录 | 注册 方可回帖
返回