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

星际争霸v1.08修改作弊指令(上)

本帖最后由 丸子de爸爸 于 2019-9-11 17:52 编辑

# 前言

星际争霸的作弊指令大家应该多有听过,但是有几个能够全部记住呢?老年人更是难上加难,今天我们就来解决一下这个问题。

PS:

有一段时间没有发文章,真的不是偷懒,单单是这一篇文章我就整理了三天,每天至少4-5个小时。有很多东西,做起来很容易,但是一到讲解的时候,总担心讲的东西太多,又担心讲的东西太少,来来回回整理了很多遍。

最终还是决定把这篇分成两部分:第一部分着重分析关键方法和地址,第二部分再来着重讲汇编。

相关基础知识请查看第一篇基础知识部分,不做重述。传送门

本文中大段文字的概念已经在目录标识,怕瞌睡的朋友可以跳过。

文章纯属研究,切勿商用。转帖请注明出处,谢谢。

# 步骤简介

1. 按照流程图,分析出秘籍的执行是按下回车之后校验执行,先找到回车后执行的方法位置。
2. 输入特定的秘籍,使用CE搜索秘籍内容,进一步确定执行秘籍方法的位置。
3. 找到存放输入内容内存的位置,在按下回车的第一个将访问他的方法前面修改代码,更改内存值,达到快速作弊指令的目的。

# 详细步骤

## 关卡选择

首先还是选择单人模式→original→里面的人族战役模式boot camp,因为没敌人攻打,安静。



## 思路分析

### 逻辑流程图

之前的文章也提到过,如果你要破解,第一步,你要明白他的正确流程。

我们这里是希望能够通过简易的输入,来达到调用系统作弊的方法,所以我们先把正确的逻辑理出来。



好,如此我们就得到了一个简单的流程图。接下来就开始找突破点了。

PS:不要问我这个怎么图怎么得来的,就是你游戏过之后的推测而已,破解原则上就是一种推敲,然后根据你发现的线索一点点的还原真相。

### 突破点分析(大段文字)

怎么确定我们从哪个判断入手呢?也简单,我们的需求,是输入1、2、3能够执行对应的作弊,那我们直接看看,哪一步会阻碍我们的执行。

很明显,在“秘籍是否正确”这个判断这里,会阻碍我们的需求,所以,先解决他。

那怎么该从哪里入手呢?也有以下两个方案(适用于所有游戏),分别问“顺流”和“逆流”:

1.“顺流”方案,即按照流程来执行,利用一切正确逻辑可能用到的资源,对程序进行正向的分析,找到关键逻辑。

优点:思路清晰,相对于“逆流”方案,速度更加稳定。很容易弄清楚代码真正逻辑,对自身学习成长帮助较大。

缺点:速度相对“逆流”方案较慢,而且需要一点编程上的知识积累(相信我,真的只是一点,别看到就否了)。

PS:所谓一切可能用到的资源,其实就是一种逻辑细化,将界面元素结合你所拥有的知识,再次细化流程图,而分析出关键逻辑位置。

2.“逆流”方案,即:使用个例来逆推出关键逻辑。比如此处,我们由于知道金钱是可以作弊的,所以,我们可以检测金钱,通过查找金钱变化的方式,慢慢的找回到关键逻辑。

优点:方法灵活,在特定的方式下使用,定位方法速度极快。执行步骤直观简单。

缺点:需要你的想象力很强,定位速度不稳定,“非洲酋长”检验神器。完全为了结果而执行,提升有限。

这两个方案其实都很好,就像篮球里的“学院派”和“街头派”,各有各的厉害,取长补短,合理运用才是王道。建议在没有头绪的时候,使用“顺流”。在需要快速定位关键方法时,使用“逆流”。

讲了这么多,真的可能会觉得我有点啰嗦,但是如果这么点啰嗦看不下去的话,下面的内容估计....

## CE查询关键功能地址

大爷别走,真的开始了。我们先按照逻辑,回车,然后查看界面元素。

找到一个元素,界面上出现了一个“Message:”的文本,是让我们在里面打字的。


好,此时,我们可以细化流程图了。我下面就只画整体流程图的一部分,请结合上面的一起观看。



所以此处我们可以得出结论就是,这个“Message:”的绘制, 是在秘籍执行方法调用之前。

