专栏首页逆向技术32位汇编第五讲,逆向实战干货,(OD)快速定位扫雷内存.

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)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android 开发第五讲 学习Button了解Button属性

    为啥这样做.在Android中我们声明一个Button类型的变量 在上面 按快捷键 CTRL+H 可以看类继承结构我们可以发现是继承自 TextView类.那么...

    IBinary
  • Android 开发第七讲 RadioButton (单选按钮)

    之前我们响应按钮事件都是直接通过匿名内部类的方式. new一个对象来实现OnClick方法.

    IBinary
  • Android开发第三讲,布局管理器

    通过上一讲,我们用 Android Studio 创建了一个简单的Android项目.并且成功运行.

    IBinary
  • ZooKeeper基本原理

    ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

    Java架构师历程
  • 还在用 Postman 测试接口吗?是时候试试它漂亮的女朋友 Postwoman 了!

    对于经常进行接口调试的同学来说,应该是比较熟悉 Postman 了。Postman 虽然功能强大,但也有很多弊端。比如:不支持 Web 方式,需要安装客户端软件...

    测试小兵
  • 你与其他程序员可能常犯的 6 个错误

    你与其他程序员可能常犯的 6 个错误  我担任 CTO 已经有一段时间了,我觉得这是一个非常好的锻炼机会,因为我不仅可以编写代码,还要带领团队,管理项目,设计架...

    用户1289394
  • Jquery 遍历数组之grep()方法介绍

    grep()方法用于数组元素过滤筛选。 grep(array,callback,boolean);方法参数介绍。 array   ---待处理数组 callba...

    郑小超.
  • 更新c++学习笔记 第四章 命名空间

    命名空间的名字在其所在作用域中是唯一的,命名控件可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义。

    互联网CEO
  • JavaScript机器学习之KNN算法

    原文: Machine Learning with JavaScript : Part 2

    Fundebug
  • 【Unity】瞎做个宝石迷阵吧!(2)——砖块交换

    我们要利用这几个变量来控制砖块的交换,先来做砖块的动画效果。在Bricks的Update里将代码改成这个样子,我们所需object在每帧要做出的变换我们...

    ZifengHuang

扫码关注云+社区

领取腾讯云代金券