一直觉得轩三的怒气值增长太慢,一直想修改,但又一直找不到方法。上周六心血来潮找了一堆破解工具玩,花了四天时间,终于找到了轩三怒气值增长速度的静态修改方法。
两个准备条件:
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
保存。
这样便大功告成!