首先呢我们先打开任意的一个浏览器, 好,打开之后呢在这边呢去搜索一下,搜索什么一下什么的按键精灵, 点击第一个网页按键精灵二零一四正式版。啊, 好,来到这里面之后呢这边呢有一个论坛有一个下载中心,我们呢先点击一下这个下载中心, 下面呢有一个 pc 端有一个手机助手,手机助手的话就是去开发安卓脚本的, pc 端呢就是去开发电脑脚本的,我们在这里呢去进行一个立刻下载。 好,点击打开。 呃,这里呢修改一下它的一个安装位置啊,安装在 c 盘里面, c 盘是系统盘嘛?好,点击一下开始安装, 点击立即体验。 好进入到这个页面当中来,让我们来看一下这边有一个录制脚本,对吧?作为一个新手呢,我们不懂呢,呃,这个按键精灵是什么也不懂呢, 呃,如何的去进行编辑代码,对吧?我们只知道呢脚本呢是一个自动化的工具,那么呢我们可以在这边呢点击下录制脚本, 然后呢去进行一个开始的录制。好,在这里呢去点击下当前的网页,然后呢去进行关闭,接着呢去进行打开。 好,再接着呢把它给去进行缩小,在这里呢点一下结束,然后呢呃,点击结束之后呢点击保存,保存这一下这个录制好,我们来运行一下这个脚本。 好,那么这就是脚本的一次循环啊,如果说步骤多的话呢,可以多录几步,把这个所有的步骤啊全部的给他录下来。呃,在录制的过程当中呢,需要注意一点就是如果说步骤非常多的话呢,我们不要去点击的速度非常快,那就说呢 我们呢可以去进行一个,比如说点击一下这一步,然后呢等待一个三四秒钟的时间再去点击下一步,然后呢再去等待三四秒的时间再去进行一个点击, 如果说呢速度非常快的话呢步骤非常多,很容易出错。我们在这里呢去进行一个 双击啊,去进行一个双击, 然后呢可以看到呢这就是已经录制好的这样的一个的脚本。 在这里呢也可以去进行一个调试啊,也可以让这个呃脚本去进行一个运行,点击这个启动就可以运行了,或者说呢按下键盘上面的 f 十。 如果说呢我们想要让这个脚本啊不断的去运行,对吧?现在呢这个脚本啊只是执行一遍,对吧?我们想让它呢去不断的去运行,上面呢需要给它加一个循环, 呃,当然呢作为新手我们不知道这个循环是一个什么意思,对吧?那我可以按照这边的一个写法直接的给它写上去就可以了,上面呢加一个 d o, 呃下面呢加一个这个代码好, 然后呢这个脚本啊在运行的时候呢就是不断的会去执行的。 好,我们点击下调试啊,然后呢点击下启动 好,可以看到呢它开始第二遍的一个循环了, 如果说呢你那边的一个,呃需要操作的步骤比较多啊,那么也可以把它全部的给录下来,需要注意下它的一个延迟的时间,也就说呢呃点击之后呢每一步的一个等待的一个时间。
粉丝3355获赞1.4万

