文章目录
- 零、引言
- 一、贴吧具体方法
- 加密原理
- 具体操作
- 二、实际搜索例子
- 三、游戏数值修改
- 四、后话
零、引言
一、贴吧具体方法
加密原理
游戏数值A,CE数值B,常数C(每次启动程序会重置,载入存档不会)
B=A左移14位然后异或C,也就是(用计算器的程序员模式)先把A乘以16384,然后异或C。(如果A乘以16384后所得16进制值大于8位数,则高位往低位补充)
具体操作
先通过模糊搜索找到钱的地址(4byte通常会是靠后的一个)
通过钱,反推C的流程一样,先用钱A乘以16384,然后异或CE里看到的数值B,就可以得到C。
有了C:
你可以用计算器通过AC,算出B,再直接通过精确数值查找,一般改变1次就能找到。
二、实际搜索例子
以初次进入天结1为例,金钱开始是2000。
1、将游戏存档,先用CE搜索“未知的初始值”;
2、购买一个96金币的东西,这里可以买“黄液”,然后扫描“变动的数值”;
3、再购买另一个96金币的的东西,这里可以买“青液”,然后扫描“变动的数值”;
4、可重复步骤2、3多次,如果金钱没有变动时可以多扫描几次“未变动的数值”。
5、读取最开始金钱为2000的存档(存、读取并不会改变金钱的地址),并扫描“变动的数值”。
6、不改变金钱,继续读取金钱为2000的存档,并扫描“未变动的数值”。
7、重复步骤2~6(购买的东西不一定是96金币的,可购买别的)
8、当结果只有几百个,或者几十个,甚至更少时,基本可以停止了。
9、把结果往下拉到底,如果只有一个地址以3开头,基本可以确定该地址就是金钱的地址了。
三、游戏数值修改
金币地址我们已经知道了,但是这么一长串数值明显不是游戏里的数值。
为方便后文使用,定义:游戏数值A,CE数值B,常数C。
(注:以下均按CE默认十进制)
以金币2000为例,设A=2000。其在CE里的数值为836211780,设B = 836211780
A1=2000 * 16384=32768000(也就是二进制左移14位)
C = A1 XOR B = 32768000 XOR 836211780 = 807638084(XOR代表“异或运算”,可用计算器“程序员模式”计算)
(C = (A*16384) XOR B)
1、算了这么大一串有啥用呢?
其实只是为了得出C,因为每次打开游戏时,会随机生成一个C,但是存、读档并不会改变C。(目前没有找到C具体是咋算出来的,所以每次开游戏都得从头找C)
2、那么C有什么用呢?
有了C就可以开始修改啦~
假设我要修改为金币10000,那么把A设为10000,C为上面算出的 807638084
也就是
B = (A * 16384) XOR C = (A * 16384) XOR C = (10000 * 16384) XOR 807638084 = 971478084
然后把CE里金钱数值改为B值,也就是971478084。
在游戏中进入商店可发现金钱确实为10000。
修改成功!~~
当然HP,物品数量,玄墨点数等的修改均类似。
四、后话
1、每次打开游戏C都会变,所以每次开游戏都需要重新计算C。
2、补位
C为8位16进制数,那么A * 16384可能会超过8位16进制数,那么该怎么异或呢?
这里其实采用了补位的方法,假设我们要把A修改为5194000,那么A * 16384 = 85098496000,其16进制为13D0440000,显然超过了8位数,但是要进行异或一般来说应该不能超过8位16进制数(一般一个地址最多存储8位16进制数),所以要把高位往地位补,这里即把13往低位补充,变为D0440013。再将其与C进行异或,得到B = 3764884567(10进制数)。