2013-03-12 117 views
1

我必须找出我在内存中的指令的大小(实际上,我在内存中有一个小的代码段,并且想要获得第一条指令的大小)。 我花了一些时间来查找libopcodes和libbfd。我红头,并试图拿出一个简单的解决方案,但它似乎像我missunderstood的东西,因为该方案老是死机:libopcodes:得到一个指令的大小

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)); 

回答

0

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

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

+0

增加了flavor(bfd_target_elf_flavour),mach(bfd_mach_x86_64)和endian(BFD_ENDIAN_LITTLE)。没有帮助,但我不知道什么味道。我还添加了init_disassemble_info(dis,NULL,NULL); 编程接收到的信号SIGSEGV,分段故障。 0x0000000000000000在?? () (gdb)bt #0 0x0000000000000000 in ?? () #1 0x00007ffff7b1c749在? ()from /usr/lib/libopcodes-2.22.90-system.20120924.so #2 0x0000000000400b5c in main(argc = 1,argv = 0x7fffffffe428)at /home/sebastian/prog/libredirect/libredirect/test.c: 36 – 2013-03-12 01:30:30

+0

您可能希望更新程序清单以包含您尝试的内容,并粘贴/格式化gdb堆栈跟踪。 – 2013-03-12 01:37:14

+0

另一项:您正在设置缓冲区和buffer_length,但不是buffer_vma。顺便说一句,检查出这个文件:https://github.com/mkfs/opdis/blob/master/opdis/opdis.c;它利用libopcodecs。我一直在研究它以确定您的程序中可能缺少哪些步骤。这对你也可能有用。 – 2013-03-12 01:50:00

1

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

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

确定指令大小就足够了。

这里假设你可以使用GPL。

+0

谢谢,这将适用于x86。如果我想将它移植到另一个架构,如手臂怎么办?我在那里找不到相应的东西。 – 2013-03-12 16:41:18