请 gpt 6 astra high 大人重新实现了一遍,就解决问题了。 https://github.com/asukaminato0721/shiinario_rs

下面是神谕:

我查了研究记录、抓取日志和 /tmp 的实际文件,还现场用 Capstone 和 Unicorn 验证了一遍小函数。这三件事是同一条分析流程:

加壳 EXE
   ↓ Wine 下运行,让壳自己解密
解密后的内存快照
   ├─ Capstone:查看 x86 汇编
   ├─ Ghidra:分析函数、交叉引用,导出伪 C
   └─ Unicorn:执行原始机器码,验证推断
                         ↓
                   用 Rust 实现行为

1. 有壳,怎么分析的?

针对这里的 RANDL_.exe,采用的是运行后抓内存。

Detect It Easy 特征识别的 HyperTech Crackproof。

具体过程是:

  1. 用自写的 C# 调试程序 TracePe.exe,在 Wine 下启动原 EXE。
  2. 壳执行解密时,会用异常控制执行流程。调试器把属于程序的异常交回程序处理,让解密继续。
  3. 原 EXE 单独启动会因为缺少启动器创建的共享内存而退出。研究工具读取它期待的名字和比较内容,补上共享内存,再重试 OpenFileMappingA。
  4. 解密完成后,壳发现调试器,走到 0x0157b1dd 提前返回。工具就在这里停住,把映像内存保存下来。

实际日志里有:

RESEARCH: supplied missing startup mapping and retried OpenFileMappingA
STACK HIT ip=0157b1dd
DUMP ... base=00400000 size=0117e000 unreadable_pages=0
CAPTURE COMPLETE; original game startup has not been validated

这时游戏还没正常进入窗口,但我们需要分析的引擎机器码已经解密出来了。

随后把快照整理成 Ghidra 能导入的 engine-analysis.exe。它只用于静态分析:没有完整重建导入表,因此不能把它当成可以直接运行的脱壳版游戏。

2. Capstone 和 Unicorn 具体怎么用?

两者分工很清楚:

工具 输入 得到什么
Capstone 机器码字节和地址 汇编指令
Unicorn 机器码、内存、寄存器初始状态 执行后的寄存器和内存变化