静态修改:有关轩三怒气值增长速度自定义的研究

[ 2212 查看 / 3 回复 ]

一直觉得轩三的怒气值增长太慢,一直想修改,但又一直找不到方法。上周六心血来潮找了一堆破解工具玩,花了四天时间,终于找到了轩三怒气值增长速度的静态修改方法。

两个准备条件:

1. 下载了OllyDbg这个工具
2. 前人总结的经验,得知我的轩三版本(v1.02)怒气值的动态内存地址在004AE590

以下是修改过程(对细节不感兴趣的可以直接跳过这部分,直接看结论):

首先从OllyDbg打开Swd3.exe,从Debug处进入游戏。
读取了一个存档,在地图上跑来跑去,进入战斗。
进入战斗后立刻按Alt+Tab跳出,回到OllyDbg窗口。
在Memory视图窗口中,在内存的004AE590地址处设置Breakpoint。
回到轩三游戏界面,等待敌人打过来。
在敌人出手的瞬间,Breakpoint生效了!此时界面会卡死,不过多用几次Alt+Tab便可以回到OllyDbg的界面。
此时在CPU跟踪窗口可以看到程序执行到了以下几段:

:004854DE DB442418                fild dword ptr [esp+18]
:004854E2 DA742410                ffidiv dword ptr [esp+10]
:004854E6 D80D809C4900            fmul dword ptr [00499C80]
:004854EC D9C0                    fld st(0), st(0)
:004854EE E811420000              call 00489704
:004854F3 D81D58954900            fcomp dword ptr [00499558]
:004854F9 03C5                    add eax, ebp
:004854FB 8903                    mov dword ptr [ebx], eax

程序在004854FB这里停止,写入的eax的值正是此次攻击造成的怒气值的增加值。

查阅了一些汇编文档,仍然没有完全搞明白这些指令具体是什么效果。不过今天发现OllyDbg有个很好用的Step In功能,可以逐步执行指令并跟踪显示相关寄存器、堆栈和内存中的数值,终于解决了问题。

总之通过一系列跟踪,发现怒气值增加量的最终数字取决于(伤害值/生命最大值)x一个常量,这个常量正是004854E6中的指针指向的00499C80处数值,在游戏中设定为DD FLOAT 47.00000(就是47啦)。

把这个数值修改成470,通过Debug进游戏一看,随便挨一下打都能把怒气打满,吼吼……

不过,我没找到在OllyDbg怎么把修改过的exe保存下来,于是决定回去使用UltraEdit直接改。

-------------修改结论---------------

根据之前499C80那里的提示,记录下以下HEX码:

00 00 3C 42 00 00 00 00 E0 0E B7 D7 40 43 CF 11

用UltraEdit打开Swd3.exe,搜索这一行,答案只有一个。我们想要修改的就是00 00 3C 42这个数值,它代表着DD FLOAT 47.00000。

比如说我们想把这个值改成100。那么我们就随便在网上找个float to hex的计算器,比如http://babbage.cs.qc.edu/IEEE-754/Decimal.html,在最上面的框里输入100,点击rounded按钮——

结果中的32位的Hexadecimal的数值正是我们想要的东西。

100转换之后是42C80000。所以我们用这个替换掉3C 42,改成:

00 00 C8 42

保存。

这样便大功告成!
TOP

RE:静态修改:有关轩三怒气值增长速度自定义的研究

……杯具的发现修改之后,使用绝技会导致游戏跳出……

有待继续研究。
TOP

RE:静态修改:有关轩三怒气值增长速度自定义的研究

貌似是之前改成200,太高了。
改成99,目前还没有遇到退出的情况。
TOP

修改成100多一点可以吗。比如120.。。
如果修改成99被打几下能用 绝招呀?
TOP