吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 63101|回复: 339
上一主题 下一主题
收起左侧

[原创] 植物大战僵尸修改器DIY(一)

    [复制链接]
跳转到指定楼层
楼主
丸子de爸爸 发表于 2019-9-24 15:24 回帖奖励
本帖最后由 丸子de爸爸 于 2019-10-19 16:09 编辑

前言

又偷懒的好久,美滋滋。本来这次准备做一下CS1.6的修改,但是考虑到如果要修改CS,必然需要讲到注入的方法,我们又还没有讲到注入,然后今天又发现动画区有人做了一个CS1.6的视频,得,我们还是继续基础班吧,哈,学好了基础,我们再去玩玩1.6,可以做出更多有趣的功能。

之前的星际争霸系列,是直接对exe进行修改,这样的方式会更加简单,将作弊植入了游戏中,但是同时也失去了开关的能力,我们无法控制作弊的开关状态,因为他一直是开启的。星际争霸系列传送门

如果想随时开关,就像外挂一样,那就需要使用注入了,就是我们今天要了解的内容。

这篇文章主要讲三个部分:

  1. 基址获取方式。
  2. 人造指针的制作。
  3. 简单AA脚本注入。(第二第三其实写在一起了,嘿嘿,凑点篇幅哈)

后续会专门有文章讲解,怎么使用AA脚本制作修改器。

欢迎文明转帖,请注明出处 丸子de爸爸。

所有技术只用于学习研究,请勿用于商用,请支持正版。

工具

项目开发中需要用到的工具:CE6.7(CheatEngine)

植物大战僵尸游戏本体(不同版本可能出现不兼容,以后也会讨论有兼容的解决办法)

本次基础概念

内存,一切皆内存,我们操作的全部都是内存。

所有地址相关的概念,都可以理解为坐标,用来给我们做标记的而已。

如果实在搞不明白,你想想指南针为啥指向北边,为啥叫南北,只是定义,只是公认

模块地址

简单理解,就是exe运行起来,加载到内存中的时候,系统分配给exe的首地址。

也可以理解为,内存是一个柜子,一共有40格,exe运行,系统把exe放到了第30格,然后模块地址就是30。

基址

以阳光为例,由于内存是动态分配的,我们每一次搜索存放阳光的内存地址都会不一样。

基址,就是指每一次分配我们都能通过偏移,来找到动态的地址,一般是由模块地址+固定的偏移实现。

例:我知道阳光在内存中存放地址,是模块地址+400的内存位置,所以阳光基址就一定是模块地址+400。所以动态就变成了,30格的时候,30+400。在40格的时候,40+400了。

指针

指针其实就可以理解成外号,你的外号叫二狗子,别人先知道你的外号,然后熟悉了才可以根据外号找到你的真名。

更多的用处是引用,就像别人往往更愿意叫你二狗子,而不愿意叫你真名一样。

例:一个指针叫做point,他指向内存的0xFF923200。那他就可以有两个作用,一个就是直接使用指向的内存地址FF923200;另一个可以直接查到FF923200里的值。

什么叫做注入

写出这个基础概念的时候,我就发现自己被自己坑了。暂时简单理解成,就像我们更改exe一样,在适当的地方,更改程序的跳转,使它执行我们需要的逻辑。

PS:有兴趣的可以自己去查一查,这个要讲我真的是讲不来,太多要讲了。

AA脚本是什么

AA脚本全称:AutoAssemble脚本,自动汇编脚本。可以理解为一个预先编辑好的逻辑,在适当的时候使用软件调用,就可以达到修改程序内存的作用。

功能实现

阳光基地址获取

此处仅介绍两种方法:

  1. 模块地址偏移法。
  2. 人造指针动态获取。

模块地址偏移法

实现方案

由于每次运行程序,内存都会动态分配,所以阳光在内存中的地址也会变化,于是我们需要尝试找到稳定的参照物。模块地址便是我们的着手点。

所谓的模块地址,就是exe加载到内存的时候所在的地址,他一般由进程名(模块名) + 固定偏移组成

例: PlantsVsZombies.exe + 2EF1A

由于模块地址是根据进程地址进行偏移,所以相对稳定(当然,目前没有发现不稳定的情况,但是话不敢说满),我们通过模块地址指针进行偏移,就可以得到阳光的相对地址。

流程图

由于设计到多重指针,比较复杂,下图中的阳光地址用A1代替

A3如果不是,继续向下寻找,直到找到模块地址。第一次选择改写,是为了方便定位到第一个指针,不然访问阳光的指针很多,很难定位

