# HackWinMine **Repository Path**: hambug_n/hack-win-mine ## Basic Information - **Project Name**: HackWinMine - **Description**: 本程序是针对微软扫雷的外挂程序,可以在开局前透视雷区布局,可以一键扫雷。 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-07 - **Last Updated**: 2024-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: Winmine, 扫雷外挂 ## README # 1.简介 本程序是针对微软扫雷的外挂程序,可以在开局前透视雷区布局,可以一键扫雷。 本程序基于C# WPF开发,开发环境为VisualStudio2018,操作系统为Windows11。 # 2 扫雷游戏简介 扫雷是微软开发并发行的一款大众类的益智小游戏,于1992年发行。 扫雷中玩家的目标是在最短时间内识别出所有非雷区的格子,同时避免触碰到地雷。 游戏区域由多个隐藏格子组成,每个格子可能隐藏着地雷或数字,数字表示周围八个格子中地雷的数量。 玩家通过点击格子揭示内容,使用逻辑推理逐步排除雷区。 游戏考验玩家的观察力和推理能力,任何一次误点地雷都会导致游戏失败。 ## 2.1 游戏界面 游戏区包括雷区、地雷计数器(位于左上角,记录剩余地雷数)和计时器(位于右上角,记录游戏时间)。 矩形雷区中随机布置一定数量的地雷。 根据难度雷区不同,雷区大小如下: 初级为9*9个方块10个雷, 中级为16*16个方块40个雷, 高级为16*30个方块99个雷, 自定义级别可以自己设定雷区大小和雷数, 但是雷区大小不能超过24*30。 雷区每方块为24*24像素的方块。 雷区相对偏移像素为<17,82>。 ## 2.2 数据格式 程序.data段起始地址为:0x01005340,不同版本地址可能不同,可以使用反编译工具查看.data段 游戏等级地址:864,int型, 0—初级 1—中级 2—高级 3—自定义 雷数地址:868,int型 行数地址:872,int型 行列存储:876,int型 雷区方块状态地址:0~863 雷区方块状态定义: | 数值 | 含义 | 备注 | |-------- | -------- | -------- | |0x10| 边框 | | |0x0F| 未扫,无雷 | | |0x40| 已打开,标记空 | | |0x41| 已打开,标1 | | |0x4X| 已打开,标X | | |0x0E| 未打开,标红旗,下无雷 | 扫错 | |0x0D| 未打卡,标问号,下无雷 | 扫错 | |0x8E| 未打开,标红旗,下有雷 | | |0x8D| 未打开,标问号,下有雷 | | 0x8A| 已打开,未标记,下有雷 | | |0xCC| 已打开,标记错误,下有雷 | | ## 2.3 扫雷流程 程序启动或点击开局,扫雷数据进行刷新。 第一次点击雷区,定时器启动 当第一次位置有雷时,程序将点击位置的雷移到他处,保证第一次不会中雷,默认是第一个空格。 # 3 破解程序介绍 本程序使用ReadProcessMemory获取扫雷进程的数据,然后分析对应数据。 一键破解时,使用SendMessage向扫雷窗体发送鼠标点击事件。 可能也可以通过修改扫雷进程数据一键破解,但没有进一步尝试。 ## 3.1 软件界面 界面包含两个按钮和一个雷区。 点击按钮“读取数据”时,程序会读取扫雷程序的data区信息,并将地雷位置显示在本程序雷区, 绿色部分微边框,紫色部分为地雷,白色部分为空白区,黄色部分为已经点开的区域。 点击按钮“一键破解”时,程序会执行“读取数据”的所有操作,并且会向扫雷程序窗体发送鼠标点击事件。 当没有扫雷程序启动时,会告警提示“找不到扫雷程序”。 本程序只适用于一个扫雷程序的场景,多个扫雷程序同时启动会出错。 ## 3.1 程序文件 WinMineCrack:外挂程序核心文件 WinMineData:保存扫雷程序数据 MainWindow:窗体文件 ## 3.3 关键函数 [DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);