win7扫雷逆向调试
成果: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扫雷逆向调试相关推荐
- VMware调试.【转】VMware+Windgb+Win7 内核驱动调试
ZC:我遇到的问题:com_1 怎么都不成功,记起来 貌似原来也遇到过这个问题,看了一下 VMware里面创建的是 "串行端口 2",于是 将 "com_1"改 ...
- 超详细的Android so库的逆向调试
/ 今日科技快讯 / 2021年上半年,中国移动实现营收4436亿元,同比增长13.8%:股东应占利润为人民币591亿元,增长6%. 中国电信营收2192亿元,同比增长13.1%:净利润为17 ...
- 《少年编程反汇编逆向调试入门》录制成功
少年编程反汇编逆向调试入门 编程要从娃娃抓起,邕城少年编程在行动 让我们一起来编程 手把手教你逆向编程,传授最先进的逆向调试技术,逆向分析系统化工程化,逆向编程不是梦. 李炎 2005年开始反汇编逆向 ...
- VMware+Windgb+Win7内核驱动调试
-------------------------------------------------------------- VMware+Windgb+Win7内核驱动调试 ------------ ...
- JavaScript逆向调试记 —— defcon threefactooorx writeup
defcon 29就这一道Web题目,说实话也没学到啥东西,唯一学到的就是勿钻牛角尖,及时调整策略. 此题严格来说算一道逆向题,只不过逆向的目标是混淆过JavaScript,我方法就是硬逆,等过几天看 ...
- ESP32在WIN7下USB调试串口驱动安装 解决USB JTAG/serial debug unit (Interface 0)无法安装驱动的问题
使用WIN7开发ESP32, 但一直不能解决USB烧录问题, 就是USB serial 总是无法安装, 虽然可以在WIN10下使用, 但切换虚拟机也麻烦 经常仔细对比查找分析, 问题解决, 顺利安装 ...
- 某商标局公告抓取思路总结爬虫过无限debugger Js逆向调试
某商标局公告抓取思路总结爬虫过无限debugger @[TOC](某商标局公告抓取思路总结爬虫过无限debugger) 目标地址:aHR0cDovL3dzZ2cuc2JqLmNuaXBhLmdvdi5 ...
- JavaScript 逆向调试技巧
前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结. 本文不会涉及任何的详细代码,仅仅是作为技术来讨论. 一.加密分析 在这里以账户下的视频列表为例,可以 ...
- JavaScript 逆向调试常用技巧
1. 断点调试 接下来介绍一个非常重要的功能 -- 断点调试.在调试代码的时候,我们可以在需要的位置上打断点,当对应事件触发时,浏览器就会自动停在断点的位置等待调试,此时我们可以选择单步调试,在面板中 ...
- VMware+Win7+windbg 双机调试
一. vmware 设置 1. 添加串口 2.选择输出到命名管道 3. 命名管道名称 \\.\pipe\com_1, 该端是服务器, 另一端是虚拟机 二. 系统设置 以管理员权限运行cmd, 输 ...
最新文章
- 上海交大发布 MedMNIST 医学图像分析数据集 新基准
- ubuntu mysql允许远程连接mysql_ubuntu下允许mysql远程连接
- 传热学c语言节点编程题_哈工大苏小红C语言编程题目第二周的答案第一二题12...
- ocbase 数据库 蚂蚁_iOS - OC SQLite 数据库存储
- Linux之nfs服务
- C++连接mysql的两种方式(ADO连接和mysql api连接)
- isnull PK <=>
- c语言指针怎样代替二维数组,c语言 指针和二维数组
- 随想录(做自己代码的测试工程师)
- CentOS 禁用Ctrl+Alt+Del重启功能
- 百度人脸识别:最简单的Python调用
- YDOOK:VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
- vs2010 c语言乱码,从vs2010中复制带有中文字符的代码到office等时出现乱码的解决方案.doc...
- linux bridge 添加fdb,Linux协议栈--网桥设备的实现
- 理性分析PDD,技术BUG?市场误操?还是……
- 【Unity3D基础教程】给初学者看的Unity教程(零):如何学习Unity3D
- Linux——》系统日志
- day001:数据结构和算法-时间频度和时间复杂度
- Windows 找不到网络 计算机或设备,“win7系统宽带拨号提示找不到设备”的解决方案...
- 有了面容解锁忘记了锁屏密码
热门文章
- html追加消除,HTML/CSS:在中间清除浮动元素而不添加不需要的标签
- select的使用及缺陷
- 测绘地物的识别:建筑上怎么样区别挑廊、走廊、檐廊
- 无人机探测雷达软硬件解决方案
- 正版windows序列号被激活工具重置问题解决
- windos10专业版激活(可用)
- 网站地图在线生成html,sitemap_网站地图_站点地图_在线生成_专注在线服务工具开发与同步部署 - sitemap 生成器...
- python怎么爬取新浪微博数据中心_新浪微博数据爬取研究
- 如何在网上买到下铺票2020_如何在网上购票选择下铺和靠窗的座位
- html实例,实现表单