于是,我们可以利用这一点,来找到哪里是调用回车的关键方法。

打开CE,附加“starcraft”。修改“数值类型”为字符串,搜索“Message:”。



发现只有一条记录,继续右键“查看什么访问了地址”,并允许附加调试器。



切回游戏画面,发现数据一直持续增长。这里是由于我们已经打开了回车,游戏一直在重绘画面,所以没有一个打开的标志。



回到游戏,按回车关闭输入框“Message:”,然后再次打开。再回到CE查看,发现有一个只有一次的标志了。



点击“显示反汇编程序”,可以发现一个明显的ret,是可以回到之前方法的调用,先回去看一看。

在定位到的位置,F5打断点,然后切回游戏,一步步执行到ret。(如果断点有问题,可以打在第一行PUSH EBX那)

这里打完断点需要重新回车两次,因为目前断的是显示“Message:”的位置

PS:我们当前定位的方法,大概猜测,这里就是一个绘制文字的方法。



再多按一次F8,返回到外部程序。

此时我们会发现,上方不远处有一个JE的跳转,而我们的当前的位置正好在这个跳转的里面,说明跳转没有执行,也说明了,其实这个JE就代表的是回车是否按下的判断。



ctrl+B,删除所有断点,然后在JE处断点,F9让程序跑起来。然后回到游戏,再次按下回车,发现已经可以断住了。此时JE跳转实现,说明跳转是进入的确认回车的操作。那这里就可以作为我们要找的“回车确认秘籍”的入口(不记得的见流程图2)。



到这里又要停一停了。我随便跟了一下,发现茫茫多的call方法,call方法里面还有call,而且里面还有别的工具类调用,我的天,跟下去是能找到,但是人都要没了。

于是在当前的基础下,继续细化,用特例代替范例,逆一下。

于是以“show me the money”为例。(有人不明白为啥要特例,因为特例你可以直接查内存,就很快可以找到调用)

在游戏中回车输入“show me the money”暂时不按下确认。在CE中搜索字符串“show me the money”,得到一条记录。

PS:如果按下回车就卡住了,没法输入命令就是进断点了,回车断点是只要按下就进入,自己没事多按按F9,后面不再重复解释了。



选择“什么访问了地址”,然后返回游戏界面。又出现一堆增加的数据,不理他,回车,然后回到CE查看。

此时会进入断点,并且什么访问里出现了计数只有1的调用记录。

而且原本内存中显示秘籍的值为空了,这其实说明,秘籍确认的点,已经运行了,在我们断点的前面。

如果在断点后面,此时应该不会显示1个访问,内存也不会为空,因为他被断点停住了,直到我们运行到他的方法时候,才会运行。



不过也没关系,这样我们更近了,往前找就是了。

在反汇编窗口中,右键刚才的JE行选择,“选择当前函数”。

PS:新断点打的时候可以考虑把老断点删掉,免得调试的时候不流畅。



CE会自动跳到方法头,并将整个方法标注颜色,在方法第一行打入断点,然后再回到游戏。



输入"show me the money"直接回车。

在输入过程中,发现CE中的搜索结果地址居然也直接在变化,那看来这个地址是用来存放用户输入信息的。

进入断点,这次是不是不一样了,搜索值依然存在。而且单独计数的那个访问没有出现。

说明我们已经来到了关键逻辑的前面,接下来就是一步步F8向下执行,找到关键逻辑所在。

发现走到第二个call方法时,“什么访问了地址”的纪录变化了,说明这个方法读取了内存信息,所以我们在这里断点。因为程序不能逆向运行,所以要重新再来一次。按F9让程序继续运行。



选择“浏览相关内存区域”。



在游戏中再次输入"show me the money"并回车,然后回到CE。

发现内存中已经存在“show me the money”,双击红框处的数字,将前两个数字修改值为49,点确定。

此时在右边的文字会变成11ow me the money(绿色部分)

PS:在方法执行前修改掉内存的值,即让秘籍不正确,这是如果还能执行秘籍,就说明需要继续找。如果不能执行秘籍,说明此处修改就可以达到修改目的。



按下F9让程序运行,发现秘籍真的没生效。看来在这里修改内存,就可以达到我们需要的效果。

进入方法里,发现ecx的值就是输入的内存地址,所以可以直接引用动态地址了。