搜索阳光动态地址

打开游戏和CE,点击CE中左上角小电脑选中游戏进程“PlantsVsZombies.exe”

可以看到目前的阳光数量是150,我们在CE中输入150,按下首次搜索,如图,会出现一大堆结果

回到游戏,种植一颗植物,阳光减少。

回到CE,将数值改为50,点击再次搜索

结果变为了1个,双击列表中的结果,将结果添加到CE下方

双击数值数字那一栏,在弹出的框中改为500,确定

回到游戏,查看阳光数是不是变成了500,若没有,请重复之前操作。

若游戏内阳光变为了500,则说明阳光地址查找成功,记录地址,我这里是2DD89670

右键列表中的地址,选中“找出什么改写了这个地址”

不要关闭此窗口,回到游戏,种一颗植物或者收集一个阳光,让阳光发生变化

阳光变化后,回到CE,可以发现多出一条记录(我这里是收集了一个阳光,怕不一致的可以照着来)

双击记录,弹出窗口,记录红框位置的数据 指针2DD840F8, 偏移5578

勾选Hex,在搜索框中输入上一步找到的指针,开启新的搜索,我这是2DD840F8(每人都会不一样)

又出现了一大堆结果,这时不要关闭当前CE,再另外打开一次CE,开启一个新的CE程序,下文按先后顺序代称为CE1,CE2。

同时在植物大战僵尸游戏中,选择“菜单”-->“重新开始本局游戏”

此时你会发现,在CE1中,之前的阳光地址已经对不上了,因为阳光地址已经动态改变

切换到CE2,按照前面的方法,找到并记录新游戏的阳光地址,我这里是2DFBEDD8,方法不重复演示了

找到后可以关闭CE2,重新切换回CE1

点击手动添加地址,导入在CE2中记录的新阳光地址,点击确定

双击描述文字,可以对地址进行重命名

对新地址进行改写跟踪,按照前面的操作,找到新地址的指针为 2DFB9860

在搜索栏中, 输入新的指针,点击再次搜索,得到3个结果

我们可以看3个结果的地址,Windows中从004以后,才是用户的程序,所以,我们要找的就是第三个024BAE98

双击添加到下面列表中

这一次右键,然后就要选择访问了

点完访问是不是惊呆了,好多东西吧,没事,现在不需要你弄懂,你只要选靠前的几个mov中的其中一个双击

是不是看到了熟悉的东西,和之前类似,记录下红框内容,指针024BA630,偏移868

新建查询,上一步的指针024BA630,在1000多个里面,发现有几个绿色的,对了,这就是模块基址

分别查看4个地址的访问,只有其中一个是一直在被访问的,仍然是选择最前的mov,打开后如图

可以发现,我们已经很明确的找到了模块基址 ,我这里为PlantsVsZombies.exe+355F28

有兄弟反馈说,走到上面那一步,看不到模块地址,经检查发现,需要在CE中开启显示模块地址选项才可以,方法如下。


终于到了最后一步,仍然点击手动添加地址

按照之前我们找到的指针反过来写,最下面写模块基址,然后第一个偏移量是之前找到的868,接下来是5578

可以看到在地址那栏已经显示出了指针指向的地址,值为75,点击确定

可以看到,我们的指针已经指向了目前阳光的地址

接下来可以重新开始本局,会发现仍然是能够正确显示阳光值,这里就不截图了

删除掉其他多余的项目,只留下阳光地址指针,便可以通过修改数值,达到修改阳光的目的了

总结

整体逻辑按照流程图执行,中间之所以会选择改写地址,是因为多余地址很多,通过多次数据对比,来筛选出和阳光有关联的指针。你如果愿意一个个去试,只要耐心够,也可以找到。最终的结果为:

通过当次反推,一层层拿到基址。再从基址往回偏移,拿到最后每一次动态的地址。

为啥使用两个CE的原因?

我们要寻找的基址必须是不变的,也就是类似于船锚。

如果理解当前阳光地址是船,那么我们找到的那个偏移了5578得到阳光地址的地址就是锚。5578就是锚索。

程序每次就是根据他的地址,偏移5578,得到的动态阳光地址。

搜索了一遍锚的地址,是为了找到可能纪录锚地址的指针。(就是内存中存放锚的盒子)

重新开了第二遍游戏,我们可以通过阳光的动态地址,逆向推断出船锚的位置。

再根据两次船锚的位置(一般都是重用变量,所以盒子不会换),能确定哪一个内存是对应的锚。

