2013-03-12 118 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