纪录下左侧的地址,我此处是"004BEDFC"。

PS:这里不是说非要动态,其实这个偏移地址也是可以跳转的,但是比较麻烦,在老式的程序可以直接纪录动态,他一般都从00400000开始。新程序就最好纪录偏移地址了。

怕大家不理解过程,所以再更新一下流程图如下:



## OllyDebug修改exe

由于这次的内容已经很巨大了,本篇仅提供内容,具体分析留到下一篇。

退出之前的游戏和CE。在OllyDebug中打开程序,使他运行起来(同样记得进入单人关卡)

在OllyDebug中,Ctrl+G,跳转到我们纪录的地址地址"004BEDFC"(你也可以试试偏移地址)

在OllyDebug翻到最下面,选一个没有代码的行,我这里选的是“004ECDC0”



逐行输入下列代码(啥意思下篇详解)

```assembly
push eax                               备份之前的寄存器内容,怕出BUG。其实这次的需求不写也行,好习惯。
mov eax,dword ptr ds:      将输入内容读到寄存器eax中
cmp word ptr ds:,0x31             比较输入的值是不是1
jne short 004ECDEB                     这跳转你要看你们自己的,跳转到pop eax那一行
mov dword ptr ds:,0x776F6873      内存写入"show"
mov dword ptr ds:,0x20656D20    内存写入" me "
mov dword ptr ds:,0x20656874    内存写入"the "
mov dword ptr ds:,0x656E6F6D    内存写入"mone"
mov word ptr ds:,0x79          内存写入"y "
pop eax                              还原寄存器内容
call 004E6030                        调用原来正常逻辑需要调用的方法
ret                                    返回引用处
```

然后回到004BEDFC处,将代码改为call 004ECDC0,也就是调用我们的这个方法。

PS:简单的说我们做的动作就是,在执行他本身的方法之前,插入了我们的判断。



接下来就是保存了,老规矩,“复制到可执行文件”→“所有修改”



弹出框选择“全部复制”,之后保存文件,名字随便改。



把修改好的exe拷贝到游戏目录,运行,输入1回车,是不是直接回钱了。搞定。

如果想要其他的秘籍也生效,只要接着写判断就行,在下篇中我们详细演示。

# 结尾

本来想一篇写完的,奈何篇幅还是巨大,随随便便就3000多字了,还没有包括OllyDebug的一些分析和汇编的分析,所以把这部分放到了下一篇着重分析。

再对破解的思路来一个总结吧:

1. 使用“顺流”法往往会让你很快找到突破口。
2. 按照游戏逻辑建立流程图,有利于对程序的分析。
3. 使用“逆流”法往往会让你更快的找到修改点。

本次修改内容很多,附上修改后exe文件,7天有效。请大家切勿商用,支持正版。
链接:https://pan.baidu.com/s/1UpCbbYoBtkqgmzSlzSb_Mw
提取码:qwug

[我是下集传送门](https://www.52pojie.cn/thread-1022579-1-1.html)

a517753728 发表于 2019-8-31 13:21

技术还没达到你的标准 还是感谢分享 努力学习

smnhxy 发表于 2019-9-1 15:31

:rggrg2000年的时候我在沈阳,第一次玩星际玩不过,后来听说有秘籍这个东西,然后就去图书馆找电子书翻找星际秘籍,找到后抄本子上带回来~~~~~~话说我学习都没这么认真过。。。。。

追风纸鸢 发表于 2019-8-31 14:18

星际秘籍全背下来的路过

leroy81831 发表于 2019-8-31 13:30

这个厉害了

Dino1209 发表于 2019-8-31 13:31

谢谢
收藏了
满满回忆啊,那时候去网吧抄星际很快乐!

biglolo 发表于 2019-8-31 13:46

谢谢分享

qws1855 发表于 2019-8-31 13:55

感谢分享

someone01 发表于 2019-8-31 14:13

楼主 太调皮了!这个有点意思!

alfred_woo 发表于 2019-8-31 14:27

懂了。把修改好的exe拷贝到游戏目录,运行,输入1回车,是不是直接回钱。搞定。{:301_1003:}

forrest888 发表于 2019-8-31 14:35

有意思,感谢分享
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 星际争霸v1.08修改作弊指令(上)