Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别

学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别

作者头像
IBinary
发布于 2018-08-30 09:18:29
发布于 2018-08-30 09:18:29
3.6K20
代码可运行
举报
文章被收录于专栏:逆向技术逆向技术
运行总次数:0
代码可运行

一丶静态基址. 动态基址. 基址的区别

 通过上一讲超级马里奥的游戏外挂技术制作.我们学习到了静态基址.以及观看内存区域得出相关偏移出的静态基址.

那么什么是静态基址.什么是动态基址. 什么是基址.

1.静态基址

  静态基址指的是.程序在启动后地址是不变的.游戏关闭后重新启动.那么地址也是不会变的.我们通过逆向技术直接对其修改那么则可以进行我们的外挂制作.

2.动态地址.

  动态地址是指当前地址保存了我们想要的属性信息. 但是当游戏重新打开.的时候.其当前地址的信息已经不是我们的信息了.所以我们要寻找基址.

3.基址

  基址指的就是最顶层的地址. 这个地址是不会改变的.除非游戏重新编译.或者增加减少成员.

二丶以植物大战僵尸为例.寻找当前动态地址.

植物大战僵尸这款游戏.相信我们大家都应该玩过.那么我们通过这款游戏.来学习 动态地址. + 基址的寻找方法. 

文字简介:  CE附加植物大战僵尸进程 -> 搜索阳光数量(精确数值 4字节搜索) -> 改变阳光数值 -> CE再次搜索改变之后的数值.

改变阳光数值.点击再次扫描.进行新的搜索.

通过在次扫描之后.我们得出一个地址.这个地址是一个动态地址. 怎么判断是否是动态地址.

1.我们首先修改这个地址里面的值. 看看是否能把阳光修改 (已经测试.可以修改.不截图说明了)

2.我们重新打开游戏.看看当前地址里面的值是否是我们阳光的值. (不是,已经测试)

经过上面两个步骤.我们可以得出.这个地址是一个动态地址.所以我们还要继续向上寻找.

三丶寻找基址.

  通过上面的地址我们知道这一个是一个动态的地址.那么我们需要找到基址应该怎么寻找?

思路: 如果找到一个动态地址.那么修改阳光肯定会修改这个地址这个地址里面的值. 所以我们可以下一个写入断点

1.我们可以用CE 下写入断电. 找出什么修改了这个地址

2.我们可以用OD / x32Dbg 下写入断点

上面两种方式都是可以完成的.

我们双击打开反汇编

可以看到里面的值是 add[eax + 0x5560],ecx

那么我们寻找到了一级偏移. 5560

那么这里涉及到偏移. 我们讲下原理吧.

其实很简单.植物大战僵尸编写的时候都是对象或者结构体成员.

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Plant
{
   
    ......
    int sunNumber;  
}

而在汇编指令中则是 结构体到地址 + 偏移 得出 阳光的个数.

所以我们要继续寻找结构体首地址. 也就是谁保存了结构体首地址.所以根据上图汇编得出.我们需要继续寻找eax

继续寻找eax

CE 以16进制搜索eax的值

根据上图可以得出. 一个地址里面保存了结构体的值. 那么猜想这个可能就是结构体的首地址了.我们使用CE的手动添加地址添加我们的偏移看一下.

我们也不知道上面的地址那个是保存了结构体的地址. 不过CE一般都是前五个.当前也不一定.可以尝试一下.

根据上图我们可以得出 0299a4a0地址的内容是结构体首地址. 根据CE的手动添加指针.我们加上我们的偏移.可以得出阳光的地址.(对地址取内容则是阳光的值)

现在我们找的这个地址还是一个动态地址. 所以我们要找一下什么访问了这个地址为什么是访问? 因为要操作阳光.肯定会访问这个地址. 如果修改阳光则会修改这个阳光的值.

因为这个地址保存了结构体首地址.那么他肯定不会改写了.所以肯定会访问.所以我们找一下访问的地址.

 根据上图的值, 看汇编代码得出 mov esi[edi + 0x768] 访问了这个地址.

