同人星球BBS -> 游戏修改 -> [汇编教程][psoemu]让锁定的门开锁 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

修改众 08-05-05 20:19

[psoemu]让锁定的门开锁


门是锁定还是非锁定,是1个变量的数值决定。
不过直接找这个变量比较困难。因为锁定的门,开锁以后就1直是非锁定状态,
这个值只变化1次,因此很难确定准确的地址。

换个思路。
非锁定的门在走近的时候会自动打开,离开后自动关闭。
稍微想想就知道,这也是1个变量控制的。
而既然都是控制门的,那么应该都在1个数组中。
因此找到这个值后,通过观察法就很容易可以找到开锁的地址了。


首先随便找1非锁定的门。
然后走近它,等门完全打开后,模糊搜索。
然后离开,等门完全关闭,搜索改变的值。
这样反复数次后,就可以找到1个地址。值的变化范围是0-3
仔细观察就发现,0关闭 1正在打开 2开着 3正在关闭
锁定这个值为2,离开后,就看到这个门关不上了。这就确定了这个地址。

之后,find out what write to this address
得到几个对应的代码,
门打开1 :006459b5 - c7 83 ac 00 00 00 01 00 00 00  - mov [ebx+000000ac],00000001
门打开2 :00645f3c - c7 83 ac 00 00 00 02 00 00 00  - mov [ebx+000000ac],00000002
门关闭1:00645a61 - c7 86 ac 00 00 00 03 00 00 00  - mov [esi+000000ac],00000003
门关闭2 :00645a10 - c7 87 ac 00 00 00 00 00 00 00  - mov [edi+000000ac],00000000

结合变量的值,1眼就看的出代码的意思了。
我们注意到,门的状态的偏移量是AC



好了,现在把内存查看器定位到门的状态地址上,
观察1下附近几行的地址。特别需要注意的是0,1,2这样的。发现附近有好几个这种值。
逐一经过测试性的修改,就在下面2行的位置,发现这个值修改为0或者其他值后,门就被锁定打不开了。
也就是说,这就是控制门的锁定的地址
find out what accesses (注意是accesses,因为我们要查找是什么代码会访问这个地址。)

得到对应的代码,
检查门是否锁定 :006195ef - 8b 83 cc 00 00 00  - mov eax,[ebx+000000cc]
汇编查看这条代码,发现这就是1个很小的call,整个call如下
006195e9 - 90                        - nop
006195ea - 90                        - nop
006195eb - 90                        - nop
006195ec - 53                        - push ebx
006195ed - 8b d9                      - mov ebx,ecx
006195ef - 8b 83 cc 00 00 00          - mov eax,[ebx+000000cc]  //访问门锁的状态
006195f5 - 83 f8 01                  - cmp eax,01                  //等于1则跳
006195f8 - 74 5a                      - je 00619654
006195fa - 83 f8 02                  - cmp eax,02                  //既不等于1也不等于2则跳
006195fd - 75 27                      - jne 00619626
006195ff - 0f b7 83 c8 00 00 00      - movzx eax,word ptr [ebx+000000c8]
00619606 - 50                        - push eax
00619607 - e8 50 ce 1f 00            - call 0081645c
0061960c - 59                        - pop ecx
0061960d - 0f b6 c0                  - movzx eax,al
00619610 - 83 f8 01                  - cmp eax,01
00619613 - 74 57                      - je 0061966c
00619615 - 8b 83 d0 00 00 00          - mov eax,[ebx+000000d0]
0061961b - 83 e0 fe                  - and eax,fe
0061961e - 89 83 d0 00 00 00          - mov [ebx+000000d0],eax
00619624 - 5b                        - pop ebx
00619625 - c3                        - ret


于是我们知道了,1表示门打开,2表示门锁定。还有1种其它值的情况。

那么要做的就非常非常简单了,
修改006195f5: cmp eax,01下面那个跳转的条件 je 00619654 为 jmp 00619654即可。


最后的工作,写成汇编脚本:
[ENABLE]
006195f8:
jmp 00619654

[DISABLE]
006195f8:
je 00619654






到此,这个简单的修改就完成了,运行看看效果吧~

a8118424 08-05-05 22:36
哦....门真可怜.....
考虑闲下来去学学汇编了....
[s:8]  [s:8]  [s:8]  [s:8]

sakurazaki 08-05-06 11:12
[s:5]
很难看不懂

littlewater 08-05-06 23:30
这个用的是CHEAT ENGINE嘛= =!!
话说目前STEP 9 还没有理解……

aya007 08-09-11 21:40
用CE试过,变量有10几W,每次搜索也只减少一点点,
还有大大这个改动是只限定一个门,还是所有门都开着?

showedboy 08-10-06 01:33
只是你搜索到的那一个门,每一个门都有1个地址

修改众 08-10-06 03:38
楼上需要去复习CE教程。


查看完整版本: [-- [汇编教程][psoemu]让锁定的门开锁 --] [-- top --]

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

You can contact us