-
-
[求助]问个libudis86的call指令的问题.
-
发表于:
2015-8-21 15:41
5635
-
[求助]问个libudis86的call指令的问题.
最近用libudis86做反汇编引擎反汇编东西.
发下下面个问题,问一下坛子里的各位牛牛,是不是我用libudis86的姿势不对.
ud_t u;
ud_init(&u);
//block->data为pe文件的内存镜像,在内存离得文件结构和在磁盘上一样.
//section_header为入口点所在节的节表
//raw_offset为EntryPoint的文件偏移
ud_set_input_buffer(&u, (const uint8_t *)(block->data), section_header->SizeOfRawData - (raw_offset - section_header->PointerToRawData));
ud_input_skip(&u, raw_offset);
ud_set_mode(&u, 32);
ud_set_syntax(&u, UD_SYN_INTEL);
int consequent_mov_instruction = 0;
while (ud_disassemble(&u)) {
const char * instructions = ud_insn_asm(&u);
printf("%s\n", instructions);
}
问题是这个样子的
先打一下输出:
VA FileOffset 偏移(相对于入口) 字节码 汇编指令
00413363 00002763 000021FB ff15b8d24100 call dword [0x41d2b8]
00413369 00002769 00002201 3bf4 cmp esi, esp
0041336B 0000276B 00002203 e843deffff call 0x4b
对于ff这种形式的call,由于编译阶段就将地址写到程序的原因,call到的地址是正确的.
但是e8这种形式的call,由于call的是一个偏移量.所以直接就是0x4b这种形式了,也就是得看'偏移(相对于入口)'这一列的值才能确定到哪个地方执行.
有没有什么办法让引擎自动将e8格式的call,输出成call VA的方式?
此外顺便问以下,如果我要遍历所有的非虚函数调用,除了递归下降反汇编,还有没有其他的办法?
我现在的办法是递归下降,但是由于libudis86的e8这种call,必须要解析一下字节码或者汇编指令,将call到的地址转化成VA才可以,感觉这样好挫..........
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课