我正在开发一个项目,我想在x86中添加一些自定义操作码并在QEMU中运行它们。我已经想出如何修改QEMU中的代码生成,以便使用'假'操作码进行汇编指令并在QEMU中对其执行某些操作。
然而,我遇到麻烦的部分是我如何实际创建一个带有假指令的二进制文件。我想到的唯一方法是添加一些db
语句,然后手动编写指令。例如:
xor EAX, EBX
db 0xf1,0x32,0x55,0x00
mov EBX, EAX
(假设db有足够的字节作为实际指令)。这实际上是否会编译一个二进制文件,其中我在第二行中定义的字节被视为指令?
这有更优雅的方法吗?由于我将修改QEMU以支持这些更改,因此我并不受指令格式的限制 - 我只需要让QEMU的代码生成器识别OP代码,其余的我可以根据需要制定。
答案 0 :(得分:8)
当出现新的CPU模型时,使用db
的方法是标准程序,当前工具没有立即更新以支持其他寻址模式和/或指令。
请注意,在x86指令集中找到用于定义新指令的漏洞现在相当具有挑战性。检查Intel's latest CPU architecture documents:附录中总有一组表格显示操作码映射。这将是找到未使用的指令操作码序列的最简单方法。
答案 1 :(得分:5)
db
很好,并且会在第一条指令之后和最后一条指令之前立即发出给定的字节序列。
您可以考虑为新指令创建一堆汇编程序宏,这些宏将获取相关参数并发出您的魔术字节码。