不把指令语义写死在代码里:运行时加载语义的 x86 全系统模拟器
来源:liblisa.nl — 2026-11-06
📋 概述
Sem86 是一个 x86 全系统模拟器,但它不在代码里硬编码指令语义,而是在运行时从输入文件加载。这样切换语义就变成换一个文件,可以精确复现未定义行为与未文档化指令。尽管语义无法在编译期被优化、而且用的是 LLVM 而不是专门磨过的 JIT,它并不慢:速度是 Bochs 的 1.9 倍,达到 QEMU 的约 42%。工作发表在 QRS'26。长期目标是把 libLISA 自动推断出的语义接进来,实现所谓「CPU 克隆」:分析一颗 CPU、抽出它的语义、再启动一个精确模拟这颗 CPU 的模拟器。
🔑 核心要点
- 语义外置的动机是恶意软件分析:x86 允许未定义行为,恶意样本可以靠不同实现的差异来检测自己是否在沙箱里。
- Sem86 支持执行中途切换语义,可以对指令执行做二分,找出不同语义开始分歧的确切那一步。
- 论文演示了一个玩具恶意样本,利用未定义指令行为判断自己是否运行在模拟环境中。
- 目前仍是手写语义,因为 libLISA 还没有 16 位与 32 位 x86 的观察器;但两边的语义格式很接近,切换成本不高。
💡 金句
它的速度是 Bochs 的 1.9 倍,达到 QEMU 性能的约 42%。
👍 0
👎 0
← 返回 Lobsters 首页