2026.11.06 · 逆向工程 / MCP / Windows / 工程记录
给 2005 年的 MFC 地质软件接 MCP:两周折腾记
石文 Gxplorer 没有 API、没有脚本,我用窗口消息、对话框编排和 Frida 进程内调用,让 AI 能自然语言出图。两项能力已交付,两项卡在一个藏得很深的前置条件上。
项目页在这里:gx-mcp:给「石文 Gxplorer」接一个 AI 用的 MCP 服务(含代码与生成物)。
进展:2/4 交付
| 能力 | 状态 |
|---|---|
| 图元样式自动化(符号倍率 / 字号 / 显示开关) | ✅ 35 口井批量生效,180 秒 |
| 高清导出(矢量 PDF,文字可选中) | ✅ 1 页 / 188 矢量图元 / 231 文字对象 |
| 等值线、沉积相 | ⬜ 命令与克里金参数对话框已定位,缺 Z 值数据通道 |
| 连井剖面 分层 / 连层 | 🟡 剖面、井、分层道都建好了,卡在「分层结点」 |
三个还算漂亮的解法
1. 从状态块里逆出 266 条命令 ID。
Xtreme Toolkit 把工具栏状态序列化进注册表,记录尾部有个固定模式 <DWORD id> <flags> ff fe ff <len> <UTF-16 标题>。
按这个模式扫出「菜单文字 → 命令 ID」,之后 PostMessage(hFrame, WM_COMMAND, id, 0) 就能触发任意命令——不用鼠标,软件被遮挡也照跑。
2. 批量改样式:没有多选,就用"定位法"。
石文多选依赖 Ctrl+A,要真实键盘焦点。改用 定位井的位置:输入井名 → 视图自动居中 → 画布中心双击 → 弹出的「设置井属性」必然就是那口井(再读控件里的井名校验一次)。每口井 5 秒,36 口井 3 分钟。
3. 导出不截图,走打印。打印预览 → 全幅 → 打印 → Microsoft Print to PDF,全程标准 Win32 控件,产物是真正的矢量 PDF。
问题清单(按痛苦程度)
- 锁屏下什么都不能点。 排查很久才发现前台窗口是「Windows 默认锁屏界面」。不是权限,是会话被锁——
PostMessage还能用,菜单和工具栏全废。这也是后来转去做代码层的直接原因。 - XTP 弹菜单既无 HMENU 也无 UIA。 只能截屏、按文字行墨迹切菜单项、按行点击。更坑的是菜单项数会随状态变化,固定 index 非常脆。
- 报错框是自定义窗口(类名
Gxplorer),hookMessageBoxW根本不触发。 - 双击空白画布会新建一口空井,早期污染过数据。
- 「打开」的文件对话框标题叫「加载井处理文件」,按"打开"匹配永远找不到;而且这个命令会按文件内容分派(
.gxp当工程,其它当井数据解析)。 - Frida 挂钩 + 模态框同时存在时
detach会挂住,甚至把软件带崩。后来改成独立进程os._exit(0)收尾,并用软件自带的AutoLoadProject做崩溃恢复。 - 「分层结点」是个隐藏前置条件。 剖面里加分层道后点「加载地层数据」一直报
没有相应分层结点。好不容易在分层 → 地层管理器 → 右键 → 添加子地层找到入口,建出来的层却不写进.gxp(保存后字节数不变),推测是独立"地层库",需要先「引用信息表」绑定。
下一步
用 Frida 按字符串交叉引用定位「加载地层数据」的处理函数,直接读它的前置检查——比继续猜 UI 快得多。拿到 CContour 实例后 SetLevelInterval 就能出等值线。
合规
只做本机互操作:发窗口消息、读写它自己的对话框。不改二进制、不绕授权、仓库不含任何厂商安装包或授权组件。