libopcodes:获取指令的大小

时间:2013-03-12 00:37:50

标签: c assembly x86 binutils

我必须找出内存中指令的大小(实际上,我在内存中有一个小代码段,并希望获得第一条指令的大小)。 我花了一些时间来找到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));

2 个答案:

答案 0 :(得分:1)

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

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

确定指令大小就足够了。

当然,这假设您可以使用GPL。

答案 1 :(得分:0)

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

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

相关问题