我们玩的游戏本质上来说是一个好玩的程序,既然是程序,那它就有规则,商店里物品的价格是你看到的五十一百、一百七十五,而你拥有的阳光不过是某个内存地址中不断跳动的数字。游戏设计师定义了这套经济学, 你种下一颗向日葵,阳光从五十变成零,程序定死了一株向日葵花,五十阳光。但如果我说这套经济学是可以被推翻的呢?我们只需要用一行会编指令,就可以把所有的阳光消耗全部改成一。 今天这期视频,我就带你一起扒开游戏的大脑定位,呐喊叩见阳光的指令,手写一个游戏小外挂,把价格踩在脚下,实现真正的阳光自由。当季游戏运行时,所有动态数据,比如阳光植物或僵尸的血量,其实都是存储在内存中的。 举个例子,我们种下一颗植物,阳光就会减少,内存里对应的数据也会随之改变。 我们今天就借助业内大名鼎鼎的 c e, 顺藤摸瓜,精准定位到阳光在内存中的真实地址。我们就使用原版的植物大战僵尸版本号如下来做一期实战演示。首先打开 c e, 选中植物大战僵尸的进程,点击附加, 在右侧输入当前的阳光数值,点击首次扫描。接着回到游戏,随便种一颗植物,让阳光减少, 切回 c e, 点击再次扫描看,现在只剩下一个结果了, 我们可以修改这个数值测试一下。 回到游戏,阳光的点数也跟着变了,说明我们找对了,这就是阳光所在内存中的地址。接下来是重头戏,右键点击这个地址,选择找出写入该地址的来源,回到游戏,再次种下一颗植物, 面板上会跳出一条 m o v 指令, m o v 就是 英文 move 移动的缩写。用大白话来说,这条指令的意思很简单,就是把 esi 盒子里的东西塞进 e d i 抽屉的某个特定格子里, 它有点像编程语言里的赋值操作,但又不完全一样。这里我们先挖个坑,后面会专门出一期视频来详细拆解。会编指令复制这个地址, 点击停止,注意这里一定要关闭 ce, 现在记下这个内存地址,打开 x 三二 debug 调试器,注意看游戏是三十二位的,所以这里我们一定要用对应位数的调试器。点击文件附加,找到游戏进程, 按下快捷键, ctrl 加 g, ctrl 加 v 粘贴,直接跳转到刚才找到阳光地址的位置, 接着点击左侧红色按钮,在这里下一个断点,回到游戏,再次消耗一次阳光,程序就会啪的一下停在这里。 大家知道,在游戏的代码里,阳光其实就是一个数字,当你种下一颗向日葵时,程序会翻开它的阳光账本,做一个减法操作。我们今天的终极目标就是 揪出这个做减法的动作。那问题来了,怎么在这堆代码里找到扣除阳光的指令呢?其实很简单,因为程序是从上往下执行的,我们只需要顺着断点往上找 看,这里有一条 sub, e s i 逗号 e b x, 这个 sub 就是 英文单词 subject 的 缩写,它就是我们要找的幕后黑手。点击继续执行, 在 sub 这一行的位置下一个断点,再次回到游戏中一颗植物,可以看到断点正常停下, 点击这一行,注意这个位置。 e b x 有 一个值,是一个十六进字数,打开计算器,把这个数转成十进字,看看,刚好对应植物的价格。 那么问题来了,我们是不是可以修改 e、 b、 x 的 值,把它改成一呢?这样不就达到我们的目的了吗?每次种植植物都扣一点阳光,这样做可以吗?这里直接说答案,不行,我们可以来试试看,直接修改这个 x、 b, 把它改成一,点击这一行,按 空格弹出对话框,删除 x b, 把它改成十六进字的一, 点击继续执行。可以看到 x debug 底下出现了一个报错, 我们解除附加试试看。哦豁,程序闪退了,并出现了一个致命错误,所以我们直接这样暴力修改肯定是不行的。那该怎么办?我们要明白为什么会这样?这里就涉及到会编里一个非常核心的概念,机器码长度。在会编里, sub esi 逗号零叉零一,这条指令对应的机器码是八三, e e 零一刚好占三个字节,但是原来的那条指令只占两个字节,当你强行用三字节的指令去覆盖原来只有两字节的位置时,多出来的那个字节就会越界。 这就好比什么呢?机器马就像是斜死在马路上的车位,原来那个车位只允许停一辆宽两米长的车,你非要强行塞进去一辆宽三米长的车,结果就是多出来的车头直接怼进了隔壁的车位, 把别人停在那里的车给刮蹭了。程序的逻辑全乱了,游戏当然就崩溃了,所以这样简单粗暴的暴力修改肯定是行不通的。那到底该怎么优雅的实现修改呢?既然暴力修改会撞坏隔壁的车,那我们换个思路。 前面我们说过,原来的指令 sub e s i 逗号 e b x 刚好是两个字节。那我们能不能自己量身定制一条同样是两个字节,又不会破坏原程序的指令, 完美的把它替换掉呢?哎,答案是,当然可以。这里我们就要请出两位黄金搭档。第一位是 d e c e s i 指令,它的意思是让 e s i 里的寄存器的值减一,这条指令的长度刚好是一字节, 那是光有它还不行,还差一个一字节才能凑够原来的两字节。这时候第二位搭档 nope 指令就闪亮登场。 nope 指令的全称是 no operation, 翻译成大白话就是啥也不干,专门用来占车位。长度刚好也是一字节。我们把 d e c e s i 和 nope 组合在一起,一加一刚好等于二,这样我们不仅能够完美地凑够原来的两个字节,还巧妙地避开了越界崩溃的风险。接下来我们来验证一下,在 x 三二的 bug 里, 把原来的代码替换成这两条新的指令, 点击继续执行。回到游戏,再种一颗植物试试看,阳光只扣减了一点, 我们成功了。知道了这个过程,我们就来写一波代码吧。把刚才逆向调试的过程打包成一个专属的小外挂。首先打开 wechat studio, 新建一个空项目, 找到解决方案管理器,右键选择添加新项目,在弹出的模板列表里选择动态链接库。哎,也就是大家常说的 d l l 文件, 为了保持项目干净,我们把系统默认生成的那些文件删掉,只保留核心的 d l l 那 文件。 这里有一个小细节,熟悉 c 加加的同学可以直接保留默认的点 c p p 后缀。不过因为主播个人对 c 语言更加熟悉,所以我们这里手动把后缀改成了点 c。 咱们今天就用 c 语言来编写这个外挂。 在正式开始敲代码之前,我们还需要结合这个 d l l 项目做一个关键的小配置,这一步非常重要,大家跟着我一步一步来。 首先在解决方案管理器里右键 dl 项目名称,选择最底下的属性。 接着在左侧的树状菜单中找到 c 杠 c 加选项,在它前面的小箭头点击展开,然后找到预编一头,最后在右侧的预编一头下拉菜单里 把它改成不使用域编辑头文件,然后点击保存。为什么要改这个呢?这里简单的科普一下。因为 vs 默认会开启域编辑, 如果不关掉它,我们等会写 c 语言代码的时候,可能会报错,说找不到某个库之类的文件,把它关掉,避免后续的麻烦。接着在原来的空项目里新建一个文件,输入 index 点 c。 看到这里,我想观众朋友们应该已经明白我要做什么了,没错,就是 dl 注入。如果不明白 dl 注入是什么,可以看我晚期的视频。那么什么是 dl 注入呢?为什么要用它? 简单的来说,我们的终极目标就是强行让游戏加载我们刚刚自定义的这个 dl, 一 旦注入成功,我们的代码就会像特洛伊木马一样直接潜入游戏的内部,在他的内存里执行。 只有拿到了游戏的最高权限,我们才能随心所欲的修改它的底层逻辑,真正的实现我们刚才说的种花只扣一点阳光。 代码如下,首先定义一个查找进程 id 的 函数,接着在游戏进程里开辟一块新内存空间,然后调用 right process memory 把自定义的 dl 写入到游戏进程里。 要用 windows 系统的 load library 函数来加载 d l l。 最后创建远程县城,让游戏来执行我们的 d l l。 接下来看 d l l 梦碟 c。 首先获取游戏在内存中的 g 地 址,使用 g 地址加偏移量,找到刚才那条萨布指令的地址。接下来是 d e s 和 no 指令对应的自解码,这个自解码可以在 x 三二 d bug 中这个位置看到 程序的基地址,可以在预制面板中找到偏移量,可以使用 sub 的 地址减去基地址来计算,这是一个固定的值。这里给大家通俗的解释一下什么是基地址和偏移量。我们可以把程序在内存中的运行想象成搭成地铁。 假设你今天从人民路去奥体中心,是从第六节车线上车的,明天你从奥体中心回家,依然还是习惯从第六节车厢上车。在这个过程中,无论这趟地铁停靠在哪个站台。哎,这就好比游戏每次启动时系统分配的基地址 可能都不一样。第六节车厢距离第一节车厢的位置永远是固定不变的,这段固定的距离在逆向工程中被称为偏移量。所以不管游戏怎么改变基地址, 我们只需要记住这个相对距离就行了。在代码里,我们只需要用当前获取的动态基地址加上这个固定的偏移量,就能像导航一样精准不误地找到那条 saf e s i 逗号 e x b 指令的绝对地址。 最后通过解锁权限、偷梁换柱、重新上锁。这三步一气呵成,我们就能够神不知鬼不觉地修改游戏的核心逻辑。现在重新启动一下游戏,编一项目, 在 d l 梦点 c 的 这个位置下一个断点,把游戏添加到附加进程中,调试 找到 inject 点 c 点 exe 运行,可以看断点正常停下, 点击继续执行。种一颗植物试试,可以看到消耗已经是一点阳光了,这说明我们的代码已经被游戏成功执行了,这就是游戏底层模改的全部技术细节了。