综合以上,使用两个CE,只是为了更加快速的定位到我们需要的锚坐标。大家可以灵活运用。

人造指针动态获取

实现方案

我们在游戏第一次访问阳光地址的时候,将阳光的地址纪录下来,然后存到自己申请的内存地址。之后我们直接读取自己的内存地址就行。

流程图

使用人造指针流程就简单很多,在访问阳光的指令前执行脚本,将地址导出到人造指针给外部调用,难度主要是在自动汇编上。

注入地址搜索

先按照基础方法找到本次游戏阳光地址

找到阳光地址之后,查看什么访问了地址。选中mov那行,点击反汇编程序

汇编语句这里不着重介绍,大家只要知道,add是两数相加;mov是赋值语句,相当于mov a,b 就是 a = b

这里我们使用赋值语句,根据之前的学习,我们知道这句代码意思是将阳光值,赋值给EAX寄存器

PS:汇编语言基础大家可以稍微去找找资料,熟悉基础指令,但是想制作修改器,它是必学的。

进入内存浏览器之后,ctrl+M能显示模块地址,可以看到很多的模块地址

默认选中的那一行就是我们需要找的地址

自动汇编

选中在工具中,选择自动汇编

打开自动汇编后,模板中先选择“CT表框架代码” ,再选择“代码注入”

AA脚本编辑
[ENABLE]                              //脚本启动标志
alloc(newmem,32)                    //alloc为申明内存空间,alloc(分配的内存标签名,申请字节数)
label(returnhere)                   //申明标签,用做跳转
label(originalcode)
label(exit)

newmem:                             //这里让你写自己想要写的代码标签

originalcode:                        //这里是原来的代码标签
mov eax,[edi+00005578]

exit:                                //退出执行的标签
jmp returnhere

"PlantsVsZombies.exe"+9F2E5:           //注入的代码段地址,当前是模块地址
jmp newmem                             //跳转到newmem标签
nop
returnhere:

[DISABLE]
dealloc(newmem)                        //释放内存空间
"PlantsVsZombies.exe"+9F2E5:
mov eax,[edi+00005578]

选择完之后会生成上面的脚本。

AA脚本的执行顺序是,先找到注入代码的地址段,开始执行,之后按照从上往下逐行执行

[ENABLE]                              //脚本启动标志
alloc(newmem,32)                    //alloc为申明内存空间,alloc(分配的内存标签名,申请字节数)
label(returnhere)                   //申明标签,用做跳转
label(originalcode)
label(exit)
alloc(pointer,4)                                        //***为自己的指针申明内存空间,因为就8位十六进制,所以4byte够了
registersymbol(pointer)             //***将point作为指针注册到AA引擎中
newmem:                             //这里让你写自己想要写的代码标签

originalcode:                        //这里是原来的代码标签
mov eax,[edi+00005578]
                                   //下面是修改的代码
push eax                           //push用来eax存入栈里,完成业务之后,通过pop还原,保证原业务不出错
lea eax,[edi+5578]                 //将[edi+5578]这个值的地址赋给eax,不明白可以去查汇编lea指令
mov [pointer],eax                                  //让point的值等于阳光的值的地址,外部调pointer的指针就会得到阳光值   
pop eax                             //将eax值还原,不要引起逻辑异常

exit:                                //退出执行的标签
jmp returnhere

"PlantsVsZombies.exe"+9F2E5:           //注入的代码段地址,当前是模块地址
jmp newmem                             //跳转到newmem标签
nop
returnhere:

[DISABLE]                               //脚本关闭标志
dealloc(newmem)                        //释放内存空间
dealloc(pointer)                       //释放指针空间
unregistersymbol(pointer)                  //****释放指针
"PlantsVsZombies.exe"+9F2E5:
mov eax,[edi+00005578]

按照上面脚本修改完成后,点击自动汇编窗口的“文件”,“分配到当前的CT表即可”

指针调用

手动添加pointer指针,即可得到动态的阳光地址

总结

人造指针虽然涉及到自动汇编,但是在整体逻辑方面和工作量方面比基址方式要少得多,建议大家多多使用

注意造指针时,一定要选择访问地址,而不是改写,不然就只有在改写的时候会触发指针赋值了

本篇总结

获取基址只是开始修改的第一步,有了基址,我们便可以更改其中数值达到修改器的功能。

同时我们也可以通过注入的方式,修改程序代码,就像外挂那样,或者说,这已经是外挂了。

下章我们是继续挖掘植物大战僵尸新功能,还是直接使用易语言做辅助呢?留言吧...

第二集传送门

