成果:win7扫雷外挂(只支持32位)


目标:找到可判断是否是雷的地址、雷区宽度高度地址

首先尝试XP扫雷的bp rand然后一直被断下无法运行,有人把每个调用rand的地方都记录下来然后一个个排除,但是我没这个耐心所以换个方法

注意到游戏结束后会弹出个对话框所以bp DialogBoxParamW,玩一局后断下来,Ctrl+F9几次找到
00693C7A  |.  8BCE          mov     ecx, esi
00693C7C  |.  E8 6FF0FFFF   call    00692CF0        ;  失败
(注:minesweeper.exe模块的地址是会变的所以不要直接用前面的地址)

或者

00693C3F  |.  8BCE          mov     ecx, esi
00693C41  |.  E8 8CF0FFFF   call    00692CD2        ;  胜利

往上可以找到游戏结束的条件

00693BE6  |.  8B46 28       mov     eax, dword ptr [esi+28]
00693BE9  |.  3BC3          cmp     eax, ebx
00693BEB  |.  75 2C         jnz     short 00693C19  ;  游戏结束 eax ==[esi+0x28] != ebx == 1

对esi+28下硬件写入断点,踩一个雷,断下
00C617B8  |.  8946 28       mov     dword ptr [esi+28], eax  ;  写入游戏状态 4结束 3胜利 2结束动画播完 1开始

Ctrl+F9找哪里调用了这个函数,并且前面要有可以跳过这个调用的条件

005D8986  |> \83BE 9C000000>cmp     dword ptr [esi+9C], 0  ;  [esi+0x9C] != 0 游戏状态改变
005D898D  |.  C686 AC000000>mov     byte ptr [esi+AC], 0
005D8994  |.  5F            pop     edi
005D8995  |.  74 18         je      short 005D89AF         ;  游戏状态未改变
005D8997  |.  8B0D 60746300 mov     ecx, dword ptr [637460]
005D899D  |.  6A 01         push    1
005D899F  |.  E8 B4A50000   call    005E2F58
005D89A4  |.  8B0D B4686300 mov     ecx, dword ptr [6368B4]
005D89AA  |.  E8 FFA4FFFF   call    005D2EAE        ;  游戏状态改变时调用,会写入游戏状态

然后对esi+0x9C下硬件写入断点,踩一个雷,断下

00416FD6  |.  8B0D B4684700 mov     ecx, dword ptr [4768B4]  ;  this指针!![minesweeper.exe+0x868B4],minesweeper.exe代表模块地址,下同
00416FDC  |.  32DB          xor     bl, bl
00416FDE  |.  E8 35A4FFFF   call    00411418    ;  含有判断踩下的方块是不是雷,参数有方块X、Y坐标
00416FE3  |.  85C0          test    eax, eax
00416FE5  |.  7F 0A         jg      short 00416FF1            ;  返回值 > 0
00416FE7  |.  89B7 9C000000 mov     dword ptr [edi+9C], esi   ;  影响游戏状态:结束

终于到了这里,只要分析minesweeper.exe+0x21418这个函数就好了!

开头有句

0041141D   .  8B49 10       mov     ecx, dword ptr [ecx+10]  ;  this指针变成[[minesweeper.exe+0x868B4]+0x10]

然后是重要部分!

00410C57  |.  8B5D 08       mov     ebx, dword ptr [ebp+8]   ;  ebx=X坐标
00410C5A  |.  56            push    esi
00410C5B  |.  8BF1          mov     esi, ecx                ;  this指针
00410C5D  |.  8B46 40       mov     eax, dword ptr [esi+40]   ;  this->某对象
00410C60  |.  8B40 0C       mov     eax, dword ptr [eax+C]   ;  ->某对象
00410C63  |.  8B0498        mov     eax, dword ptr [eax+ebx*4]   ;  ->某对象
00410C66  |.  8B40 0C       mov     eax, dword ptr [eax+C]      ;  ->某对象
00410C69  |.  57            push    edi
00410C6A  |.  8B7D 0C       mov     edi, dword ptr [ebp+C]    ;  edi=Y坐标
00410C6D  |.  8B04B8        mov     eax, dword ptr [eax+edi*4]   ;  eax=方块数据
00410C70  |.  33C9          xor     ecx, ecx
00410C72  |.  894D FC       mov     dword ptr [ebp-4], ecx
00410C75  |.  83F8 09       cmp     eax, 9
00410C78  |.  74 1B         je      short 00410C95   ;  eax=9 方块没开