我们在使用 ae 中套模板是非常常见的,比如说我这有一个模板,我需要套他,我是不是得点到他每一个层里面去,然后我要去里面一个个找对应的图是哪一张,得一层层的进去,然后我拿张图进来替换他,然后我如果想去改这个文字,那我要重新去找这个文字在哪里,这样一层层的去找,一层层的去改,一层层的去调,其实非常麻烦, 我做了一个 ae 模板修改器,就是解决这种模板修改,让它更快捷、更方便。好,我们先看上面的按钮, 这里有一个完整工程和当前位置,完整工程就是扫描整个工程的图片和文字,但是完整工程扫描的非常多,其实不是很直观,所以我建议直接用这个当前位置,当前位置就是你指针所在的位置 所触碰到的合成,然后它包含的内容,比如说我现在指针在这里,然后点当前位置,它就只识别当前位置里面的内容,这样就更明确的看到我们需要改的东西。比如说这张图片吧,我可以点击它的显示和隐藏看一下,哎,就是这张,对吧?然后换一张 文字,同样也可以通过这种方式你就能知道我们要改的是哪个文字。然后如果我们想进到合成里面去修改,我可以直接点击定位, 对,他就会直接定位到选择的内容,然后图片也一样,你点击图片,然后点击定位好,然后就定位到我们选择的这张图片了。好,我们现在回到主合成,然后我们如何去修改图片和文字呢?我们先看文字,比如说这里有个二零幺四,那对的是这里二零幺四,我们可以 看一下是这个合成。对,然后我们可以改它的字体,可以改它的颜色,还可以修改它的文字,比如说我想修改成二零二六,对吧?直接改成二零二六。如果想修改成一个换一个字体,可以直接选选字体,然后也可以收藏字体, 然后收藏过的我们双击这个字体就可以直接给他替换掉,但我觉得它文字太长了,给它删掉,然后给它换一个字体。好,然后我想如果想让它居中的话,我们也不用到合成里面去做,直接可以在这里调整它的位置, 然后想加描边,我们也可以去添加,直接拖动它的属性,然后它的描边透明度啊, 还有填充透明度都是可以去调节的。然后它的段落还有它的样式加粗,然后倾斜它的字号我们也可以调,就所有的属性我们直接在外部去调,不用到每个合同里面去找它去调它了,然后这里有布局,对吧?都是可以调的。 我们定位到这个文字去看一下,对,看我现在居左居右,然后居顶啊,然后你看直接可以调外部的属性。好,我们现在返回到主合成, 然后如果我们改完这个之后,我们想要他的属性和他的文字,可以直接复制样式,然后比如说我复制给其他的合成, 然后这里,对吧?我想统一刚才那一个,那我可以识别当前位置,然后找到同一个,然后把这个样式粘贴给他,对,然后他就同步了刚才我们制作好的样式,现在我们来看怎么去更换这个图片?我先找找这个图, 比如说我想把这个高楼的,比如说我先把这个高楼替换一下,我先看它是哪一张, 这一张然后我怎么替换呢?我可以直接把另一张图片拖到他身上去,这个时候我们就替换掉了,这个时候如果你发现大小不合适,我们就可以给他调大一点, 好,我们再换张图试一下,我们换这张,对吧?就是这张,然后把图直接拖上去。好,然后大小可以调一下, 就我们直接可以在外层去调节它的每一个属性,我们就不用去合成里面,去单独去找到它,去调节它了,就非常的方便,非常的快速的去改模板。