前言
星际争霸的作弊指令大家应该多有听过,但是有几个能够全部记住呢?老年人更是难上加难,今天我们就来解决一下这个问题。
PS:
有一段时间没有发文章,真的不是偷懒,单单是这一篇文章我就整理了三天,每天至少4-5个小时。有很多东西,做起来很容易,但是一到讲解的时候,总担心讲的东西太多,又担心讲的东西太少,来来回回整理了很多遍。
最终还是决定把这篇分成两部分:第一部分着重分析关键方法和地址,第二部分再来着重讲汇编。
相关基础知识请查看第一篇基础知识部分,不做重述。传送门
本文中大段文字的概念已经在目录标识,怕瞌睡的朋友可以跳过。
文章纯属研究,切勿商用。转帖请注明出处,谢谢。
步骤简介
- 按照流程图,分析出秘籍的执行是按下回车之后校验执行,先找到回车后执行的方法位置。
- 输入特定的秘籍,使用CE搜索秘籍内容,进一步确定执行秘籍方法的位置。
- 找到存放输入内容内存的位置,在按下回车的第一个将访问他的方法前面修改代码,更改内存值,达到快速作弊指令的目的。
详细步骤
关卡选择
首先还是选择单人模式→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”
逐行输入下列代码(啥意思下篇详解)
push eax 备份之前的寄存器内容,怕出BUG。其实这次的需求不写也行,好习惯。
mov eax,dword ptr ds:[ecx+0x14] 将输入内容读到寄存器eax中
cmp word ptr ds:[eax],0x31 比较输入的值是不是1
jne short 004ECDEB 这跳转你要看你们自己的,跳转到pop eax那一行
mov dword ptr ds:[eax],0x776F6873 内存写入"show"
mov dword ptr ds:[eax+0x4],0x20656D20 内存写入" me "
mov dword ptr ds:[eax+0x8],0x20656874 内存写入"the "
mov dword ptr ds:[eax+0xC],0x656E6F6D 内存写入"mone"
mov word ptr ds:[eax+0x10],0x79 内存写入"y "
pop eax 还原寄存器内容
call 004E6030 调用原来正常逻辑需要调用的方法
ret 返回引用处
然后回到004BEDFC处,将代码改为call 004ECDC0,也就是调用我们的这个方法。
PS:简单的说我们做的动作就是,在执行他本身的方法之前,插入了我们的判断。
接下来就是保存了,老规矩,“复制到可执行文件”→“所有修改”
弹出框选择“全部复制”,之后保存文件,名字随便改。
把修改好的exe拷贝到游戏目录,运行,输入1回车,是不是直接回钱了。搞定。
如果想要其他的秘籍也生效,只要接着写判断就行,在下篇中我们详细演示。
结尾
本来想一篇写完的,奈何篇幅还是巨大,随随便便就3000多字了,还没有包括OllyDebug的一些分析和汇编的分析,所以把这部分放到了下一篇着重分析。
再对破解的思路来一个总结吧:
- 使用“顺流”法往往会让你很快找到突破口。
- 按照游戏逻辑建立流程图,有利于对程序的分析。
- 使用“逆流”法往往会让你更快的找到修改点。
本次修改内容很多,附上修改后exe文件,7天有效。请大家切勿商用,支持正版。
链接:https://pan.baidu.com/s/1UpCbbYoBtkqgmzSlzSb_Mw
提取码:qwug
我是下集传送门