同人星球BBS -> 游戏修改 -> [代码分析]风色幻想6数据加密过程分析与破解 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

修改众 08-02-08 02:04

风6的加密方法
风6有1个有255个成员的加密数组。
加密某个数据,随机从中抽出1个作为加密密钥,然后与实际值进行 异或运算。
然后将所用到的 密钥编号和加密后的值存放到内存中。
这样就无法1眼看出实际内容。


经过多次数值改变,未改变的模糊搜索,确定了金钱的地址。
然后查找 改变这个数值的代码,得到下面代码
xor ecx,[eax+edx*4]
mov edx,[ebp-08]
mov [edx+08],ecx    ====>这条指令改变了金钱地址的值

上面那个xor就是加密运算。
为了了解运算的过程,将这里的代码修改为了如下
mov [00c33fe4],eax
mov [00c33fe8],ebx
mov [00c33fec],ecx
mov [00c33ff0],edx
xor ecx,[eax+edx*4]
mov edx,[ebp-08]
mov [edx+08],ecx    ====>这条指令改变了金钱地址的值

将加密前的寄存器数值保存了起来,发现
ecx 是在游戏中看见的金钱数
eax 是我上次提到的那个密钥,现在确定这是密钥表的指针,指向第0个密钥。
edx 等于金钱地址前面的那个值,也就是密钥编号

然后把 实际的金钱值与 密钥编号所指向的密钥 进行异或运算,得到加密后的值
另外edx的范围是在ff以内,也就是说游戏建立了ff个加密密钥。

风6的密钥地址是固定的,那255个密钥也是固定的.
尝试将迷钥全部修改为0,这样异或运算的结果就是原数值。
但是游戏挂了。换其他数值也不行。
可能那些密钥有CRC吧,发现修改就挂游戏。

说了这么多,到底有什么用呢
举个例子
比如我现在有 19999900的金钱,电脑决定用第5A个迷钥加密
那么运算过程就是
1 查密钥表得到第5A个迷钥是 AC711985
2 执行 xor 19999900,AC711985
3 得到结果 AD403519
4 写入内存就是 5A 00 00 00 19 35 40 AD



加密的破解方法

首先是找到金钱的地址。然后查看是什么写的这个地址。
会得到好几个类似这样代码:  mov [xx],xx 或者 mov xx,[xx]

在汇编窗口逐个观察后,发现这条代码很有价值 00508349 - 8b 51 08 - mov edx,[ecx+08]
汇编窗口中是这样: 
0050831E - 89 4a 08                  - mov [edx+08],ecx
00508321 - 8b 85 d0 fc ff ff          - mov eax,[ebp-00000330]
00508327 - 8b 08                      - mov ecx,[eax]
00508329 - 81 c1 34 01 00 00          - add ecx,00000134
0050832F - 89 8d 60 ff ff ff          - mov [ebp-000000a0],ecx
00508335 - 8b 95 60 ff ff ff          - mov edx,[ebp-000000a0]
0050833B - 8b 72 04                  - mov esi,[edx+04]
0050833E - e8 fd a6 ef ff            - call 00402a40  ====〉关键call
00508343 - 8b 8d 60 ff ff ff          - mov ecx,[ebp-000000a0]
00508349 - 8b 51 08                  - mov edx,[ecx+08] ======〉断在这里
0050834C - 33 14 b0                  - xor edx,[eax+esi*4] ====〉加密数据
0050834F - 89 95 58 ff ff ff          - mov [ebp-000000a8],edx
00508355 - 8b 85 d0 fc ff ff          - mov eax,[ebp-00000330]
0050835B - 8b 48 3c                  - mov ecx,[eax+3c]
0050835E - 89 8d 54 ff ff ff          - mov [ebp-000000ac],ecx

我们已经知道xor edx,[eax+esi*4] 这步就是加密数据了,eax就是加密表的地址,esi是用到的密钥的偏移量。
那么eax哪里来的呢?
看见前面那个call了吧,跟进去
00402A40 - 55                        - push ebp
00402A41 - 8b ec                      - mov ebp,esp
00402A43 - e9 59 a5 10 00            - jmp 0050cfa1  ====〉跳转
00402A48 - 5d                        - pop ebp
00402A49 - c3                        - ret

有个跳转? 管它,再跟
0050CFA1 - a1 d4 f7 f7 00            - mov eax,[00f7f7d4] : 006881C8  ===>eax赋值
0050CFA6 - e9 9d 5a ef ff            - jmp 00402a48

把[00f7f7d4]作为指针将值传给eax
汇编器已经告诉我们[00f7f7d4] 的值是 006881C8
怎么这么眼熟呢,啊,原来006881C8正是密钥表的第1个密钥嘛
于是知道了[00f7f7d4]就是密钥表的指针

于是,将这个密钥表的指针指向1个全都是0的地方就得啦。
这样读取到的密钥就都是0 ,任何数和0异或都是自身。
于是加密就没用了

bayt 08-02-19 17:08
看这有些头晕,希望LZ开个关于破解或修改的讲座贴

leco 08-02-19 18:01
基本上看不懂……

不过不用管我,我路过的

elliotor 08-04-12 16:26
.........大部分看懂了,但是到Call函数之后就不是很明白,因为没有实际操作过call函数吧 [s:5]

leilei控 08-05-29 14:10
就用金山游侠玩风3把风4里的人物弄出来过


查看完整版本: [-- [代码分析]风色幻想6数据加密过程分析与破解 --] [-- top --]

Powered by PHPWind v5.3 Code © 2003-05 PHPWind
Time 0.034483 second(s),query:4 Gzip enabled

You can contact us