SaKuLa 发表于 2016-9-25 21:03

DXF 模块扫描和动态CRC方法

本帖最后由 SaKuLa 于 2016-9-27 06:02 编辑



准备工具 CE OD 驱动



DNF模块和主应用加上VM段人物一些数据 其实没有这么大
DNF启动游戏完成之后会申请一段很大的内存镜像来存放关键模块的机器码之后不断的对比实时模块地址和申请的镜像地址机器码是否相等。
我们需要找出他的模块扫描

进入游戏开启CE访问任意模块+1000   列如tersafe.dll+1000



两个地址 TenSLX.dll+6DB55 - 66 3B 31            - cmp si, (0B3DDB55地址) 这个只是判断PE而已貌似没什么用
DNFBase.dll+1300AD7 - 8B 7D 08            - mov edi,(10c60ad7地址)这是我们需要的地址CE的不好看 我们用OD看看





核心汇编
10C60AD1    8B4D FC         mov ecx,dword ptr ss:   //要对比内存大小
10C60AD4    8B75 F4         mov esi,dword ptr ss:   //镜像地址
10C60AD7    8B7D 08         mov edi,dword ptr ss://实时模块地址
10C60ADA    F3:A6         repe cmps byte ptr es:,byte ptr ds:开始以byte 方式对比两个地址的机器码
.....下面的没看
从上面看 我们只需要把
10C60AD7    8B7D 08         mov edi,dword ptr ss:这句的汇编改成 mov edi,

让他镜像对比镜像那么它就无法检测出你修改了模块那个地方

下面开始说动态CRC
用od对00401000 下访问断点
直接断下了

这个就是动态扫静态地址 它会不断的变化地址估计难倒了好多人不能nop 不能ret 不是每次启动游戏只会变化一次那么我们要怎么搞死他呢?
我们先找到CRC的源头往堆栈看

   往下移动
就是这个地址了




关键地址 是在tersafe.dll内的一个地址 无需计较
0ABFDF4A    FFD1            call ecx   
0ABFDF4C    C745 FC FEFFFFF>mov dword ptr ss:,-0x2【返回到这个地方】


我们已知返回点 那么CALL ecx 就是关键点了   ECX就是CRC头子这个就是CRC启动的源头了由于能力有限并不能PJ出CRC是
怎样生成的 那么我只能列出一个死办法 让CRC变成固定的
   ecx=09C80295那么我们来看内存段


Memory map, 条目 131地址=09C80000 大小=00080000 (524288.)   当然每次断下call ecx ecx地址也会改变
我们把地址09C80000大小0x80000内的汇编全部拷贝到一个我们自己申请的镜像中

让源头CALL ecx   转向我们自己的镜像
那么CRC就变成了一个死的地址 不会改变内存 。
之后我们再一步一步的分析CRC是这么检测DNF的了 。好了教程就到这里
说到底个人能力有限不能把如何干掉CRC的源码写出来 ,我说了这么多还是希望大家能写出来源码
crc内 无非就是 两句movzx和一句mov 在访问DNF内存
你让CRC变成固定地址 之后自己访问内存就能找出来了、
如过第一种拷贝方法行不通那么我就再举个列子:
已知特征 8B 16 33 D6 83 C6 04 33 FA 48 0F 85
你不可能利用像ce那种东西搜索特征方式来获取地址 ,你扫到他的时候他就已经变了你要的是实时地址并且操作。
插入代码 :
模块那句call ecxhook到一个名last的地址 反正随便你们我只是举列子
last:
pushad
pushfd
xor cx,cx                                             //ecx=09C80295 在地址=09C80000 大小=00080000 内
sub esp,0xC                                          //初始化大小c的空间
mov byte ptr ss:,0x0000008B
mov byte ptr ss:,0x00000016
mov byte ptr ss:,0x00000033
mov byte ptr ss:,0x000000D6
mov byte ptr ss:,0x00000083
mov byte ptr ss:,0x000000C6
mov byte ptr ss:,0x00000004
mov byte ptr ss:,0x00000033
mov byte ptr ss:,0x000000FA
mov byte ptr ss:,0x00000048
mov byte ptr ss:,0x0000000F
mov byte ptr ss:,0x00000085   置入特征完成
mov ebx,dword ptr ss:      //自己体会以下的意思               
mov eax,dword ptr ds:      
label2:
cmp ebx,eax   
je label3
label1:
add ecx,0x1
mov eax,dword ptr ds:
jmp label2
label3:
mov eax,dword ptr ds:
cmp dword ptr ss:,eax
jnz label1
mov eax,dword ptr ds:
cmp dword ptr ss:,eax
jnz label1
add esp,0xC
nop
nop
nop
nop
nop
popfd
popad
call ecx
mov dword ptr ss:,-0x2
jmp 0ABFDF53







当代码执行到add esp,c 时候ecx就是crc的mov edx, 那句的地址 那么你取得地址

就可以从5个nop中插入自己的一个hook 对ecx地址进行操作了 最终返回到popfd 那句就行了当然楼主我读书少不会高级语言实现不了。{:6_221:} 还有两句movzx类型的这个我就不举列子了。




   






                                    

SaKuLa 发表于 2016-9-25 21:18

自古一楼归楼主

冇嚸ヤ坏忾ぺ 发表于 2016-9-25 21:48

谢谢分享...........

【By】岁月无痕 发表于 2016-9-25 22:04

膜拜大神,这么牛逼

放开那头母牛 发表于 2016-9-25 22:58

技术帖。。。。顶一个{:5_188:}

依然の默默 发表于 2016-9-26 00:21

隐藏的大牛啊膜拜

山海 发表于 2016-9-26 01:25

楼主和我前面的都是大牛(#Д)

Phantom_K12 发表于 2016-9-26 02:26

{:5_191:}大吊 厉害了

lingjin3 发表于 2016-9-26 10:13

厉害啊,学习一下

boom 发表于 2016-9-29 09:39

学习了 谢谢楼主分享
页: [1] 2 3
查看完整版本: DXF 模块扫描和动态CRC方法