32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址

一丶基址,随机基址的理解

首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的

但是高版本有了随机基址,那么要怎么解决这个问题,不解决这个问题,那么如果以后逆向分析的时候,找不到基址,那么就不能进行下一层的操作

首先看下固定基址,和随机基址

①丶新建工程

(这里使用VS2013 ,VC++6.0不支持随机基址)

自己新建一个程序,添加个CPP文件

编写如下代码

#include <stdio.h>#include <stdlib.h>int g_szText = 2;int main(){printf("g_szText address =  %p\r\n", &g_szText);system("pause");}

我们看下设置,是否随机基址已经启动

1.找到项目属性

看下 连接器 -> 高级 -> 随机基址

现在我们的程序是随机基址,每次打开都是随机的

备份一下,然后修改为不随机基址

不随机基址,就是地址没次运行都是一样的,现在我们比较两个文件,随机基址在文件中是存的一个标记

我们在PE文件中更改这个标记,则可以达到基址是一样的了

Text1是随机基址的,TEst是不随机的

使用Winhex对比

比对

首先我们排除一下,标志不会在下面,因为程序一启动则要加载

随意在上面PE 后面我们一个自己一个字节的尝试

这里我就不尝试了,标志是PE 后面数6个字节,然后下方就是

也就是02 和 03

02是随机基址,03是不随机

现在改一下试一下

因为程序权限问题,这里不让我更改,不过我们可以写文件更改

第二种方法

如果对于修改文件,我们不爱做,我们也可以通过程序算偏移去做

具体

有公式可以计算

全局变量的地址 - 模块首地址  = 偏移

每次程序启动加载模块

模块 + 偏移 = 全局变量的地址,也是可以一样的访问

这里是把全局变量当做DLL使用

 二丶OllyDbg分析植物大战僵尸,快速定位阳光基址

1.对于植物大战僵尸,我们需要一款内存搜索工具 (Cheat Engine 简称CE)

为什么使用这款工具,因为这款游戏不同于上次讲的扫雷,上次的扫雷,我们可以通过Bitblt

去寻找,绘图,而这次如果在通过绘图去找,那么很麻烦,所以我们使用这款工具

2.首先CE加载植物大战僵尸的进程

进程名称: PlantsVsZombies.exe

3.搜索阳光的数量

我猜测他是4个字节存放阳光的数值,那么我们可以是4个byte搜索,先搜索精确的数值

4.然后增加或者减少阳光,在已有的基础上,搜索现有的阳光数量

5.找到一个,我们看下修改值是否会把阳光修改了

发现成功修改

那么我们看下这个地址有没有别的变量保存

例如 int *p = 0x 106F6EB0

Int *p1 = p ;有可能是这样存储的

复制出来搜索一下

以16进制扫描,来一个新的扫描

我们发现没有保存,那么我们可以认为他是存储阳光的(但是又怎么简单吗)

我们重新打开游戏,看下这个地方是否变化了,如果没变,那么这个基址就是保存了阳光的数值

什么是基址?

上面说了很多基址的概念,什么是基址

比如看下列代码

全局区

Int *G_RunCount = NULL  //全局
Int main(){Int *p1 = 0x11122233当前存储了阳光的个数)P = p1   //保存地址
System(“pause”);}

那么像我们上面所说,如果重新打开游戏,那么这个地址不存在了,也就是说地址里面存的不是阳光的数量,那么我们可以认为他不是最顶层的地址

最顶层的地址就是 全局变量,只要找到全局变量那么以后都不用修改了,因为全局变量中存储了这个地址

那么我们试一下

我们发现这块地址不是,很有可能是局部变量存储了

那么我们重新进行上面的几个步骤,找出当前的局部变量存储的地址

10711A38

打开OD,附加当前植物大战僵尸的进程,在数据区域Ctrl + G 跳转到重新找到的局部变量地址

我们修改一下

正式我们要找的存放阳光数量的地址

