残夜的自制植物心得分享(上)基本子弹修改的实现

您所在的位置:网站首页 豌豆射手的一生 残夜的自制植物心得分享(上)基本子弹修改的实现

残夜的自制植物心得分享(上)基本子弹修改的实现

2024-07-15 22:13| 来源: 网络整理| 查看: 265

大家好,这里是残夜。今天我就把鸽了很久的自制植物的一些心得带给大家!

友情提示:残夜只是CE萌新,对于一些概念和操作的描述可能不是那么精准,还请所谓的“大佬”们绕道,不必来我这里彰显你的优越感。接下来马上开始:

在我前面的一期视频里出现了我尝试的第一个自制植物:随机子弹射手,实现这个植物需要学习CE和汇编指令的一些相关知识,在此我就不再赘述,CE自带的教程在这里就够用,汇编指令这里用到了MOV指令和CMP,JE指令。在此简单介绍一下。MOV指令的用法是:MOV A,B 意义是将B的值赋给A。比如,A=1,B=2,执行完之后A=2,B=2。

CMP是比较指令,CMP A,B 通过两个数的比较结果来决定下一步操作,这里我们配合的是JE指令,CMP下面接JE的意思是“等于即跳转”,比如上一步执行完之后A=B=2,那么CMP A,B JE 00651100的运行结果是程序跳转到00651100开始执行。

接下来就是如何去寻找要修改的区域了。在程序运行过程中,数据是放在内存里的,因此如果我们在内存里找到了相应的位置,并对其进行修改,那么程序的表现自然也会变化。

那么你可能会问,我们直接去问那些修改过的大佬要地址,然后直接修改不就行了么?实际上大多数情况不是这样,因为在程序执行过程中,很多数据所在的位置是一直变化的,甚至每次运行程序都会变化。在这种情况下,指针的存在就解决了这个问题。指针会一直锁定它所指向的地址,因此我们总是能通过指针来找到我们要修改的地方。PVZ的指针已经由某位退圈大佬找出并提供给我们,在此感谢他对PVZ自制做出的贡献。

那么接下来就是思路的寻找了。我们要修改子弹,要从哪里入手呢?这里我要讲一个工厂的故事了。豌豆射手相当于一座工厂,生产着化工产品(豌豆),它的内部有很多流程,但是如果它的工艺被故意篡改了,它就会生产另外的产品(其他子弹)。但是豌豆工厂很大,内部比较复杂,我们最好的“潜入”时机,就是豌豆运出工厂的时候给它掉包,换成其他子弹。这里可能会有人说我啰嗦,直接说该修改哪里不就行了么?实际上,每次你去修改的时候都需要自己寻找思路,残夜在这里是为大家提供一个寻找思路的方法,毕竟我相信你们不是非常急功近利的人。

接下来就正式开始修改。打开CE找到进程这些就不再说。接下来我们通过查看指表,找到子弹类型的指针,它锁定着子弹类型。第一颗子弹类型地址是[[[[6A9EC0]+768]+C8]+5C],点击添加地址,如下图填入指针和偏移。(上下文的CE基础都在教程里教学过,请大家务必先学习教程)

点击右下角名字可以任取

  之后我们要找到进入工厂的“入口”,找到生产过程中的“破绽”:右键点击“找出是什么改写了这个地址”,提示中点击第二项找出是什么改写了该指针指向的地址,

如图

之后观察生产过程——回到游戏,让场上的一个豌豆射手发射一颗豌豆,马脚就露出来了!

第二条

点击第二条指令,点击显示反汇编程序,进入内存界面。

面对浩如烟海的指令和数据,我们先不要管,点击工具—自动汇编,开始修改豌豆的生产流程!

点击右上角模板—CT表框架代码,CE会自动给你生成一个框架,这个框架代码是CE的一种规范,它能帮助我们更简单地进入工厂。再点击代码注入,将我们要操作的代码放进去。

现在我们就要分析这段代码了。

mov [ebp+5C],eax

mov eax,esi

这两句指令好像看不出什么东西,但是值得注意的是,5C这个值好像非常熟悉,这不就是子弹类型的数据所在位置吗!你可能会问了,你这不是蒙的吗?但是大家不要忘了,我们现在正在豌豆工厂的内部进行探索,且不说指针表里还有没有第二个5C这个偏移量,即使有的话,生产僵尸的工厂的工艺会出现在豌豆工厂里吗?这一步其实就是最难的一步,有时我就会看不懂指令的意义,我也会去一行行去分析,但是这种直觉还是有必要的,毕竟成千上万的指令我们不可能全部去理解。那么接下来咱们就实验一下!你们可以在两句之间插入一条指令:mov eax,A。A是合法的子弹类型编号。这里就留一个简单的问题给你们了:如何找到所有合法的子弹类型编号呢?已知豌豆是0。这里我把它改成3,先点击文件—分配到当前CT表,

再点击执行,选择注入,成功了!豌豆射手打出了西瓜!

然而马上你就会发现,不仅是豌豆,所有子弹也变成了西瓜……这时该怎么办呢?CMP指令就该出场了!在下面地址栏找到你刚才保存的脚本,打开,在上面几行label下面附加一行混入其中:label(change)。这句话表示规定了一个程序段的名称为change,

我们可以在下面写一个

change:

代码

代码

这样的一段代码。为什么要给代码名字呢?当然是给JE跳转一个目的地!在newmem下面写下cmp代码:

   newmem:

  cmp eax,0

  je change

如果eax是0,即这个子弹是豌豆,就跳转到change执行。接下来我们就要写change了。在mov eax,esi下面空一行,写change代码:

change:

mov eax,3

mov [ebp+5C],eax

mov eax,esi

再次执行,你会发现……发现并没有卵用,还是那样。这是因为脚本语言是顺序执行,你想的是如果cmp满足就执行change,然而如果不满足的话,这个脚本走到最后还是会执行change。因此我们需要让它不满足的时候执行完原来的代码就跳出去!这里我们使用jmp指令,jmp是强制跳转,不管如何,执行到这里就跳转。在原代码的末尾加上jmp exit,即退出脚本继续原程序,

效果

点击运行,真正成功了!只有豌豆变成了西瓜,其他的植物一切正常!

最后代码如下:

[ENABLE]

//code from here to '[DISABLE]' will be used to enable the cheat

alloc(newmem,2048)

label(returnhere)

label(originalcode)

label(exit)

label(change)

 

newmem:

cmp eax,0

je change

 

originalcode:

mov [ebp+5C],eax

mov eax,esi

jmp exit

 

change:

mov eax,3

mov [ebp+5C],eax

mov eax,esi

 

exit:

jmp returnhere

 

"PlantsVsZombies.exe"+6C769:

jmp newmem

returnhere:

 

 

 

 

[DISABLE]

//code from here till the end of the code will be used to disable the cheat

dealloc(newmem)

"PlantsVsZombies.exe"+6C769:

mov [ebp+5C],eax

mov eax,esi

//Alt: db 89 45 5C 8B C6

那么第一部分的教学先到这里,虽然还没有讲完,但是到这里篇幅已经太长了,所以下一期我会介绍给大家随机子弹的实现(如果实在感兴趣可以私信问我)。修改的代码其实一点不重要,修改的思路永远是最重要的。希望大家不要机械学习代码写法,要去自己探索思路,才能制作出优秀的自制植物!

 如果你感觉这篇文章对你有帮助,就点个赞投个币支持下残夜吧!这里是残夜,我们下次见!

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3