32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.
32位第五讲,逆向实战干货,快速定位扫雷内存.
首先,在逆向之前,大家先对OD有一个认识.
一丶OD的使用

标号1: 反汇编窗口 (显示代码的地址,二进制指令,汇编代码,注释)
标号2: 寄存器窗口(显示通用寄存器,段寄存器,以及浮点协处理器,32位中还有多媒体寄存器)
标号3: 信息窗口 (这个主要是显示当你运行到的程序的位置处的信息)
标号4: 数据窗口 (内存中的数据,可以在这里查看内存)
标号5:堆栈窗口 (查看栈中的内容,以及变量的内容)
标号6,标号7,标号8 ,属于工具窗口,不通的修改版OD有不同属性
具体详细OD介绍,请看资料中的chm

二丶快速定位扫雷数组(OD定位)
首先定位扫雷数组的时候,我们要明白扫雷游戏怎么玩,(这个不用说了,都会玩 :) 不会? 百度,Google :) )
1.思路,首先看下扫雷的界面

至此我们猜一下他可能用什么数据结构存储,(这里利用到了开发的知识,正向的开发,决定了逆向的高度,不要忽略正向的知识)
二维数组存储,为什么,我猜的 :)
全局的数组,还是栈中的数组,还是new的数组, 我猜是全局的数组(不管对不对,分析一下准没错)
为什么是全局数组,第一,我们按下的时候要访问这个数组,第二,当扫雷绘制的时候也可能用这个数组.不然怎么会出来 1 2 3,这种提示?
首先我们点击一个按钮

变样了,那么我们怎么快速定位到这个内存地址哪?
思路一: 当我按钮按下的时候,它会访问数组的元素,判断是不是雷
思路二: 当绘制的时候,也就是绘制1 2 3 的时候,也会访问数组,根据数组的内容绘制出1 还是2
那么思路一和思路二我们有了(当然,有可能有更好想思路,这里简单就这两个)
那么思路一的话,他会访问,但是可能会处理很多逻辑,最重才会访问到我们的数组
思路二,的话,他也有逻辑,但是感觉他是直接从数组中取出内容来绘制的,所以这里按照思路二的方式来分析
思路一的话,如果有兴趣的也可以自己去分析一下, 对于OD怎么分析消息,这里简单提一下
思路一的查找
1.首先打开扫雷
2.使用spy++扫描扫雷窗口,获得函数过程

找到窗口过程

OD运行起来,点击窗口
或者按上面的
,然后右键刷新

我们可以跟随过去,去下条件断点,但是OD的调试断点会有毛病,有时候能下,有时候下不了,
那么我们可以在这里设置消息断点.拦截下鼠标按下的消息


我们可以拦截鼠标消息,但是不好,因为鼠标消息有移动,按下 弹起等等,所以我们下拉,找到鼠标按下的消息
这里设计的不好,不能自己输入 按钮按下的消息值是201
https://zhidao.baidu.com/question/434863629.html 这个连接则是简单的提了一下

,检测按下的消息,只要鼠标按下即可捕获,自己分析一下
思路二,绘制
绘制的思路,我们是捕获绘制,那么怎么做
第一我们会想,他可能用双缓冲绘图 :) (为什么,我猜的) (不会双缓冲的,可以Google一下什么意思,如果不会,跟着我走也一样,不过简单的明白一点还是好的)
那么开始我们的操作,首先我们知道双缓冲绘图最后一个肯定会用 BitBlt去复制,而BitBlt是属于一个模块的,我们不知道哪个模块的,使用工具查看一下
,我们发现是Gdi32.dll里面的,那么开始执行下方的步骤
1.在OD中ALT + E 打开模块,查找GID32.dll

那么我们右键查看函数名称

跟随过去,那么执行的是Bltbit的函数,那么我们猜想,他的上一层才会访问数组,因为访问了数组,才会绘制,咱们这个时候已经属于绘制中,所以要到绘制前

这个是我们BitBlt执行的时候,我们跳出

跳出来可以看到,这个就是双缓冲绘图的步骤,那我们往上找一下,肯定会有访问数组

先不要看我注释,我们发现了,inc esi 是对它++,而后和内存的值比较,如果小于等于,继续循环
那么我们由此得出,他可能在遍历数组,那么我们现在是初级的,是9行9列,我们看下esi到9了会退出吗

我们发现了,确实是到10了,也不循环了,那么继续分析

我们发现它读取 的1005338的值又去坐的判断,那么我猜想内循环九次,外循环读取一次,继续一次大的循环,我猜想这个可能是行,我们看下我们的扫雷绘制的怎么样了
是不是已经绘制出了9列了,把OD最小化

可以看出确实是绘制了9列,那么我们不用想也知道了,它是双层for循环,而后一列一列的绘制
那么我们得出了行,和列 我们记录下这来这两个地址
列的地址: 0x1005334
行的地址: 0x1005338
那么怎么寻找出雷的所在的位置那,我们把断点取消一下,我们开始运行起来扫雷,我们看下内存有什么变化

我们在第一行点击之后,绘制了一个1,我们发现内存的这个地方也改成(ASI)的1了,那么我们点击第二个,验证我们的想法,