那么现在我们下一个内存访问断点,看看谁访问了这个地方

我们看到,他是加了一个偏移寻到了5560

也就是 [base + 5560] 取内容 = 阳光的个数

那么现在主要是base(地址)是什么,在上面可以看出,base是edx,那么现在主要是edx的值

(注意,寻找的时候你们可能看的不一样,因为地址是不固定的,固定的是全局变量,也就是说为什么我们要全局变量地址+偏移的方式来访问数值的)

我们去CE搜索一下这个变量有没有存储

我们发现这块局部变量地址,也有人来保存,那么我们OD查一下这块局部变量的地址,看下内容(为什么要再次搜索,因为如果有保存这个值的局部变量,那么就不是最终的地址,所以一定找到顶层)

(别忘了OD的内存断点取消)

我们发现有很多,但是,我们需要用排除法了,首先,根据上面我们的经验,全局变量的地址不是 0018开头的,这个很像局部变量,如果是局部变量,那么往上查找很困难

那么我们往下拉,看看还有没有了

我们依次下内存断点,我们会发现,有的时候下了内存断点,你的植物大战僵尸暂停界面会停止不动,那么可能是我们找错了,删除内存断点,重新继续

我们排除0018开头的,因为不光是局部变量,如果是你写代码,你有可能会写很多地址相似的位置一起保存Base基址吗

例如

Int *p1 = p

Int *p2 = p

Int *p3 = p

Int *p4 = p

....

所以找不同的

我们发现再次搜索,发现就这两个不通,我们把第一个弄下来,然后数据窗口中搜索,下内存断点,(内存访问)

,内存断下了来了

现在我们知道base的地址是怎么得到了

以前是 [base + 5560]  = 阳光的个数

但是现在因为求base所以base变为了

[[base + 768]+5560] = 阳光的个数

看看Base是多少

我们重新看下这个地址有没有保存,如果有,那么继续往上寻找

CE搜这个地址

搜索完成之后发现有几个绿色的,以后看到绿色的优先尝试,因为这个可能就是全局基址了

先看第一个

双击地址,发现了这个,那么这个是什么意思,这个的意思就是 (游戏首地址 + 偏移的意思)

游戏首地址怎么看

我们打开PChunter工具(注意,64位系统,请用64位的,32的用32的,我的是64的所以用64的)

找到植物大战僵尸的进程

看下模块路径,以及植物大战僵尸的基地址入口点

所以我们的公式可以得到补充了

[[006A9EC0 + 768]+5560] = 取出的内容等于阳光的个数

为什么我们确定是006A9EC0,而不是下面的3个绿色的

我们可以数据窗口中搜索这个地址,接着内存下访问的断点

我们可能会得出很多个加偏移的,不过没关系,一个一个的场浩司,总会找到

最终会找到,如下图

那么现在我们用CE的添加地址功能 把我们的地址+偏移添加上,看看是否阳光一样

对了,那么以后写代码就是基址 + 偏移 + 偏移访问

对于找基址的不太熟悉的话,可以看下面的图片

,看下指针结构图后面的内容

也就是 006A9EC0  里面的值 02209CA8

Struct A{Struct B{Int a   //存放阳光的个数
}}

Int a存储了阳光的个数

我们要寻找a

B(地址) + 偏移(5560) = a的地址,然后取内 = 阳光个数

B的地址又要寻找,那么

A的地址 + 偏移(768) = B的地址

A的地址寻找

找到了一个实例

相当于 A  p1 = new A();   我们寻找的P1的地址

P1的地址取内容  = new A的地址(也就是A的地址)

A + 768(得出B的地址) + 5560 = int a成员变量的地址,对其取内容 = 阳光个数

课堂资料:

链接:http://pan.baidu.com/s/1cbGf18 密码:gk7s

转载于:https://www.cnblogs.com/iBinary/p/7547412.html

