香菜的博客
全部笔记

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。

问题清单(按痛苦程度)

  1. 锁屏下什么都不能点。 排查很久才发现前台窗口是「Windows 默认锁屏界面」。不是权限,是会话被锁——PostMessage 还能用,菜单和工具栏全废。这也是后来转去做代码层的直接原因。
  2. XTP 弹菜单既无 HMENU 也无 UIA。 只能截屏、按文字行墨迹切菜单项、按行点击。更坑的是菜单项数会随状态变化,固定 index 非常脆。
  3. 报错框是自定义窗口(类名 Gxplorer),hook MessageBoxW 根本不触发。
  4. 双击空白画布会新建一口空井,早期污染过数据。
  5. 「打开」的文件对话框标题叫「加载井处理文件」,按"打开"匹配永远找不到;而且这个命令会按文件内容分派(.gxp 当工程,其它当井数据解析)。
  6. Frida 挂钩 + 模态框同时存在时 detach 会挂住,甚至把软件带崩。后来改成独立进程 os._exit(0) 收尾,并用软件自带的 AutoLoadProject 做崩溃恢复。
  7. 「分层结点」是个隐藏前置条件。 剖面里加分层道后点「加载地层数据」一直报 没有相应分层结点。 好不容易在 分层 → 地层管理器 → 右键 → 添加子地层 找到入口,建出来的层却不写进 .gxp(保存后字节数不变),推测是独立"地层库",需要先「引用信息表」绑定。

下一步

用 Frida 按字符串交叉引用定位「加载地层数据」的处理函数,直接读它的前置检查——比继续猜 UI 快得多。拿到 CContour 实例后 SetLevelInterval 就能出等值线。

合规

只做本机互操作:发窗口消息、读写它自己的对话框。不改二进制、不绕授权、仓库不含任何厂商安装包或授权组件。