免费评分

参与人数 122吾爱币 +110 热心值 +117 收起 理由
gugong + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
87998455ss + 1 + 1 我很赞同!
无畏之宬 + 1 我很赞同!
sis5595 + 1 + 1 热心回复!
sorg + 1 + 1 我很赞同!
lemond + 1 + 1 我很赞同!
VANsMAN + 1 用心讨论,共获提升!
错过了一个亿 + 1 + 1 热心回复!
gzyz0123 + 1 + 1 热心回复!
张是我 + 1 + 1 谢谢@Thanks!
Tc5230 + 1 + 1 谢谢@Thanks!
xihua + 2 + 1 谢谢@Thanks!
潘小文 + 1 + 1 热心回复!
supernormal + 1 + 1 用心讨论,共获提升!
王墩墩 + 1 + 1 我很赞同!
安尼大大 + 1 + 1 我很赞同!
黑色流浪者 + 1 + 1 我很赞同!
thesunny + 1 + 1 热心回复!
改革先锋wzw + 1 + 1 谢谢@Thanks!
浅色笔录 + 1 我很赞同!
hbe592537 + 1 + 1 用心讨论,共获提升!
虔来学习 + 1 我很赞同!
Lichtquant + 1 + 1 热心回复!
swts + 1 + 1 谢谢@Thanks!
邧枫 + 1 + 1 我很赞同!
昔我往矣l + 1 我很赞同!
鲜芋仙手 + 1 + 1 用心讨论,共获提升!
未来只有靠自己 + 1 + 1 楼主,CE的调试模式还要换下,不然第二个CE打不开调试器
Pink1006 + 1 我很赞同!
shihappy + 1 我很赞同!
mc9568 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
cqoocq + 1 + 1 66666
SinnerDusk + 1 学习了
九四 + 1 + 1 用心讨论,共获提升!
铁拳丶L + 1 用心讨论,共获提升!
g20025 + 1 谢谢@Thanks!
漫天星斗裁做衣 + 1 + 1 学到了,研究研究
暖羽翼 + 1 + 1 热心回复!
半纸情书 + 1 用心讨论,共获提升!
忆缱绻 + 1 热心回复!
jzdmy + 1 + 1 我很赞同!
dsanke + 1 + 1 谢谢@Thanks!
怪发丶 + 1 + 1 为什么基址不变呢?
李华 + 1 + 1 谢谢@Thanks!
D调华丽 + 1 + 1 我很赞同!
感觉还在不在 + 1 + 1 谢谢@Thanks!
锦官城 + 1 + 1 谢谢@Thanks!
两耳就是菩提 + 1 + 1 热心回复!
676963JY + 1 + 1 我很赞同!
Ah.Dragon + 1 我很赞同!
德德哈哈 + 1 + 1 热心回复!
zt2167098328 + 1 + 1 谢谢@Thanks!
rong578951269 + 1 + 1 谢谢@Thanks!
lonelyの + 1 + 1 谢谢@Thanks!
皮卡丘卡皮 + 1 + 1 谢谢@Thanks!
cush + 1 + 1 谢谢@Thanks!
入道滴少年 + 1 + 1 谢谢@Thanks!
清晨的雨天 + 1 + 1 谢谢@Thanks!
海的那边 + 1 + 1 我很赞同!
dxlmn + 1 谢谢@Thanks!
我只想默默的 + 1 我很赞同!
据说是凯哥哥i + 1 + 1 感谢分享,学习了
Janem + 1 + 1 我很赞同!
lcy2016zxb + 1 + 1 用心讨论,共获提升!
you920928 + 1 + 1 谢谢@Thanks!
千幻不爱 + 1 + 1 我很赞同!
dreamcrazy + 1 + 1 热心回复!
艹123 + 3 + 1 谢谢@Thanks!
联合卡环 + 1 + 1 热心回复!
Faithful丶o + 1 + 1 我很赞同!
乄落日乀 + 1 + 1 用心讨论,共获提升!
毫无影 + 1 + 1 谢谢@Thanks!
mq5123 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
mhsytalc + 1 + 1 我很赞同!
旧巷里の猫 + 1 + 1 我很赞同!
lzp-9258 + 1 + 1 热心回复!
风雪庙 + 1 + 1 谢谢@Thanks!
TFBOYS_GDW + 1 + 1 谢谢@Thanks!
Huggo1995 + 1 + 1 我很赞同!
hyh0101 + 1 + 1 我很赞同!
yangyu173 + 1 + 1 热心回复!
期待丶 + 1 + 1 我很赞同!
浮生轩墨 + 1 + 1 热心回复!
gongyuchang + 1 + 1 我很赞同!
天尊小帅 + 1 + 1 用心讨论,共获提升!
sadie + 1 + 1 我用这个方法修改阿拉德英雄传.不行.网上倒是有周小杰修改器.
a2289206 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hardiness + 1 + 1 优秀。值得学习。
SF-10086 + 1 + 1 用心讨论,共获提升!
看到新大陆 + 1 热心回复!
W丶 + 1 + 1 谢谢@Thanks!
qinghuai + 1 + 1 谢谢@Thanks!
peter336620 + 1 + 1 谢谢@Thanks!
渐陌 + 1 + 1 热心回复!
小生请留步 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
fajia_1986 + 1 + 1 谢谢@Thanks!
饥饿滴小凤 + 2 + 1 秀逗!我才不愿意别人叫我二狗子
sherlockhk + 1 + 1 谢谢@Thanks!
15198759548 + 1 + 1 用心讨论,共获提升!
cdaxcy + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

  • · 好帖|主题: 550, 订阅: 86

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
 楼主| 丸子de爸爸 发表于 2019-9-28 02:38 |楼主
