|
本帖最后由 SaKuLa 于 2016-9-27 06:02 编辑
准备工具 CE OD 驱动
DNF模块和主应用加上VM段人物一些数据 其实没有这么大
DNF启动游戏完成之后会申请一段很大的内存镜像来存放关键模块的机器码之后不断的对比实时模块地址和申请的镜像地址机器码是否相等。
我们需要找出他的模块扫描
进入游戏开启CE访问任意模块+1000 列如tersafe.dll+1000
两个地址 TenSLX.dll+6DB55 - 66 3B 31 - cmp si,[ecx] (0B3DDB55地址) 这个只是判断PE而已貌似没什么用
DNFBase.dll+1300AD7 - 8B 7D 08 - mov edi,[ebp+08] (10c60ad7地址) 这是我们需要的地址 CE的不好看 我们用OD看看
核心汇编
10C60AD1 8B4D FC mov ecx,dword ptr ss:[ebp-0x4] //[ebp-4]要对比内存大小
10C60AD4 8B75 F4 mov esi,dword ptr ss:[ebp-0xC] //镜像地址
10C60AD7 8B7D 08 mov edi,dword ptr ss:[ebp+0x8] //实时模块地址
10C60ADA F3:A6 repe cmps byte ptr es:[edi],byte ptr ds:[esi] 开始以byte 方式对比两个地址的机器码
.....下面的没看
从上面看 我们只需要把
10C60AD7 8B7D 08 mov edi,dword ptr ss:[ebp+0x8]这句的汇编改成 mov edi,[ebp-c]
让他镜像对比镜像那么它就无法检测出你修改了模块那个地方
下面开始说动态CRC
用od对00401000 下访问断点
直接断下了
这个就是动态扫静态地址 它会不断的变化地址估计难倒了好多人不能nop 不能ret 不是每次启动游戏只会变化一次那么我们要怎么搞死他呢?
我们先找到CRC的源头 往堆栈看
往下移动
就是这个地址了
关键地址 是在tersafe.dll内的一个地址 无需计较
0ABFDF4A FFD1 call ecx
0ABFDF4C C745 FC FEFFFFF>mov dword ptr ss:[ebp-0x4],-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 ecx hook到一个名last的地址 反正随便你们我只是举列子
last:
pushad
pushfd
xor cx,cx //ecx=09C80295 在地址=09C80000 大小=00080000 内
sub esp,0xC //初始化大小c的空间
mov byte ptr ss:[esp],0x0000008B
mov byte ptr ss:[esp+0x1],0x00000016
mov byte ptr ss:[esp+0x2],0x00000033
mov byte ptr ss:[esp+0x3],0x000000D6
mov byte ptr ss:[esp+0x4],0x00000083
mov byte ptr ss:[esp+0x5],0x000000C6
mov byte ptr ss:[esp+0x6],0x00000004
mov byte ptr ss:[esp+0x7],0x00000033
mov byte ptr ss:[esp+0x8],0x000000FA
mov byte ptr ss:[esp+0x9],0x00000048
mov byte ptr ss:[esp+0xA],0x0000000F
mov byte ptr ss:[esp+0xB],0x00000085 置入特征完成
mov ebx,dword ptr ss:[esp] //自己体会以下的意思
mov eax,dword ptr ds:[ecx]
label2:
cmp ebx,eax
je label3
label1:
add ecx,0x1
mov eax,dword ptr ds:[ecx]
jmp label2
label3:
mov eax,dword ptr ds:[ecx+0x4]
cmp dword ptr ss:[esp+0x4],eax
jnz label1
mov eax,dword ptr ds:[ecx+0x8]
cmp dword ptr ss:[esp+0x8],eax
jnz label1
add esp,0xC
nop
nop
nop
nop
nop
popfd
popad
call ecx
mov dword ptr ss:[ebp-0x1],-0x2
jmp 0ABFDF53
当代码执行到add esp,c 时候ecx就是crc的mov edx,[esi] 那句的地址 那么你取得地址
就可以从5个nop中插入自己的一个hook 对ecx地址进行操作了 最终返回到popfd 那句就行了当然楼主我读书少不会高级语言实现不了。 还有两句movzx类型的这个我就不举列子了。
|
评分
-
参与人数 25 | 威望 +1 |
HB +61 |
THX +18 |
收起
理由
|
禽大师
| |
+ 1 |
|
|
lies
| |
+ 1 |
|
|
sjtkxy
| |
+ 1 |
+ 1 |
|
花盗睡鼠
| |
|
+ 1 |
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! |
虚心学习
| |
+ 1 |
|
[吾爱汇编论坛52HB.COM]-吃水不忘打井人,给个评分懂感恩! |
24567
| |
|
+ 1 |
|
zxjzzh
| |
|
+ 1 |
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! |
一路走来不容易
| |
|
+ 1 |
|
消逝的过去
| |
|
+ 1 |
|
xgbnapsua
| |
|
+ 1 |
|
叶落花开
| |
+ 2 |
|
|
jaunic
| |
|
+ 1 |
|
mengzhisuoliu
| |
+ 1 |
|
|
yhw5231
| |
+ 1 |
+ 1 |
厉害,楼主加油 |
fangssss
| |
+ 1 |
+ 1 |
[快捷评语] - 2018,狗年发发发,狗年旺旺旺! |
setosan
| |
+ 5 |
+ 1 |
[快捷评语] - 2017,让我们17学破解! |
Crook
| |
+ 5 |
+ 1 |
写的真好 |
hyeh612
| |
+ 1 |
+ 1 |
分享精神,是最值得尊敬的! |
858185616
| |
+ 1 |
|
吃水不忘打井人,给个评分懂感恩! |
如痴如梦如癫
| |
+ 2 |
+ 1 |
吃水不忘打井人,给个评分懂感恩! |
jojaajj
| |
+ 4 |
+ 1 |
分享精神,是最值得尊敬的! |
飞行太保
| |
+ 1 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
lingjin3
| |
|
+ 1 |
分享精神,是最值得尊敬的! |
放开那头母牛
| |
+ 3 |
|
分享精神,是最值得尊敬的! |
Shark恒
| + 1 |
+ 30 |
+ 1 |
评分=感恩!简单却充满爱!感谢您的作品! |
查看全部评分
|