| 修改众 |
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异或都是自身。 于是加密就没用了
|
|