首页
社区
课程
招聘
[原创]浅析RING3层的CRC
发表于: 2016-7-28 14:11 15705

[原创]浅析RING3层的CRC

2016-7-28 14:11
15705

浅析RING3层 的CRC
作者:东京好嗨冷
早期的CRC校验可能是单线程的
这种模型可以分成两种类型
跨进程的校验
通过OpenProcess、ReadProcessMemory、VirtualQueryEx等函数来校验代码
本进程的校验
通过汇编直接操作底层来校验代码,但这里可能还是需要用到一些API函数比如:GetModuleHandle、IsBadReadPtr
这些函数都是可以做文章的
早期的Anti可以是挂起线程,在线程中插入无限Sleep
但经过发展,CRC变成了多线程的校验,线程与线程之间互相校验代码,以及VM,与主线程通讯达到防止挂起
Anti有下面三种模型(为了增加逼格,起个洋名吧)
1)干(Fxck)

2)欺骗(Cheat)


(ID:核心未拥有 补充)
假设原执行流程的代码CRC值是A,篡改内存后的代码CRC值是B
想办法把A变成B就可以达到Anti的效果

校验线程存取原始内存CRC值的方法
1.与进程文件对比
直接修改文件的方式达到修改代码,或者Hook CreatFile 给个假文件
2.与第一次算出的值对比
在CreateProcess的时候挂起进程,然后修改代码,恢复进程
此时CRC线程进行第一次计算的值就会变成已经篡改后的代码值了
3.与服务器对比

3)绕(Reload)


CRC只对某片特定的代码或整片代码进行校验,但是通过改变原代码的执行流程就可以达到Anti的效果
不管这里通过什么方式来转移执行流程,最后能达到上图所述的效果,即可Anti
这里我将介绍几种玩法
1)通过异常中断机制转移执行流程
1.硬件断点
2.VEH
3.UEH
4.调试器附加
2)在未被CRC校验的代码处转移执行流程
1.直接HOOK
2.虚函数HOOK
替换整个虚函数表或替换指向该函数的地址
其实这种HOOK构造的原理就是基于call dword ptr ds:[eax]
当然,举一反三,只要有jmp dword ptr ds:[xxxxxx] 或者 call dword ptr ds:[xxxxxx],就可以构造这类型的HOOK
3.栈劫持
在原执行流程处的某个必经过的函数中HOOK,然后修改栈中的返回地址
这样的玩法又可以衍生出新的玩法
1)在API函数中修改栈的返回地址
在API HOOK中判断调用来源,然后对应修改返回地址.
2)虚函数HOOK与栈劫持结合
在必经过的虚函数调用中HOOK,然后修改返回地址
4.循环劫持
在进程中任意一个循环结构中转移执行流程。这种劫持方法基于的原理是相对寻址。因为在备份内存的时候,像JMP这种指令都是相对寻址的,也就是说,在原循环中跳到备份的循环中,会让指令一直在那个备份的循环中执行。怎么利用这种模型呢,比如WIN32程序中的消息循环,可以在GetMessage、TranslateMessage和DispatchMessage中HOOK并修改栈中的返回地址,转移到备份的循环中,然后还原HOOK。当然这种利用的方法不限于消息循环。
5.进程重载

方法不限于以上几种,欢迎补充
转移执行流程的方法可以相互结合,原则是越隐蔽越好,越干净越好,当然时机非常重要,时机掌握好,可以玩出新玩法

Anti Reload
针对大区域的内存Reload,可以通过特征码来查和检查栈中的返回地址是否合法(插桩)
针对局部的Reload,直接检测转移的那个点吧
检查栈的方法会比较好,隐蔽性较好,维护起来方便
当然能够做到随机动态插桩的话,就太妙了

方法太多了,主要还是要脑洞够大


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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 163
活跃值: (103)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
2
mark
2016-7-28 14:36
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
楼主 CRC 本地存取 可以说下
2016-7-28 14:58
0
雪    币: 405
活跃值: (1096)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
4
本地存取是?
2016-7-28 14:59
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
就是 校验某段代码对比值,是怎么存取的

排除那种上传服务器模式对比

就说本地存取的
2016-7-28 15:03
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那存取方式只是对不加壳的来说?

挂起的时候,都没解压

读取的都是没解压的

楼主对,棒子游戏的 themida 游戏

tx的TP加过壳的

怎么看
2016-7-28 17:16
0
雪    币: 405
活跃值: (1096)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
7
在还原内存后的入口点处修改内存,Patch的执行时机可以通过某个API HOOK
2016-7-28 18:37
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对某游戏双进程存在影子,这种也玄,要2个都和谐

如果在加壳就模拟加载吧重点的地方都记录了

就没效果了

这只是单单本地而已
2016-7-28 18:46
0
雪    币: 405
活跃值: (1096)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
9
每加入新的防护措施,又会出现新的薄弱的地方
2016-7-28 19:37
0
雪    币: 23
活跃值: (1481)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
TP在这方面 可真是用尽各种极端方法了
2016-7-28 19:37
0
雪    币: 333
活跃值: (161)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
mark
2016-7-28 21:23
0
雪    币: 30
活跃值: (1347)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
好东西!!!!
2016-7-29 11:39
0
雪    币: 324
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
楼主,咱们的注册日期差不多,怎么感觉逼格比我多这么多
2016-7-29 13:35
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
顶楼主..有些看不太明白!~~~
2016-7-31 20:45
0
雪    币: 78
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
Mark
感谢分享
2016-7-31 22:08
0
雪    币: 70
活跃值: (72)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
谢谢分享,Mark
2016-8-23 11:05
0
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
17
TP就算shadow那些api,某些东西他还是shadow不了的,32位进程有一个32位系统调用转64位的入口点,所有32位的ZwAPI都会经过那里,这是一个很好的hook点
2016-8-23 22:09
0
雪    币: 433
活跃值: (1930)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
18
说的特别特别透彻 但是那种线程扫一次变一次的地方怎么弄呢?
尽管看源码可以从全局变量入手,但是真的到今天都没想通哦..
或许hs被抛弃的原因就在这里?。。
2016-8-23 23:42
0
雪    币: 433
活跃值: (1930)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
19
那个函数不能hook?我记得x3就会crc那里哦
2016-8-24 00:44
0
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
20
用VT+EPT修改SharedUserData的内容应该可以吧,里面有个KiFastSystemCall的指针

我多此一举了。。都用VT了想干嘛就干嘛。。
2016-8-24 09:08
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark
2016-8-25 14:24
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
某游戏近期更新了检测   甚蛋疼  互相效验 通过 memcpy  memmove rtlmovememory 还有他自己的三个类似函数  随机启用效验t*nrpcs 和l*lbase 等   还有11个随机启用的crc效验 l*lbase 总之改了t*nrpcs 和l*lbase 就会非法  楼主对此有什么看法
2016-8-25 14:57
0
雪    币: 12857
活跃值: (9172)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
23
听说VT+EPT可以pass掉这种内存校验
2016-8-25 18:51
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
但是不支持VT的机子 那就蛋疼了..   兼容是个问题
2016-8-25 22:53
0
雪    币: 212
活跃值: (1054)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
请问解决了?我也遇见了这个问题,而且发现会用x64函数拷贝内存
2016-9-21 04:06
0
游客
登录 | 注册 方可回帖
返回
//