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

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

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

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

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

①丶新建工程

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

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

编写如下代码

#include <stdio.h>

#include <stdlib.h>

int g_szText = ;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

32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址的更多相关文章

  1. 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)

    32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...

  2. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  3. 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数

    32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...

  4. 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式

    32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...

  5. GDB调试32位汇编堆栈分析

    GDB调试32位汇编堆栈分析 测试源代码 #include <stdio.h> int g(int x){ return x+5; } int f(int x){ return g(x)+ ...

  6. 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析

    20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...

  7. 64位gcc编译32位汇编

    由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接.由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的 ...

  8. 【asm】64位编译32位汇编需要注意的

    汇编语言在32位和64位下有区别    32位的汇编在代码前增加.code32    as可以通过--32指定生成32位汇编 在64位系统下ld链接生成32位程序:    ld: i386 archi ...

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

    利用下假期,打算把linux下的汇编语言给熟悉下,结果是以32位为版本的,只能在办公室的机器上跑了个opensuse的32位版本,家里的suse挂了,无法输入中文.打算再安装下32位系统,今天找到了个 ...

随机推荐

  1. php基础函数

    函数四要素:返回类型(php没有返回类型), 函数名,参数列表,函数体//php定义函数的方式  简单 例://function show(){//    echo "狗头铡伺候" ...

  2. noip普及组2007 Hanoi双塔问题

    Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...

  3. css div旋转之后自适应

    css: .rotate90deg { transform: rotate(90deg); -ms-transform: rotate(90deg); /* IE 9 */ -moz-transfor ...

  4. 【Centos7】5分钟理解防火墙firewalld

    Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处: 1.firewalld可以动态修改单条规则,而不需要像ipta ...

  5. linux允许root远程登录

    在根目录下自己建了一个目录 /software 通过ssh传输文件时遇到问题, 虽然ssh中su 切换用户到root ,但不能传输文件,所以要允许root登录才行 修改ssh配置文件 修改完重启 ss ...

  6. java中 this 的三种用法

    Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...

  7. 一位资深程序员大牛给予Java提升技术的学习路线建议

    15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...

  8. 如何快速的理解JavaScript闭包?

    先看问题 1. 在js中的作用域是什么? 作用域就是作用范围,作用空间.作用域分为全局作用域和局部作用域.(这个东西大家都明白) 如果把局部作用域比作一个国家,那么全局作用域就是地球,地球上除了那个国 ...

  9. 开源分享 Unity3d客户端与C#分布式服务端游戏框架

    很久之前,在博客园写了一篇文章,<分布式网游server的一些想法语言和平台的选择>,当时就有了用C#做网游服务端的想法.写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本, ...

  10. jquery.tmplate使用心得

    jquery.tmplate使用心得 jquery.tmpl.js,是与jquey共同使用的html模板插件.该插件可通过简单的语法将数据放入到html模板中,可以很好的将数据渲染到页面上.该插件在本 ...