本帖最后由 丸子de爸爸 于 2019-10-19 16:11 编辑

自己又过了一遍,发现有些地方的排版看起来很不舒服,重新排了一边。AA脚本里面有一个格式错误和一个代码错误,分别为pop eax和unregistersymbol(解绑注册人造指针)。现已更正,给大家带来的误解或者不便,非常抱歉。以后会尽量多检查几遍再进行上传。
发现还是有一些缺陷,就做一个修改纪录吧,方便大家查看。
修改纪录:
2019/10/19:
  • 新增可能出现的模块地址不显示解决办法。
  • 总结中新增了为何使用2个CE的解释。
来自 #
 楼主| 丸子de爸爸 发表于 2019-10-19 15:53 |楼主
W丶 发表于 2019-10-19 10:43
找不到PlantsVsZombies.exe+XXX这样的怎么搞,全都是

我刚才又去跑了一下,验证了猜想,因为你在CE里没有开启模块地址显示。
开启方法:


开启了之后,你再查看详细信息,就变成了模块地址 + 偏移地址啦
这篇文章写得比较早,所以可能有些地方会有点不清楚,我也觉得重新编辑整理一下,把这一部分也加入进入,抱歉带了困扰了

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
rong578951269 + 2 + 1 谢谢@Thanks!

查看全部评分

推荐
继续漂流吧 发表于 2020-3-1 18:29
q353391545 发表于 2020-2-13 15:52
请问怎么激活脚本,谢谢

就是左边有激活那一列表,你把需要的选中就可以了
推荐
woawapj 发表于 2019-9-24 16:44
学习一下了
推荐
 楼主| 丸子de爸爸 发表于 2019-11-21 20:07 |楼主
德德哈哈 发表于 2019-11-21 17:53
老哥mov   lea 怎么分的啊!!!!!!!!!!

谢回复,这个比较复杂,建议感兴趣自己百度。
简单理解,mov是针对值;lea更多用于地址,也就是指针。
但是又和赋值的变量是否是寄存器和赋值的值是否带[]标志。
这里有一个我觉得挺好的介绍,你可以理解下
https://blog.csdn.net/fengyuanye/article/details/85715565
3#
清炒藕片丶 发表于 2019-9-24 15:39
沙发下,看到逻辑图就知道很牛逼。
4#
yanmingming 发表于 2019-9-24 15:43
学习一波
5#
海天一色001 发表于 2019-9-24 15:59
认真学习了,感谢楼主!!!
6#
bachelor66 发表于 2019-9-24 16:00
厉害,清晰明了。                             
7#
siemens113 发表于 2019-9-24 16:03
没啥新鲜感了这游戏
8#
alicc 发表于 2019-9-24 17:30
楼主这流程图是用什么工具做的。
9#
 楼主| 丸子de爸爸 发表于 2019-9-24 17:32 |楼主
liphily 发表于 2019-9-24 16:51
直接把自动汇编保存在ct中,然后用别的编程工具按字节读写就行了,真是一个简单而又天才的方法啊

虽然理论是按字节读取,但是不用自己做的,有个叫做AA引擎的dll,就是干这个的
10#
 楼主| 丸子de爸爸 发表于 2019-9-24 17:33 |楼主
alicc 发表于 2019-9-24 17:30
楼主这流程图是用什么工具做的。

markdown自带的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 23:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表