1

我必须找出我在内存中的一条指令的大小(实际上,我在内存中有一个小代码段并且想要获得第一条指令的大小)。我花了一些时间才找到 libopcodes 和 libbfd。我红了标题并试图提出一个简单的解决方案,但似乎我误解了一些东西,因为程序总是崩溃:

int main(int argc, char **argv) {
    disassemble_info *dis = malloc(sizeof(*dis));
    assert(dis != NULL);

    dis->arch = bfd_arch_i386;
    dis->read_memory_func = buffer_read_memory;
    dis->buffer_length = 64;
    dis->buffer = malloc(dis->buffer_length);
    memset(dis->buffer, 0x90, dis->buffer_length);
    disassemble_init_for_target(dis);

    int instr_size = print_insn_i386(0, dis);

    printf("instruction size is %d\n", instr_size);

    return 0;
}

预期的结果是指令大小为 1 ( nop)。

编辑

对不起各位,我是个笨人。

memset(dis, 0, sizeof(*dis));
4

2 回答 2

1

Linux 内核中有一些代码可以窃取。如果复制到用户模式程序中,它应该可以正常工作。

看看 arch/x86/lib 和 arch/x86/tools 那里有一个操作码映射文件,还有一个 awk 脚本读取它以在名为 innat.c 的文件中生成一个表。那里还有一些其他文件使用该表来实现解码器。

确定指令大小就足够了。

当然,这假设你对 GPL 没问题。

于 2013-03-12T04:10:19.947 回答
0

看起来 disassemble_info 数据结构需要比您提供的更多的初始化。从我一直在研究的例子来看,正确的初始化方法是调用 init_disassemble_info()。

看看是否有帮助。如果做不到这一点,请使用调试信息 ('-g') 编译您的程序并运行 gdb 以诊断崩溃发生的位置。

于 2013-03-12T01:20:16.707 回答