那么同理 [edi + 0x768]保存了结构体的地址. 那么edi 是一个新的结构体的地址. 而我们进行搜索的时候会发现其实这是一个结构体的嵌套.

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct aaa
{
    .......
    struct plant plant    //0x768
    {
        int SunNumber;  //0x5560
    }
}

所以我们要继续寻找edi是谁保存了.

继续寻找edi的值我们发现有几个绿色的值.一般遇到这个很有可能是基址了.

那么我们尝试一下.使用CE自带的手动添加地址.

确实是我们的地址.那么我们继续看谁访问.

发现我们地址都是这样了.汇编指令 mov reg,[常量地址]   那么则确定我们找到了我们的基址了.

原理:

  如果对基址不太熟悉.那么熟悉C++语法的大概能明白.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct aaa
{
    struct plant
   {
          int SunNumber;
   }
}


aaa *p= new aaa;

new aaa 是我们的结构体首地址

new aaa + 768 = plant结构体的首地址

new aaa + 768 + 5560 = 阳光个数的地址

那么我们知道 new aaa是一个无名对象.所以肯定有一个变量保存着.
所以 *p 这个变量就是我们寻找的基址.

p + 768 + 5560 = 阳光个数地址
*(p + 768 + 5560 ) = 阳光个数.
所以我们找的基址就是p的地址. 而p保存的就是 new aaa的地址 new aaa中保存了 plant结构体的地址.

如果不理解也可以滤过. 熟悉我们的寻找方法即可.

通过上面我们的汇编指令.

add [reg + 0x5560],ecx       注意reg代表是任何寄存器.   add指令在汇编中是增加的意思. []的意思是对这个地址的内容进行操作

上面的汇编指令的意思是: 对 reg + 5560 的这个地址进行操作.因为带有中括号.[] 所以意思是对reg + 5560这个地址里面的值进行操作.

mov reg,[reg + 0x768]. 内容同上.  mov 指令是传送指令.  也就是将这个地址里面的值辅赋值给左操作数.

[[[6A9EC0] + 0x768] + 0x5560] = 阳光的地址.

所以我们可以写程序来实现增加阳光跟减少阳光了

C++ :  学习OpenProcess  WriteProcessMemory  //注意: 在调用OpenProcess获得进程句柄前.需要获得进程PID.  可以通过FindWindow 查找窗口句柄.然后通过GetWindowsThreadProcessID() 通过窗口句柄获取进程pID. 当前也可以通过 进程快照.遍历进程.得出进程PID.都是可以的.具体不在累赘. 

易语言: 因为使用了超级模块所以 熟悉 取进程ID  十六到十 写内存整数型即可.

因为易语言实现简单.所以直接使用易语言写一个了.

 总结:

  通过这一讲.我们学习了 add 汇编指令. mov 汇编指令. 以及结构体在汇编中表现的形式. 例如 [reg + 5560] 这样的其实是结构体偏移.

学会了如果通过动态地址寻找基址.

