====== 金书红颜录修改研究 v4 ====== **[[g_tpr:structure|数据结构]]**\\ **[[g_tpr:comdata|常用编码]]**\\ =====综述===== 1.在未加入反修改机制之前,数据都是明码保存,有相应的修改器。\\ 2.加入反修改机制之后,有一段时间可以通过在战斗中使用专用修改器来修改。\\ 3.目前来说,似乎是用[[http://www.cheatengine.org/|Cheat Engine]](CE)来修改是比较方便的选择,甚至可以绕过反修改检测的机制。汉化文件为[[http://www.cheatengine.org/download/ch_cn.zip|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; …… 这样的序列\\ ^ ^00^01^02^03^04^05^06^07^08^09^0A^0B^0C^0D^0E^0F^ ^00|E3|E4|E5|E6|E7|E8|E9|EA|EB|EC|ED|EE|EF|E0|E1|E2| ^10|F3|F4|F5|F6|F7|F8|F9|FA|FB|FC|FD|FE|FF|F0|F1|F2| ^20|C3|C4|C5|C6|C7|C8|C9|CA|CB|CC|CD|CE|CF|C0|C1|C2| ^30|D3|D4|D5|D6|D7|D8|D9|DA|DB|DC|DD|DE|DF|D0|D1|D2| ^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]\\