同人星球BBS -> 游戏修改 -> [代码分析]loli做生意游戏,读取物品标准价格的过程 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

修改众 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)
循环()

修改众 08-02-10 05:12
顺带1提。
其实从中已经找到了物品信息的地址。
其中应该包含,价格和所有的属性。
28c的长度足够容纳大约320个汉字,说不准物品说明也在里面呢~

大家不要随便把物品改掉名字,所有属性+9999,卖9999w。
那样是不好滴~

更不要自己在物品表最后添加自己的物品信息,制造奇怪的物品~
那就太邪恶啦~
[s:1]


查看完整版本: [-- [代码分析]loli做生意游戏,读取物品标准价格的过程 --] [-- top --]

Powered by PHPWind v5.3 Code © 2003-05 PHPWind
Time 0.034425 second(s),query:4 Gzip enabled

You can contact us