课堂资料下载:  链接:https://pan.baidu.com/s/1DDWfx68wi37Dc2OV2aTpqQ 密码:3w2x

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
知识点,为什么是访问..也让我彻底了解了和访问的区别..真是相见恨晚的文章啊
知识点,为什么是访问..也让我彻底了解了和访问的区别..真是相见恨晚的文章啊
回复回复点赞举报
大佬就是大佬..原来他们都给我讲多级指针这样讲,晕头转向的..用结构体讲解瞬间清晰明了,让我获益良多..
大佬就是大佬..原来他们都给我讲多级指针这样讲,晕头转向的..用结构体讲解瞬间清晰明了,让我获益良多..
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
植物大战僵尸:逆向分析阳光
植物大战僵尸这款游戏可以说是很多90后的回忆了,基本上只要是90后或多或少的都接触过,而玩游戏与制作辅助是两个概念,今天我将给大家分享一些游戏辅助方面的制作技巧,之所以使用植物大战僵尸这款游戏是因为游戏简单容易分析,且不需要考虑驱动保护版权等相应的问题,这里我会把我的分析思路分享出来,来供大家参考。
王 瑞
2022/12/28
6980
植物大战僵尸:逆向分析阳光
植物大战僵尸:辅助制作高级技巧
通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址。本地CALL就是程序中的过程调用,通过调用已知的本地CALL即可实现某些变态功能,这些变态功能往往是通过修改数值参数也做不到的,接下来我们将通过遍历阳光产生的时间,寻找阳光产生的本地Call,并使用代码注入器注入,自定义生成阳光。通过基址加偏移的方式我们可以找到游戏中的指定参数,但这种找基址的方式并不是白用百灵的,在一些网络游戏中基址加密后根本无从下手,如果此时我们需要在程序中打补丁该如何定位到我们所需要的指令上呢,接下来将介绍一种全新的找地址方式,特征码定位技术。
王 瑞
2022/12/28
1K0
植物大战僵尸:辅助制作高级技巧
植物大战僵尸:寻找阳光掉落Call
本次实验内容:本次实验将接触到Call调用这个概念,什么是Call调用? Call相当于你在编程时所编写的函数,而高级语言中的函数最终也是会被编译器转换为汇编格式的Call调用,这些关键Call普遍都
王 瑞
2023/02/25
6980
植物大战僵尸:寻找阳光掉落Call
植物大战僵尸:寻找召唤僵尸关键CALL
实验目标:通过遍历寻找召唤僵尸的CALL,通过调用CALL出现自定义的僵尸,加速僵尸的出现。 僵尸CALL的遍历技巧:
王 瑞
2022/12/28
8680
植物大战僵尸:寻找召唤僵尸关键CALL
植物大战僵尸:学会使用人造指针
通过向游戏中注入一段特殊的汇编代码,实现自动获取动态地址,省略找基址的麻烦。该方法适用于游戏基址层数过多无法直接获取到基址,游戏根本无法找到基址。
王 瑞
2022/12/28
5470
植物大战僵尸:学会使用人造指针
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
本文主要介绍了如何通过分析植物大战僵尸游戏程序,提取其中的阳光数量,并利用OllyDbg工具定位到具体代码位置,供研究学习使用。
IBinary
2018/01/08
2.7K0
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
植物大战僵尸:无限阳光辅助开发
从本节课开始我们将进入实战环节,我们将手动分析植物大战僵尸的一些功能的实现并编写辅助,并根据章节的深入一步一步的完善我们的辅助,为啥这里使用植物大战僵尸呢?本来想使用网络游戏的,但涉及到驱动过保护和版权的问题暂时不能够分析,准备分析一些大型单机游戏的后来发现调试起来不太方便,不如就用植物大战僵尸。
王 瑞
2022/12/28
8060
植物大战僵尸:无限阳光辅助开发
植物大战僵尸:代码实现无限阳光
本次实验内容:通过逆向分析植物阳光数量的动态地址找到阳光的基址与偏移,从而实现每次启动游戏都能够使用基址加偏移的方式定位阳光数据,最后我们将通过使用C语言编写通用辅助实现简单的无限阳光外挂,在教程开始之前我们先来说一下为什么会有动态地址与基址的概念!
王 瑞
2023/02/25
1.2K0
植物大战僵尸:代码实现无限阳光
植物大战僵尸:手工计算偏移地址
首先我们思考一个问题,为什么我们需要手工计算偏移地址,CE找不开心吗?当然不是,有些游戏比如像CF,只要查找改写的地址游戏就会崩溃,严重的话则会弹出TP警告框,但查找访问则不会出现这个情况,此时我们就需要进行手工计算偏移地址,来得到基址数据。
王 瑞
2022/12/28
4340
植物大战僵尸:手工计算偏移地址
JAVA开发外挂第二弹-CE查找游戏基址
昨天讲了JAVA的JNI,今天讲一下如何用CE(Cheat Engine)查找游戏的基址, 基址就是游戏在内存中的一个静态的内存地址,可以通过偏移找到本次游戏的数据地址。
博博1998
2022/04/25
4.4K0
JAVA开发外挂第二弹-CE查找游戏基址
学习逆向知识之用于游戏外挂的实现.第三讲,通过游戏外挂.分析红色警戒金钱基址.以及确定基址小技巧.
                          分析红色警戒金钱基址.以及确定基址小技巧.
