前言
相信大家都有玩过星际争霸人口无限的版本,以前很好奇他是怎么弄的,总觉得很高端,但是其实自己DIY一下,发现还是挺简单的。本次基于<font color="#FF0000">星际争霸v1.08</font>版本,来研究下怎么自己制作人口无限版本。
这也是第一次写这种文档,为了新手能看懂,写得比较冗长。如果自身有一定的基础,可以直接看步骤简介即可。
PS:所有内容只为学习研究,请支持正版。转载请注明出处。
PS2:所有内容均为个人见解,如发现有错误,欢迎指出,谢谢。
本次基础知识
为什么能修改软件?
大多数Windows软件都是通过启动器(exe文件)调用动态链接库(dll文件)来运行软件。在运行时,会把exe文件存放到内存中逐行运行。
于是我们可以知道,修改的方法可以有两种:
1.直接修改内存中的内容,但是由于每次运行,分配给程序的内存都不一样,所以这种方式只能在当前运行生效。下一次打开可能就无效了。
2.通过直接修改exe文件,这样每次读到内存的时候,就已经是我们需要的内容了。
我们本次使用的就是第2种方法。
怎么修改呢?
需要涉及一点逻辑,一般程序的组成就是:变量赋值,条件,循环。具体是啥意思,百度一下吧,不多用篇幅了。
一般修改程序限制条件,都是使用修改条件来达到。比如:你当前最大人口18,所以当人口大于18时,就跳转到不允许建造。于是当人口大于18这个就是条件,我们可以把它更改,变为大于18时,也不跳转,就完成了修改。
断点是什么?有什么用?
正常的程序运行,是自动逐行进行的,就像机关枪一样,打完一发自动压上下一发。断点打了之后,相当于中断了这个过程,变成了98K,打一下需要手动拉一下栓,也就是说,断点状态下,可以由你决定下一行是什么时候执行。
汇编语言
CALL : 调用方法。
test :用来判断某一个寄存器是不是为0,主要和J**跳转配合使用。
J**:J开头的,都是跳转,根据后面的两个字母决定跳转需要满足什么条件。
JMP:没有任何条件,直接跳转。
需要的软件及作用
CheatEngine(CE)主要用作搜索内存和定位条件代码块。类似于金山游侠。
OllyDebug主要用于重新制作新的EXE文件。
DxWnd 这是一个窗口工具,主要是用于将程序窗口化,方便调试。
步骤简介
- 先尝试CE直接搜索人口,发现可行,但锁定内存发现,不能实现功能,于是开始迂回。
- 开始理逻辑,建造 = 判断金钱,判断人口,都满足条件之后,进入制造。所以,肯定会涉及人口,所以从金钱入手。
- CE查到金钱地址,都不用基址。直接找到之后,Attach到进程,查看什么访问了这个值,然后找到点击制造关键逻辑附近。
- 通过对比成功制造和不成功制造的跳转,确定关键跳转。
- 改变关键跳转为始终按照成功制造逻辑。
- 检验。
- 通过OllyDebug打包。
详细步骤
DxWnd设置窗口
打开软件,打开“编辑”,选择“添加”,名称随便填,程序填星际争霸v1.08,starcraft.exe的路径。然后按照下图设置一下。
设置完成,右键打开,调整窗口到自己舒服的大小。
PS:这里选择了释放鼠标,之后每一次鼠标点击游戏窗口外,需要额外多点击一下,不然鼠标指针会被拉回游戏窗口。
CheatEngine内存搜索
首先要开始一局游戏,建议选择单人游戏的Original模式,选择人类战役模式Boot Camp。这个关卡是给我们做教程的,人口直接是17个,而且没有敌人会来攻打你,我们可以慢慢的测试。
打开CheatEngine,打开进程,选择星际进程。
正常最简单的逻辑就是通过右上角显示的人口数来限制人口制造。
于是,我们先查找先搜索现在的人口17,得到一堆纪录。
在游戏中建造一个农民,建造完成后,搜索人口18。(可以秘籍一下,建造速度)
我此处是只有两条纪录,然后分别右键更改地址中的值为16。
回到游戏中查看,发现人口数仍然是18,说明人口限制并不是这两个地址判断的。
简单的逻辑不通,开始迂回分析切入点,按照编程逻辑,我们可以得到下面的一个流程图
按照上图逻辑,我们只需要修改人口是否超过上限那个判断,就可以实现人口无限。
分析应该有一个方法来判断是否能够制造,而且理论上方法是包含金钱判断和人口判断的。所以尝试从金钱入手定位方法。
CheatEngine中点击“新的扫描”,搜索游戏中的水晶数,我这里是100。用枪兵A掉自己一个农民,再制造一个农民,之后搜索50。我这里就只有3条记录了,按照刚才的方法,右键修改每一个的值。每修改完一个,就切回游戏,如果游戏中的水晶变成了修改的值,就说明找到了地址。
我这里是改成了200,发现第一个地址就是,于是右键“查看什么访问了地址”。之后切换回游戏,再切换回CheatEngine会发现小窗内增加了很多数据。
暂时不管这些数据,切回游戏窗口。点击制造一个农民(如果人口不够就A掉一个),再切换回CheatEngine,发现增加了几点数据。
选择新增的第一条数据,点击“显示反汇编程序”,附加到进程之后打开如下界面。
红色的线和箭头,代表从哪里跳转过来。这个部分的结构很像我们之前的流程图有木有,说明很有可能就是关键的逻辑了。
跳转逻辑分析
因为之前我们跟踪过来的逻辑就是正常的建造逻辑,所以可以逆推,两个跳转都是正常的逻辑执行。而上面一行的RET,代表return,应该是不正常的执行。所以以此类推,正常的判断逻辑在上方的CALL starcraft.exe+2280此方法中。
双击CALL starcraft.exe+2280那一行,可以得到内存地址为00402280。(你们可能不一样,内存动态的)
右键“转到地址”,输入刚才的内存地址。跳转到方法内。
在方法第一行按F5打断点,确保在游戏里有足够的人口之后,点击制造一个农民。
此时游戏会暂停,切换到CheatEngine,发现第一行左边有个">>",代表当前运行到哪一行。
按F8运行到下一行,重复F8直到看到J**的行。
如果J**红框位置显示“--->”说明跳转成立,如果成立,立刻添加注释(我一般是加normal,别随便1,2,3,有时候注释是有推测值的,可能把自己搞晕)。使用右键或者“Ctrl + Enter”都可以添加注释。
运行到RET,按下F9停止断点,让程序恢复运行。我们现在知道了正常制造逻辑的跳转路线。
再次回到游戏里,把人口占满(过程如果暂停了,切换到CheatEngine按F9就可以继续)。人口到达上限后,再次点击制造一个农民(小心金钱不够,该调钱调钱),此时又会触发断点。
此时就要注意了,每到达一个J**时,需要查看是不是有注释,有注释,需要跳转,没有注释说明不需要跳转。对比之前的注释,得到和正常跳转逻辑异常的点,为starcraft.exe+2372这一行的跳转,本需要跳转却没有跳转。
PS:地址如果和我的不一样,可以ctrl+M,打开/关闭模块地址,就可以看到相应的地址
双击当前行,将jnl改为jmp。点击确定。之后Ctrl+B,打开断点列表,删除断点。按F9,使程序运行。
返回游戏,再次制造农民,嘿嘿,人口无限达成。但是这只是达到了我们之前说的第一种方法,修改内存,接下来,修改EXE。
OllyDebug修改EXE
先在CheatEngine中纪录需要修改内存的地址。(前面有说,不一样的Ctrl+M)。我的是00402372,你们不一定。
打开OllyDebug,附加starcraft.exe
附加成之后,ctrl+G,输入之前我们纪录的地址,跳转到对应的内存位置。
接下来按照下图操作,保存文件,名称你自己想怎么取怎么取了。
之后,把你修改完的exe放到游戏的根目录,从你的exe打开游戏,就已经人口无限咯!!
结尾
第一次写这种技术文章,总担心自己表达得不够清楚,所以相对来说会啰嗦很多,希望大家多多提出宝贵意见。对破解感兴趣,有空可以多加深加深汇编语言的学习。但是汇编却又是比较乏味的,所以在开篇的基础知识中,只是加入了本次需要了解的汇编语句,希望能够更加平民。如果仍然又看不懂的,留言啦,谢谢大家。