扫雷逆向分析 | 您所在的位置:网站首页 › windows扫雷规则 › 扫雷逆向分析 |
1.样本概况
1.1 应用程序信息
----------------------
应用程序名称:扫雷(基于Windows xp系统) MD5值:16A4FD569A3EB5CEBEB3DA99EF1D17E1 SHA1值:31A1A89BA067EA95F117754818429D6D8E8E59CF 简单功能介绍: 1. 游戏模式:分为初级,中级,高级,自定义模式 2. 自定义:可以设置游戏界面的高度(max=24),宽度(max=30),雷数(max=667) 3. 游戏窗口:显示有雷数,计时,和需要探测点击的雷区 4. 游戏规则:鼠标点击不为雷的区域会显示数字,提示周围的雷数,右键点击可以下标记,当所有不为雷的区域被点击即成功,点击到雷则游戏失败,点击笑脸可以重置当前雷区 1.2 分析环境及工具系统环境:win7 Professional 32位(15pb实验环境) 工具: 1. DIE(PE文件分析) 2. Cheat Engine(搜索数据) 3. VS2019(编写DLL程序) 4. MFCInject(dll注入工具) 5. DebugView(输出调试信息) 6. OllyDbg(动态调试分析) 7. Spy++(获取窗口信息) 8. Hash(计算MD5,SHA1) 1.3 分析目标实现扫雷外挂: 1. 鼠标移动悬停在雷区时,在窗口右上角显示雷区坐标及当前区域是否有雷 2. 实现F5一键扫雷功能,模拟点击所有不为雷的区域完成游戏 2.具体分析过程 2.1 DIE查壳 2.1.1 样本基础信息链接器版本:Microsoft Linker7.0 编写工具:从链接器版本判断为VS2003 类型:32位 分析样本导入库,为使用SDK编写的程序 获取数据基本步骤 多次修改获取到三个的高,宽,雷数的数据,且在CE中地址为绿色(静态地址,全局),有多份可能为(代码冗余,实际显示需要) 在VS2019中编写MFC DLL(静态编译,不依赖环境),关键调试代码 //调式获取到的高度,宽度,雷数变量地址 PDWORD pHeigth = (PDWORD)0x01005338; PDWORD pWidth = (PDWORD)0x01005334; PDWORD pMineCount = (PDWORD)0x01005330; //显示错误 BOOL CheckResult(BOOL result, WCHAR* str) { if (!result) { OutputDebugString(str); return FALSE; } return TRUE; } //保存窗口句柄 HWND g_hWnd = 0; //原来的回调函数 WNDPROC OldWinProc = 0; //新的窗口回调函数 LRESULT CALLBACK NewWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { //如果是键盘消息 //一键扫雷思路:遍历扫雷数组中的元素,判断不为雷的区域,模拟鼠标点击 case WM_KEYDOWN: { //f5 if (wParam == VK_F5) { CString str; str.Format(L"高:%d,宽:%d,雷数:%d\n", *pHeigth, *pWidth, *pMineCount); OutputDebugString(str); } } } //CallWindowProc 不处理的消息让原来的回调函数处理 return OldWinProc(hWnd, uMsg, wParam, lParam); } // CMFCmineApp 初始化 BOOL CMFCmineApp::InitInstance() { CWinApp::InitInstance(); //1. 通过查找窗口获取窗口句柄 spy++ //通过窗口名,窗口类名获取窗口句柄 g_hWnd = ::FindWindow(L"扫雷", L"扫雷"); //判断是否找到 if (CheckResult(g_hWnd != 0, L"未找到扫雷窗口\n") == 0) return 0; //2. 设置窗口回调函数 OldWinProc = WNDPROC(SetWindowLong(g_hWnd, GWL_WNDPROC, LONG(NewWndProc))); //判断是否修改成功 if (CheckResult(OldWinProc != 0, L"修改回调函数失败\n") == 0) return 0; return TRUE; }
使用注入工具MFCInject注入编写的dll,并打开ViewDebug查看调试信息,判断数据有效 这时可以跟踪数据,右键选择是谁访问了这个数据(原理:下断点) 这时笑脸重置按钮就发挥作用了,点击,在CE弹出的窗口中查看 在OD中跳转到访问关键数据的地址进行分析 一共三处,其他两处查看与界面相关,不做具体分析,分析地址为0x01002EE4 对代码逻辑进行分析,判断为获取高宽对雷区进行重置的操作,这里可以得到雷区数组的初始地址,雷区总大小 根据内存窗口对照扫雷窗口区分雷区属性(最好宽度对应) 雷区基地址:0x01005430 空白:0x0F 雷:0x8F 边界:0x10 点击后的周围雷数:0x40+周围雷数 爆炸的雷:0x8A 在DLL中编写遍历雷区数组的代码进行调试,关键代码 //如果是键盘消息 //一键扫雷思路:遍历扫雷数组中的元素,判断不为雷的区域,模拟鼠标点击 case WM_KEYDOWN: { //f5 if (wParam == VK_F5) { int count = 0; //循环遍历整个雷区数组 for (int y = 1; y > 4; y = (y - 0x27) >> 4; //在雷区范围内 if (0 |
CopyRight 2018-2019 实验室设备网 版权所有 |