用户工具

站点工具


g_tpr:edit4

金书红颜录修改研究 v4

综述

1.在未加入反修改机制之前,数据都是明码保存,有相应的修改器。
2.加入反修改机制之后,有一段时间可以通过在战斗中使用专用修改器来修改。
3.目前来说,似乎是用Cheat Engine(CE)来修改是比较方便的选择,甚至可以绕过反修改检测的机制。汉化文件为ch_cn.zip。CE的基础教程请自行搜索学习。

反修改机制

各种机制的加入具体版本号已经忘记。
1.数值的加密:即所有数值在内存中的保存与我们看到的是不一样的,而且没有大小顺序,因此直接搜索或者模糊搜索已经不起作用。该加密方式为0~255即0x00h~0xFFh分别对应某一数字,例如00对应DD,01对应EF,02对应3D,……。该对应值在游戏启动时通过随机方法确定,读取存档不会变动。该种方式我将其称之为码表,即像摩斯码一样不同信号对应固定值。最初的码表是储存在固定地址的,之后则需要指针来定位。这样的码表可以方便的复制出来。
2.数据储存位置的加密:一般数据储存都是在内存一确定地址,比如0x01EF0020h,一段时间内该地址不会变动。而该游戏通过一个类似timer的东西来不断的切换该储存地址,不过有意思的是这种加密方式设计之初,每次读取游戏后只在2个内存地址之间切换。之后的版本更新有了更大改进,比如2个内存地址切换一段时间之后会变动到另2个内存地址;又或每隔一段时间储存位置前移或后移一段距离。
3.数据的验证:修改过一个数值之后数据发生了变化,还设计了过程来验证数据。机制似乎是:某类数据求和,获得一个值,若该值在timer比较时发现不相等则认为修改过。若一个存档被认为修改过数据,系统会经常弹窗提示此存档被修改过。
4.数值加密的改动:码表的方式之后采用了算法加密,内存中则找不到码表,不能复制。每次进游戏获得一系列随机数X和Y,分别确定0xXYh中的X和Y;例如Y=3,那么0x00h在内存中则表示为0x03h。而高位中的X则通过另一系列随机数确定。X的大概算法是这样的:随机获得a、b。b可能是2或4,a则是一个偶数0、2、4、6、8、A、C、E之一,通过a来确定0对应的是哪个数,通过b来确定几个数为一组。比如下面表格中a=E,b=2。若b=4则会出现0xE0, 0xF0, 0x00, 0x10;0xA0, 0xB0, 0xC0, 0xD0; …… 这样的序列

000102030405060708090A0B0C0D0E0F
00E3E4E5E6E7E8E9EAEBECEDEEEFE0E1E2
10F3F4F5F6F7F8F9FAFBFCFDFEFFF0F1F2
20C3C4C5C6C7C8C9CACBCCCDCECFC0C1C2
30D3D4D5D6D7D8D9DADBDCDDDEDFD0D1D2
40……

因为这样的加密制作码表比较复杂,因此开始寻求程序上的修改,干脆绕过数据加密的部分。则有了下面的研究。 通过修改程序算法,把原本通过随机数加密的码表转换为无加密的码表,即对应值与储存值相同。

v4.45D

程序文件:jshyl.exe 2014.2.9 17:04 3,616,256 byte

随机数产生部分

0051AFE1 - 40 - inc eax
0051AFE2 - A2 26027700 - mov byte ptr [00770226],al ««——- al改为0,自动填充nop
0051AFE7 - C7 44 24 7C 00000000 - mov [esp+7C],00000000

载入进程随机数产生部分 0011A1FC

