| 修改众 |
08-02-10 05:05 |
无聊,所以又开始修改游戏。 还是那个loli做生意游戏。 这次是分析了“物品价格是从哪里来的”这个问题。
代码其实很简单,不过因为很少去认真分析代码,所以还是费了些功夫 不过总算是弄清楚了,也算是功夫不负有心人吧
找到标准价格的地址,然后下断点,看看是哪里改变的这个值。 然后就是对找到的代码进行分析。 加上些注释,方便理解吧。 注释是按顺序写的,不过分析过程其实是逆向的,即先有最后结果然后向前分析原因。
分析过程就不从头写了,因为我现在已经有点头晕恶心,难过死了。 (迷之声:对着屏幕几个小时,不晕才怪
00462DC6 - ff 05 f0 81 30 07 - inc [073081f0] : 00000020 00462DCC - 83 3d ec 81 30 07 20 - cmp dword ptr [073081ec],20 : 00000020 00462DD3 - 0f 8c f5 01 00 00 - jl 00462fce 00462DD9 - a1 64 82 30 07 - mov eax,[07308264] : 0003EA00 //要买卖的物品的代码 00462DDE - 89 1d 04 82 30 07 - mov [07308204],ebx : 00000000 00462DE4 - c1 f8 06 - sar al,06 //算数右移6位,等于除以2 6次,就是除以64,十六进制是除以40。 //为什么是40,因为物品代码的间隔就是40啊~ //40 00 00 00ポロポロな剑 +2 200 //80 00 00 00细身剑 +10 1200 //除以40,得到这个物品的物理编号 00462DE7 - 50 - push eax 00462DE8 - c7 05 f4 81 30 07 01 00 00 00 - mov [073081f4],00000001 : 00000001 00462DF2 - e8 7a 49 00 00 - call 00467771 //关键,跟进去 00462DF7 - 69 c0 8c 02 00 00 - imul eax,eax,0000028c //eax乘以28c 00462DFD - 83 3d 68 82 30 07 02 - cmp dword ptr [07308268],02 : 00000002 00462E04 - 59 - pop ecx 00462E05 - 8b 80 bc 48 5c 09 - mov eax,[eax+095c48bc] //[eax+095c48bc] 这个地址应该就是当前物品的标准价格,095c48bc就是整个价格表的指针,eax是当前物品的偏移量 00462E0B - a3 84 47 5c 00 - mov [005c4784],eax : 00000BB8 00462E10 - a3 88 47 5c 00 - mov [005c4788],eax : 00000BB8 =========>断在这里 //"物品标准价格"存放到"标准价格地址"
call 00467771 00467771 - 8b 0d 2c 5c 5c 00 - mov ecx,[005c5c2c] : 0000023B //[005c5c2c] 应该是物品总数,23b表示1共有571个物品 00467777 - 33 c0 - xor eax,eax //设置循环计数器 00467779 - 85 c9 - test ecx,ecx 0046777B - 56 - push esi 0046777C - 74 18 - je 00467796 //看看物品总数是不是0个 0046777E - ba ec 48 5c 09 - mov edx,095c48ec //取物品编号的指针到edx 00467783 - 8b 32 - mov esi,[edx] //将所指向的物品编号放到esi 00467785 - 3b 74 24 08 - cmp esi,[esp+08] //对比是不是和物理编号相同 00467789 - 74 0e - je 00467799 0046778B - 40 - inc eax //计数器+1 0046778C - 81 c2 8c 02 00 00 - add edx,0000028c //指向下1个物品的物理编号 00467792 - 3b c1 - cmp eax,ecx //对比是不是到了最后1个物品 00467794 - 75 ed - jne 00467783 00467796 - 83 c8 ff - or eax,ff //返回-1,表示没找到价格 00467799 - 5e - pop esi //还原esi 0046779A - c3 - ret
翻译过来,源程序代码大概是这样的 ... ... 变量a = 取物品的物理编号(物品代码/64) 变量a = 子程序_取物品实际编号(变量a) 变量a = 读取物品标准价格信息(变量a) 标准价格 = 变量a
子程序,取物品实际编号 如果(物品总数=0) 返回(-1)
变量a=取物品表第1个物品物理编号
计次循环(循环物品总数次,循环计数器) 如果(物品表第1个物品物理编号 不等于 要查找的物品物理编号) 循环计数器+1 变量a = 物品表下1个物品物理编号 如果(循环计数器 小于 总物品数量) 循环() 返回(-1) 循环() |
|