Assembly 如何使用qemu(函数cpu\u memory\u rw\u debug()的大小参数)获取指令的操作码?

Assembly 如何使用qemu(函数cpu\u memory\u rw\u debug()的大小参数)获取指令的操作码?,assembly,x86,x86-64,qemu,opcode,Assembly,X86,X86 64,Qemu,Opcode,我想获取在QEMU来宾中执行的i386指令的操作码。我发现cpu\u memory\u rw\u debug(env、pc、buf、size、is\u write)可以访问内存。然而,我不知道我要读多少记忆。换句话说,要为size指定什么值。我在一篇博文中了解到 x86指令集(16、32或64位,所有变体/模式)保证适合15字节 如果我每次读取15个字节,我需要以某种方式确定操作码的结束位置,因为大多数操作码都小于15个字节 我想这一定有一个qemu函数。 也许有一个更好的qemu特性可以在不影

我想获取在QEMU来宾中执行的i386指令的操作码。我发现
cpu\u memory\u rw\u debug(env、pc、buf、size、is\u write)可以访问内存。然而,我不知道我要读多少记忆。换句话说,要为
size
指定什么值。我在一篇博文中了解到

x86指令集(16、32或64位,所有变体/模式)保证适合15字节

如果我每次读取15个字节,我需要以某种方式确定操作码的结束位置,因为大多数操作码都小于15个字节

我想这一定有一个qemu函数。 也许有一个更好的qemu特性可以在不影响操作码长度的情况下实现我想要的功能。不幸的是,我两个都找不到

A我在概念上遗漏了什么


感谢所有提示。

很难确定x86指令的长度;在到达操作码之前,必须对前缀进行解码,操作码本身是可变长度的(转义字节,对于一个操作数insn,可以包含mod/rm字段中的3位,如
not
)。操作数大小前缀使用立即数更改指令其余部分的长度。(
add r32,imm32
vs.
add r16,imm16
:此LCP案例实际上会暂停英特尔硬件中的解码器)。IDK qemu内部,但寻找解码x86指令的qemu函数听起来比自己编写好得多。更好的问题是,您想如何处理这些信息。@Jester我想将所有执行的指令(即它们的操作码)存储到一个文件中。换句话说,我想创建QEMU客户机的执行指令跟踪。我不想使用QEMU监视器,因为我需要比监视器提供的更多的信息。这就是我使用PANDA的原因,PANDA是一个基于qemu的工具,它为我提供了更多信息,还允许将它与公共qemu函数相结合,例如在
cpu\u memory\u rw\u debug()
@PeterCordes你所说的“IDK qemu内部构件,…”是什么意思?IDK?你是对的,寻找一个对应的qemu函数是可行的,但我找不到。你们有什么提示吗?只有当你们一个字节一个字节地解码它时,你们才能决定指令的结束。如果有足够的内存,捕获通常冗余的15字节是最简单的方法;在到达操作码之前,必须对前缀进行解码,操作码本身是可变长度的(转义字节,对于一个操作数insn,可以包含mod/rm字段中的3位,如
not
)。操作数大小前缀使用立即数更改指令其余部分的长度。(
add r32,imm32
vs.
add r16,imm16
:此LCP案例实际上会暂停英特尔硬件中的解码器)。IDK qemu内部,但寻找解码x86指令的qemu函数听起来比自己编写好得多。更好的问题是,您想如何处理这些信息。@Jester我想将所有执行的指令(即它们的操作码)存储到一个文件中。换句话说,我想创建QEMU客户机的执行指令跟踪。我不想使用QEMU监视器,因为我需要比监视器提供的更多的信息。这就是我使用PANDA的原因,PANDA是一个基于qemu的工具,它为我提供了更多信息,还允许将它与公共qemu函数相结合,例如在
cpu\u memory\u rw\u debug()
@PeterCordes你所说的“IDK qemu内部构件,…”是什么意思?IDK?你是对的,寻找一个对应的qemu函数是可行的,但我找不到。你们有什么提示吗?只有当你们一个字节一个字节地解码它时,你们才能决定指令的结束。如果您有足够的内存,捕获通常冗余的15个字节是最简单的方法。