IBinary
2018/08/30
2K0
学习逆向知识之用于游戏外挂的实现.第三讲,通过游戏外挂.分析红色警戒金钱基址.以及确定基址小技巧.
植物大战僵尸:运用特征定位技术
特征码定位技术的应用非常广泛,我们所熟知的杀毒软件的查杀原理多半是基于特征码定位技术实现查杀的,在外挂技术领域特征码定位主要用于,版本的通杀,制作一键基址获取器,动态地址的定位等。
王 瑞
2022/12/28
3590
植物大战僵尸:运用特征定位技术
Java - 游戏内存外挂
什么是游戏外挂? 试想场景,在玩游戏时,没有得到良好的游戏体验,加之玩游戏的这位又是偏激之人,此时心生愤怒,但通过自己的游戏技术,又无法得到发泄。所以很无奈,只能打开一种游戏作弊程序,这种游戏作弊程序就叫做游戏外挂。
Melody132
2020/03/11
6.7K1
植物大战僵尸:寻找葵花生产速度
本次实验内容:通过CE修改器遍历出控制太阳花吐出阳光的时间变量,太阳花吐出阳光是由一个定时器控制的,首先我们找到第一个太阳花的基址与偏移,然后找出第二个太阳花的动态地址,并通过公式计算得到太阳花结构长度的相对偏移,最后我们通过C语言编程实现,遍历并修改所有图中的太阳花吐出阳光的时间,最终实现全图吐阳光。
王 瑞
2022/12/28
3510
植物大战僵尸:寻找葵花生产速度
【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 数据查找技巧 | 地址访问调试 | 指令选择技巧 | MOV 汇编指令含义 | 基址值搜索 ) ★
以查找子弹数量内存为例 , 参考 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 查找子弹数据的动态地址 | 查找子弹数据的静态地址 | 静态地址分析 | 完整流程 ) ★ 一、查找子弹数据临时内存地址 博客章节 ;
韩曙亮
2023/03/29
2.3K0
【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 数据查找技巧 | 地址访问调试 | 指令选择技巧 | MOV 汇编指令含义 | 基址值搜索 ) ★
C/C++ 编写并提取通用 ShellCode
简易 ShellCode 虽然可以正常被执行,但是还存在很多的问题,因为上次所编写的 ShellCode 采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统一就会存在调用函数失败甚至是软件卡死的现象,下面我们通过编写一些定位程序,让 ShellCode 能够动态定位我们所需要的API函数地址,从而解决上节课中 ShellCode 的通用性问题。
王 瑞
2022/12/28
5750
C/C++ 编写并提取通用 ShellCode
单机游戏逆向分析:植物大战僵尸中文版破解学习
0x7打开反汇编界面以后,可以看到在我们跟进这条记录的前一条指令是sub esi,ebx
极安御信安全研究院
2022/03/17
1K0
单机游戏逆向分析:植物大战僵尸中文版破解学习
干货 | HOOK技术实战
对于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能,如屏幕取词,监视日志,截获键盘、鼠标输入等等。
HACK学习
2021/10/19
2.3K0
干货 | HOOK技术实战
植物大战僵尸:查找植物叠加种植CALL
实验目标:我们都知道植物大战僵尸游戏中植物是不可以叠加种植的,也就是一个格子只能种植一个植物,今天我们将实现一个格子里种植无限多的植物。
王 瑞
2022/12/28
8840
植物大战僵尸:查找植物叠加种植CALL
植物大战僵尸:代码实现自动收集阳光
本次实验内容:通过阳光增加的值为切入点,找到自动收集阳光的关键判断并实现自动收集阳光,首先我们猜测当阳光出现后,我们是否会去点击,这个过程必然是由一个判断和一个时钟周期事件来控制的,那么当我们点击下落的阳光以后,则该判断条件实现,会执行收集阳光的CALL,否则的话继续执行阳光下落的过场动画,这正是正向开发的一种开发手段,此时我们也仅仅是猜测,接下来我们将去验证这个大胆的想法。
王 瑞
2023/02/25
2.5K1
植物大战僵尸:代码实现自动收集阳光
推荐阅读
相关推荐
植物大战僵尸:逆向分析阳光
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验