此时可以得到方块数据的表达式
估计是这样的变量 vector<vector<int>> data;
[[[[[[[minesweeper.exe+0x868B4]+0x10]+0x40]+0x0C]+X坐标*4]+0x0C]+Y坐标*4]
7级指针啊!
分析一下取值有 1~8数字 9未开 10旗 11问号 12空
但是看不出有没有雷,继续往下看,又有一个用到坐标的地方

00410CBA  |> \8B46 44       mov     eax, dword ptr [esi+44]    ;  this->某对象
00410CBD  |.  8B40 0C       mov     eax, dword ptr [eax+C]     ;  ->某对象
00410CC0  |.  8B0498        mov     eax, dword ptr [eax+ebx*4] ;  ->某对象
00410CC3  |.  8B40 0C       mov     eax, dword ptr [eax+C]     ;  ->某对象
00410CC6  |.  380C07        cmp     byte ptr [edi+eax], cl     ;  ->某对象,与0比较
00410CC9  |.  74 05         je      short 00410CD0             ;  != 0 则是雷
00410CCB  |.  894D FC       mov     dword ptr [ebp-4], ecx     ;  返回0,踩中雷!

函数最后的返回值
00410CFC  |> \8B45 FC       mov     eax, dword ptr [ebp-4]    ;  返回值=[ebp-0x4]

终于得到判断雷的地址了
估计是这样的变量 vector<vector<BYTE>> isMine;
[[[[[[[minesweeper.exe+0x868B4]+0x10]+0x44]+0x0C]+X坐标*4]+0x0C]+Y坐标]

---------------------------------------------------------------------------

然后是找雷区的宽度和高度
用CE搜索高度,最后只剩3个静态地址直接拿一个来用
[minesweeper.exe+0x7E1BC]
(注:自定义的宽高存放在另一个地址,所以不要搜索自定义的宽高,而是搜索预设的初级中级高级的宽高)

然后搜索宽度,最后剩2个地址但是是动态的
0x01C32354,0x01C432E4

先对前面那个地址下硬件写入断点,开始新游戏后断下

00EE5A59  |.  FF06          inc     dword ptr [esi]     ;  [esi]++

在这里一直+1直到等于宽度,但是我想要的是最早赋值的宽度地址
对后面那个地址下断,开始新游戏后断下

00ED0E0C  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
00ED0E0F  |.  8946 0C       mov     dword ptr [esi+C], eax   ;    [esi+0x0C]为宽度

Ctrl+F9来到上一层看看this指针

00ED3A81  |.  8B4D D8       mov     ecx, dword ptr [ebp-28]   ;  this = [ebp-28]

再上面点,看来是给这个对象分配内存

00ED3A62  |> \6A 48         push    48
00ED3A64  |.  E8 3EA20000   call    00EDDCA7            ;  malloc(0x48)
00ED3A69  |.  59            pop     ecx
00ED3A6A  |.  8945 D8       mov     dword ptr [ebp-28], eax    ;  [ebp-0x28] = malloc(0x48);

下面有保存这个指针

00ED3A9E  |.  8946 10       mov     dword ptr [esi+10], eax   ;  [[esi+0x10]+0x0C]为宽度

又出现了esi,看来又要找这个函数的this指针
往上一层

00EF3DBA  |.  8BCE          mov     ecx, esi

。。。再往上一层

00EF3E32  |.  68 E0000000   push    0E0
00EF3E37  |.  E8 6B9E0000   call    00EFDCA7    ;  malloc(0xE0)
00EF3E3C  |.  59            pop     ecx
00EF3E3D  |.  8BC8          mov     ecx, eax

好吧,又是分配内存,下面有保存这个指针

00EF3E57  |.  A3 B468F500   mov     dword ptr [F568B4], eax   ;  [[[minesweeper.exe+0x868B4]+0x10]+0x0C]为宽度

终于得到了宽度的表达式
[[[minesweeper.exe+0x868B4]+0x10]+0x0C]

逆向完毕!