0051ADDF - 79 07 - jns 0051ADE8 : [KERNELBASE.AppXSetPackageState+3A15]
0051ADE1 - 48 - dec eax
0051ADE2 - 0D 00FFFFFF - or eax,FFFFFF00
0051ADE7 - 40 - inc eax
0051ADE8 - A2 25027700 - mov byte ptr [00770225],al←—–al改0,nop填充
0051ADED - E8 36000B00 - call 005CAE28 : [→msvcrt.rand]
0051ADF2 - 25 FF000080 - and eax,800000FF
0051ADF7 - 85 C0 - test eax,eax
0051ADF9 - 79 07 - jns 0051AE02 : [KERNELBASE.AppXSetPackageState+3B15]
0051ADFB - 48 - dec eax
0051ADFC - 0D 00FFFFFF - or eax,FFFFFF00
0051AE01 - 40 - inc eax
0051AE02 - A2 26027700 - mov byte ptr [00770226],al ←—–al改0,nop填充
0051AE07 - C7 44 24 24 00000000 - mov [esp+24],00000000
0051AE0F - EB 2F - jmp 0051AE40

原为al
改为00
即可禁止产生随机数

0051ADE8 - A2 25027700 - mov byte ptr [00770225],al 载入进程时al→0

0051AE02 - A2 26027700 - mov byte ptr [00770226],al

其他记录

005799D4 - 8B 0D 00F24501 - mov ecx,[0145F200] : [042B8020] 可疑地址

0051B565 - 88 02 - mov [edx],al 指向人物未加密数据

0051B548 - 8B 44 24 0C - mov eax,[esp+0C] 设置断点可找到人物未加密数据,但游戏会跳出

005D001D - C7 00 00000000 - mov [eax],00000000 指向人物加密数据

0051BE79 - A3 00F24501 - mov [0145F200],eax 指向人物加密数据

0051BF33 - F3 A5 - repe movsd 复制内存代码

–==以上设置中断均CTD==–

0051B4E8 - 83 EC 10 - sub esp,10 在此设置断点不CTD*

[0145F200]

[00770730]

0051B513 - A0 25027700 - mov ax,[00770225] : [B9EE] 加密码地址?
0051AFE2 - C6 05 26027700 00 - mov byte ptr [00770226],00

人物信息偏移结构

0051AFCD - E8 56FE0A00 - call 005CAE28 : [→msvcrt.rand]
0051AFD2 - 25 FF000080 - and eax,800000FF
0051AFD7 - 85 C0 - test eax,eax
0051AFD9 - 79 07 - jns 0051AFE2 : [KERNELBASE.AppXSetPackageState+3B15]
0051AFDB - 48 - dec eax
0051AFDC - 0D 00FFFFFF - or eax,FFFFFF00
0051AFE1 - 40 - inc eax
0051AFE2 - A2 26027700 - mov byte ptr [00770226],al ««——- al ⇒0
0051AFE7 - C7 44 24 7C 00000000 - mov [esp+7C],00000000
0051AFEF - EB 5A - jmp 0051B04B : [KERNELBASE.Internal_EnumCalendarInfo+5A]
0051AFF1 - 8B 15 8CFE7600 - mov edx,[0076FE8C] : [00000000]
0051AFF7 - 8B 44 24 7C - mov eax,[esp+7C]
0051AFFB - 01 D0 - add eax,edx
0051AFFD - 89 44 24 18 - mov [esp+18],eax
0051B001 - E8 22FE0A00 - call 005CAE28 : [→msvcrt.rand]


中断点

0051B4E7 - C3 - ret
0051B4E8 - 83 EC 10 - sub esp,10 «««—–设置中断,此处不引起CTD,长时间中断亦较稳定
0051B4EB - 8B 44 24 14 - mov eax,[esp+14]

数据指针地址

005799D2 - F3 A4 - repe movsb
005799D4 - 8B 0D 00F24501 - mov ecx,[0145F200] «←—-指针地址,中断使其停止迁移位置(人物数据其中一处,另一处通过搜索找。可能是监视修改的备份数据)
005799DA - 0FBF 94 24 CC010000 - movsx edx,word ptr [esp+000001CC]

g_tpr/edit4.txt · 最后更改: 2018/11/18 14:02 (外部编辑)