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. SpringMVC详解(二)------详细架构

    通过上篇博客,我们能编写一个 SpringMVC 的入门实例,但是为什么要这样写?这样写有啥好处?通过这篇博客我们会有详细的了解. 本篇博客源码下载链接:http://pan.baidu.com/s/ ...

  2. css基础知识之属性选择器

    css属性选择器及属性和值选择器如下: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  3. HDU 6170----Two strings(DP)

    题目链接 Problem Description Giving two strings and you should judge if they are matched.The first strin ...

  4. cycript

    cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...

  5. cxf整合spring错误为:cvc-complex-type.2.4.c

    cxf整合spring,报错信息如下: Multiple annotations found at this line:- cvc-complex-type.2.4.c: The matching w ...

  6. C++ 类声明 类前置声明范例

    转载自http://www.cnblogs.com/staring-hxs/p/3244251.html 在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration).下面的 ...

  7. Android SQLite 简易指北

    Android SQLite SQLite一款开源的, 轻量级的数据库. 以文本文件的形式存储数据. SQLite支持所有标准的关系型数据库特性. SQLite运行时占用内存非常少(约250 KByt ...

  8. AndroidTv Home界面实现原理(一)——Leanback 库的使用

    接下去应该是梳理一下 Android Tv 主界面实现原理及解析的一个系列博客了,大体上的安排是先介绍 Google 官方提供的 Leanback 库的使用,如何使用该库来实现简单的 Home 界面, ...

  9. js 移动端识别手机号码

    需求: 在移动端一个页面内多处有数字显示,其中希望能够自动识别我所要求的那个手机号码,点击可以拨打 探索: 首先想到的是头部的meta标签<meta name="format-dete ...

  10. 201671010121 2016-2017-2《java程序设计》第一周学习总结

    之前学了些C语言,学的也不是太懂,还算能读懂一些简答的代码吧,我觉得这就是进步.刚步入大二,在计算机这个专业里不刻苦是不行的.但是,到我拿到Java书的时候,真心是吓住我了,好厚的一本书啊,不过在老师 ...