丸子de爸爸 发表于 2019-8-20 19:01

星际争霸V1.08人口无限DIY

本帖最后由 丸子de爸爸 于 2019-8-23 17:07 编辑



# 前言

相信大家都有玩过星际争霸人口无限的版本,以前很好奇他是怎么弄的,总觉得很高端,但是其实自己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 这是一个窗口工具,主要是用于将程序窗口化,方便调试。

# 步骤简介

1. 先尝试CE直接搜索人口,发现可行,但锁定内存发现,不能实现功能,于是开始迂回。
2. 开始理逻辑,建造 = 判断金钱,判断人口,都满足条件之后,进入制造。所以,肯定会涉及人口,所以从金钱入手。
3. CE查到金钱地址,都不用基址。直接找到之后,Attach到进程,查看什么访问了这个值,然后找到点击制造关键逻辑附近。
4. 通过对比成功制造和不成功制造的跳转,确定关键跳转。
5. 改变关键跳转为始终按照成功制造逻辑。
6. 检验。
7. 通过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打开游戏,就已经人口无限咯!!

# 结尾

第一次写这种技术文章,总担心自己表达得不够清楚,所以相对来说会啰嗦很多,希望大家多多提出宝贵意见。对破解感兴趣,有空可以多加深加深汇编语言的学习。但是汇编却又是比较乏味的,所以在开篇的基础知识中,只是加入了本次需要了解的汇编语句,希望能够更加平民。如果仍然又看不懂的,留言啦,谢谢大家。
人口无限突破200人口后续传送门

丸子de爸爸 发表于 2019-8-22 14:14

{:1_893:}首先先多谢大家的支持,然后对几个问题集中回复一下:

[*]目前这个人口无限是没有突破200人口限制的,原因也很简单,教程主要是讲思路,我怕内容太多,大家头晕。想要自己实现200人口破解,思路完全是一致的,大家可以先自己练习,下一篇文章我会给出怎么做。
[*]很多兄弟希望的放出exe,额,两个原因一直在纠结。一就是确实我只改了一行代码,如果连这都要放上来...好像教程没有了意义。再来就是,也不希望助长盗版,我还是比较喜欢暴雪游戏的。
[*]下篇文章暂定还是星际, 其实内容也简单,把星际长串的作弊指令,变成输入简单的1,2,3就行。同时也将破解200人口限制。


PS:大家不妨按照这种思路试试,能不能让自己的星际做到,钱不够,也能造东西呢?
再次多谢大家!

wendy123 发表于 2019-8-21 15:02

LZ,帝国时代3用这方法可以吗

o651560441 发表于 2019-8-21 15:12

本帖最后由 o651560441 于 2019-8-21 15:13 编辑

谢谢楼主的分享,星际争霸还真是怀念呢,楼主你能放出修改后的文件吗

jszjyz 发表于 2019-8-21 15:28

很经典的一款游戏,已经10多年未玩这个了。

丸子de爸爸 发表于 2019-8-21 15:56

wendy123 发表于 2019-8-21 15:02
LZ,帝国时代3用这方法可以吗

:lol这我没有试过,但是我这里分享更多的希望是思考方式。整体的做法都是类似的,只是在细节上会不同..:lol你这么一问,感觉可以做一篇帝国时代3的破解了

丸子de爸爸 发表于 2019-8-21 15:58

o651560441 发表于 2019-8-21 15:12
谢谢楼主的分享,星际争霸还真是怀念呢,楼主你能放出修改后的文件吗

:lol先谢谢支持,修改后的文件我倒是无所谓,但是我也是第一次分享,不知道会不会侵权啥的,本来是学习研究,搞得很复杂也麻烦。也希望有版主能够站出来回答下

liouping11 发表于 2019-8-21 16:20

支持下楼主,谢谢楼主照顾我们这种小白

xingye688 发表于 2019-8-21 16:30

要是能更新下sb520反作弊器就好了

bant 发表于 2019-8-21 17:26

冥界3大法王 发表于 2019-8-21 17:46

本帖最后由 冥界3大法王 于 2019-8-21 17:56 编辑

@丸子de爸爸
楼主 当年有个游戏叫 “圣眼之翼”,非常的好玩,游戏不大!单机的。网上有游戏修改器,不过感觉不如自己汇编过的敌人好玩,有没有兴趣我们合作个变态版来玩。{:301_997:}
一共5队,并可用键盘 12345编队,最多带30个人上阵,当年修改过改成携带80口人上场,结果游戏过面后
计算经验值时就卡死了,能不能用你的方法再给我表演一下呢????????????谢谢!!!!!{:301_1006:}
不过,我喜欢弄个侦察兵,把雷数修改为255或无限;然后全屏布雷,专炸敌人黑法师。{:301_986:}
或者买来 一队 侦察兵,若死掉后,屏上就有一坨地雷。 若是 侦察兵死了就会把旁边的侦察兵炸死,这样屏幕一个一个侦察兵小队都炸死了。
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 星际争霸V1.08人口无限DIY