人品没谁了,第二个就是地雷,但是我们发现都变成了8F 8F了,那么我们存在疑问(8F是地雷吗?)我们再次从来看一下

由此确定,8F 代表的是地雷, 而40表示的是空,
接着我们看下这块地址是哪里,

我们从这里开始,验证一下扫雷

为了方便内存观察,我们改为16 * 16的,也就是内存中也是16 *16代表一行
我们看上图发现了第二个是雷我们可以直接点击(但是扫雷有一个默认的动作,就是第第第一次点击如果是雷,他也会让你玩,就是如果是雷的话,它则会用算法帮我们修改成不是雷,那么我们点击第一个0F,然后再点击第二个看看是不是雷)

我们发现和第一张那个图相比,(内存还没变化,因为是第一张图,也就是上一张)确实验证了我的猜想,那么肯定这块内存16 *16的大小就是扫雷的内存了
看下变化后的

出现了CC,CC代表的是 int 3指令,也就是抛出异常,调试器会用到这条指令.所以变为CC 扫雷程序就会停止了.
总结:
列的地址: 0x1005334
行的地址: 0x1005338
扫雷数组首地址: 0x1005361
扫雷的个数地址: (看内存,自己寻找,就在附近)
OD的下载: 对于OD网上有很多版本,自己去下一个就行,比如看雪论坛的
课堂资料下载:
链接:http://pan.baidu.com/s/1pLV0iEn 密码:8x3o (包含扫雷,DLL查看,以及OllyDbg使用文档.chm)
32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.的更多相关文章
- 32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看)
32位汇编第四讲,干货分享,汇编注入的实现,以及快速定位调用API的数量(OD查看) 昨天,大家可能都看了代码了,不知道昨天有没有在汇编代码的基础上,实现注入计算器. 如果没有,今天则会讲解,不过建议 ...
- 32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址
32位汇编第六讲,OllyDbg逆向植物大战僵尸,快速定位阳光基址 一丶基址,随机基址的理解 首先,全局变量的地址,我们都知道是固定的,是在PE文件中有保存的 但是高版本有了随机基址,那么要怎么解决这 ...
- 32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数
32位汇编第二讲,编写窗口程序,加载资源,响应消息,以及调用C库函数 (如果想看所有代码,请下载课堂资料,里面有所有代码,这里会讲解怎么生成一个窗口程序) 一丶32位汇编编写Windows窗口程序 首 ...
- 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位的 ...
- 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用
32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX 可以这样想,16位通 ...
- 32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式
32位汇编第三讲,RadAsm,IDE的配置和使用,以及汇编代码注入方式 一丶RadAsm的配置和使用 用了怎么长时间的命令行方式,我们发现了几个问题 1.没有代码提醒功能 2.编写代码很慢,记不住各 ...
- 逆向实战干货,快速定位自动捡阳光Call,或者标志
逆向实战干货,快速定位自动捡阳光Call,或者标志 注意: 关于CE和OD的使用,这里不再多说,快速定位,默认大家已经有了CE基础,或者OD基础. 第一种方法,找Call 第一步,打开CE,搜索阳光值 ...
随机推荐
- 检测MySQL主从备份是否运行
通过查看 slave 状态,确保 Slave_IO_Running: Yes Slave_SQL_Running: Yes #!/bin/bash#Author:Darius-Dmysql -uro ...
- Lucene用法示例
整理一下 ELK 和 Grafana 中会用到的 Lucene 用法: 通配符 示例1:过滤出 url 中包含 .pw/ 的 网址 url.keyword:*.pw\/* 正则表达式 示例1:过滤出 ...
- [转载]ECMall模板解析语法与机制
ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词 ...
- Mac 下 python 环境问题
一.Mac下,可能存在的 python 环境: 1.Mac系统自带的python环境在(由于不同的 mac 系统,默认自带的 python 版本可能不一样): Python 2.7.10: /Syst ...
- 基于UML的时空建模
一.基本信息 标题:基于UML的时空建模 时间:2018 出版源:东北大学学报(自然科学版) 领域分类:UML模型:RCC-8空间拓扑:Allen-13时态拓扑:时空数据:建模 二.研究背景 问题定义 ...
- android-读取MediaProvider
1.MediaProvider存储手机中的媒体文件,用 SQLite 数据库存储图片.视频.音频等多媒体文件的信息,供视频播放器.音乐播放器.图库使用.以 root 权限进入 adb shell,使用 ...
- post和get请求的参数乱码
对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考 ...
- EF学习笔记(七):读取关联数据
总目录:ASP.NET MVC5 及 EF6 学习笔记 - (目录整理) 本篇参考原文链接:Reading Related Data 本章主要讲述加载显示关联数据: 数据加载分为以下三种 Lazy l ...
- IntelliJ IDEA小问题通过操作软件解决
Diamond types are not supported at this language level http://blog.csdn.net/qq_34884729/article/deta ...
- Codeforces Round #425 (Div. 2)
A 题意:给你n根棍子,两个人每次拿m根你,你先拿,如果该谁拿的时候棍子数<m,这人就输,对手就赢,问你第一个拿的人能赢吗 代码: #include<stdio.h>#define ...