32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址相关推荐

  1. c语言将两个16位变为一个32位,16位汇编第六讲汇编指令详解第第三讲(示例代码)...

    16位汇编第六讲汇编指令详解第第三讲 1.十进制调整指令 1. 十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果 2.分成压缩BCD码和非压缩BCD码调整 简而言之: 以前的时 ...

  2. 32位汇编第七讲,混合编程,内联汇编

    32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...

  3. Win32汇编WG系列教程1——《植物大战僵尸5211314》

    开篇语:            WG,一个很刺眼的名词,市面上大部分的挂都是使用VB/Delphi/C++或者E语言来写的,我之前也是使用Delphi和VB,这些语言的好处就是编写简单,容易入门!尤其 ...

  4. 汇编——32位汇编基础框架

    代码 .586 .model flat,stdcall option casemap:noneincludelib ucrt.lib includelib legacy_stdio_definitio ...

  5. 32位汇编ebp、ebp-4、ebp+4、ebp+8等含义

    我们知道,当调用了一个函数后,底层汇编大多数会使用ebp寻址的方式去查找参数,关于ebp与esp寻址可以看我这篇文章<ebp寻址>. 下面简单说总结一下ebp几个偏移的含义: ebp:  ...

  6. 针对“扫雷“和“植物大战僵尸“游戏,分析,扫描,阳光值,植物,金币,僵尸的分析逆向

    <软件逆向分析> 2022年9月 目录 {#目录 .TOC-Heading} [一.实验工具介绍 3](#一实验工具介绍) [二.针对"扫雷"游戏 3](#二针对扫雷游 ...

  7. 32位汇编寄存器及汇编指令

    32位CPU所含有的寄存器有: 4个数据寄存器(EAX.EBX.ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES.CS.SS.DS.FS和 ...

  8. 64位linux下玩32位汇编编程

    无法按照原来的方式,直接用as  test32.s  -o  test32.o汇编 直接用ld  test32.o -o test32链接 直接报错,由于我的linux是64位,解决方法就是在两个命令 ...

  9. x86的32位汇编快速入门

    本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...

最新文章

  1. 【数理知识】《随机过程》方兆本老师-第1章-引论
  2. 目前最常用的计算机机箱类型为_绍兴承接离心风机箱高品质
  3. 【FZU2178】礼物分配
  4. tcga数据下载_TCGA数据下载-GDC
  5. ARCore 1.7可轻松打造AR自拍照及动画Augmented Faces API
  6. ABP中module-zero快速集成微信用户认证
  7. [知了堂学习笔记]_Ajax之解析Json
  8. android studio JNI Cmake Erro at 运行失败
  9. cuem模拟器安装及使用
  10. Ps如何调出一寸或者二寸等规定尺寸的照片
  11. 超声波测距 c语言程序流程图,超声波测距c语言源程序代码-20210413051213.docx-原创力文档...
  12. GIFCAM GIF录制编辑工具 V5.5中文版 GIF制作
  13. 图解 git 仓库概念
  14. 基于Android平台的手机安全助手的设计与实现
  15. Databricks 加载MySQL数据
  16. 失物招领信息管理系统
  17. 很抱歉,此功能看似已中断,并需要修复。请使用Windows控制面板中的“程序和功能”选项修复Microsoft Office。
  18. 02 MySQL优化 - 优化SQL语句
  19. Python脚本实现12306火车票自动抢票回家or旅游
  20. 合工大计算机专业支持跨考吗,2011年合肥工业大学计算机专业复试流程_跨考网...

热门文章

  1. 开启我的博客之旅吧!
  2. 自媒体写不出好文章,又不会创作怎么办?推荐这6个网站
  3. 升本 WORD 2010
  4. 详细总结快慢指针的在链表中的常见题型
  5. 【Linux】进程与服务
  6. encode-decode结构
  7. ERP系统个性化定制生产计划,简化排产流程
  8. #228. 噼里啪啦
  9. linux将grep行注释,Linux grep命令的12个实用示例
  10. 数据结构系列之平衡二叉树