win7扫雷逆向调试相关推荐

  1. VMware调试.【转】VMware+Windgb+Win7 内核驱动调试

    ZC:我遇到的问题:com_1 怎么都不成功,记起来 貌似原来也遇到过这个问题,看了一下 VMware里面创建的是 "串行端口 2",于是 将 "com_1"改 ...

  2. 超详细的Android so库的逆向调试

    /   今日科技快讯   / 2021年上半年,中国移动实现营收4436亿元,同比增长13.8%:股东应占利润为人民币591亿元,增长6%. 中国电信营收2192亿元,同比增长13.1%:净利润为17 ...

  3. 《少年编程反汇编逆向调试入门》录制成功

    少年编程反汇编逆向调试入门 编程要从娃娃抓起,邕城少年编程在行动 让我们一起来编程 手把手教你逆向编程,传授最先进的逆向调试技术,逆向分析系统化工程化,逆向编程不是梦. 李炎 2005年开始反汇编逆向 ...

  4. VMware+Windgb+Win7内核驱动调试

    -------------------------------------------------------------- VMware+Windgb+Win7内核驱动调试 ------------ ...

  5. JavaScript逆向调试记 —— defcon threefactooorx writeup

    defcon 29就这一道Web题目,说实话也没学到啥东西,唯一学到的就是勿钻牛角尖,及时调整策略. 此题严格来说算一道逆向题,只不过逆向的目标是混淆过JavaScript,我方法就是硬逆,等过几天看 ...

  6. ESP32在WIN7下USB调试串口驱动安装 解决USB JTAG/serial debug unit (Interface 0)无法安装驱动的问题

    使用WIN7开发ESP32, 但一直不能解决USB烧录问题,  就是USB serial 总是无法安装, 虽然可以在WIN10下使用, 但切换虚拟机也麻烦 经常仔细对比查找分析, 问题解决, 顺利安装 ...

  7. 某商标局公告抓取思路总结爬虫过无限debugger Js逆向调试

    某商标局公告抓取思路总结爬虫过无限debugger @[TOC](某商标局公告抓取思路总结爬虫过无限debugger) 目标地址:aHR0cDovL3dzZ2cuc2JqLmNuaXBhLmdvdi5 ...

  8. JavaScript 逆向调试技巧

    前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结. 本文不会涉及任何的详细代码,仅仅是作为技术来讨论. 一.加密分析 在这里以账户下的视频列表为例,可以 ...

  9. JavaScript 逆向调试常用技巧

    1. 断点调试 接下来介绍一个非常重要的功能 -- 断点调试.在调试代码的时候,我们可以在需要的位置上打断点,当对应事件触发时,浏览器就会自动停在断点的位置等待调试,此时我们可以选择单步调试,在面板中 ...

  10. VMware+Win7+windbg 双机调试

    一. vmware 设置 1. 添加串口 2.选择输出到命名管道 3. 命名管道名称  \\.\pipe\com_1,  该端是服务器,  另一端是虚拟机 二. 系统设置 以管理员权限运行cmd, 输 ...

最新文章

  1. 上海交大发布 MedMNIST 医学图像分析数据集 新基准
  2. ubuntu mysql允许远程连接mysql_ubuntu下允许mysql远程连接
  3. 传热学c语言节点编程题_哈工大苏小红C语言编程题目第二周的答案第一二题12...
  4. ocbase 数据库 蚂蚁_iOS - OC SQLite 数据库存储
  5. Linux之nfs服务
  6. C++连接mysql的两种方式(ADO连接和mysql api连接)
  7. isnull PK <=>
  8. c语言指针怎样代替二维数组,c语言 指针和二维数组
  9. 随想录(做自己代码的测试工程师)
  10. CentOS 禁用Ctrl+Alt+Del重启功能
  11. 百度人脸识别:最简单的Python调用
  12. YDOOK:VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
  13. vs2010 c语言乱码,从vs2010中复制带有中文字符的代码到office等时出现乱码的解决方案.doc...
  14. linux bridge 添加fdb,Linux协议栈--网桥设备的实现
  15. 理性分析PDD,技术BUG?市场误操?还是……
  16. 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D
  17. Linux——》系统日志
  18. day001:数据结构和算法-时间频度和时间复杂度
  19. Windows 找不到网络 计算机或设备,“win7系统宽带拨号提示找不到设备”的解决方案...
  20. 有了面容解锁忘记了锁屏密码

热门文章

  1. html追加消除,HTML/CSS:在中间清除浮动元素而不添加不需要的标签
  2. select的使用及缺陷
  3. 测绘地物的识别:建筑上怎么样区别挑廊、走廊、檐廊
  4. 无人机探测雷达软硬件解决方案
  5. 正版windows序列号被激活工具重置问题解决
  6. windos10专业版激活(可用)
  7. 网站地图在线生成html,sitemap_网站地图_站点地图_在线生成_专注在线服务工具开发与同步部署 - sitemap 生成器...
  8. python怎么爬取新浪微博数据中心_新浪微博数据爬取研究
  9. 如何在网上买到下铺票2020_如何在网上购票选择下铺和靠窗的座位
  10. html实例,实现表单