32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
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逆向植物大战僵尸,快速定位阳光基址的更多相关文章
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
- 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX 可以这样想,16位通 ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...
- GDB调试32位汇编堆栈分析
GDB调试32位汇编堆栈分析 测试源代码 #include <stdio.h> int g(int x){ return x+5; } int f(int x){ return g(x)+ ...
- 20145314郑凯杰《信息安全系统设计基础》GDB调试32位汇编堆栈分析
20145314郑凯杰<信息安全系统设计基础>GDB调试32位汇编堆栈分析 本篇博客将对第五周博客中的GDB调试32位汇编堆栈进行分析 首先放上以前环境配置的图: 图1: 测试代码: #i ...
- 64位gcc编译32位汇编
由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接.由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的 ...
- 【asm】64位编译32位汇编需要注意的
汇编语言在32位和64位下有区别 32位的汇编在代码前增加.code32 as可以通过--32指定生成32位汇编 在64位系统下ld链接生成32位程序: ld: i386 archi ...
- 64位linux下玩32位汇编编程
利用下假期,打算把linux下的汇编语言给熟悉下,结果是以32位为版本的,只能在办公室的机器上跑了个opensuse的32位版本,家里的suse挂了,无法输入中文.打算再安装下32位系统,今天找到了个 ...
随机推荐
- php基础函数
函数四要素:返回类型(php没有返回类型), 函数名,参数列表,函数体//php定义函数的方式 简单 例://function show(){// echo "狗头铡伺候" ...
- noip普及组2007 Hanoi双塔问题
Hanoi双塔问题 描述 给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的.现要将这些圆盘移到C柱上,在移动 ...
- css div旋转之后自适应
css: .rotate90deg { transform: rotate(90deg); -ms-transform: rotate(90deg); /* IE 9 */ -moz-transfor ...
- 【Centos7】5分钟理解防火墙firewalld
Centos7中默认将原来的防火墙iptables升级为了firewalld,firewalld跟iptables比起来至少有两大好处: 1.firewalld可以动态修改单条规则,而不需要像ipta ...
- linux允许root远程登录
在根目录下自己建了一个目录 /software 通过ssh传输文件时遇到问题, 虽然ssh中su 切换用户到root ,但不能传输文件,所以要允许root登录才行 修改ssh配置文件 修改完重启 ss ...
- java中 this 的三种用法
Java中this的三种用法 调用属性 (1)this可以调用本类中的任何成员变量 调用方法(可省略) (2)this调用本类中的成员方法(在main方法里面没有办法通过this调用) 调用构造方法 ...
- 一位资深程序员大牛给予Java提升技术的学习路线建议
15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 ...
- 如何快速的理解JavaScript闭包?
先看问题 1. 在js中的作用域是什么? 作用域就是作用范围,作用空间.作用域分为全局作用域和局部作用域.(这个东西大家都明白) 如果把局部作用域比作一个国家,那么全局作用域就是地球,地球上除了那个国 ...
- 开源分享 Unity3d客户端与C#分布式服务端游戏框架
很久之前,在博客园写了一篇文章,<分布式网游server的一些想法语言和平台的选择>,当时就有了用C#做网游服务端的想法.写了个Unity3d客户端分布式服务端框架,最近发布了1.0版本, ...
- jquery.tmplate使用心得
jquery.tmplate使用心得 jquery.tmpl.js,是与jquey共同使用的html模板插件.该插件可通过简单的语法将数据放入到html模板中,可以很好的将数据渲染到页面上.该插件在本 ...