首页
社区
课程
招聘
[求助]问个libudis86的call指令的问题.
发表于: 2015-8-21 15:41 5518

[求助]问个libudis86的call指令的问题.

2015-8-21 15:41
5518
最近用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直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 177
活跃值: (471)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第一个:ud_set_pc(&u,IMAGE_BASE)

第二个你过来,我告诉你
2015-8-21 15:52
0
雪    币: 2332
活跃值: (3624)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
....
第一个:
呃,漏了这个函数了,ud_set_pc(&u, pe_header->OptionalHeader.AddressOfEntryPoint + pe_header->OptionalHeader.ImageBase)
第二个:
对于你这种不好好上班,过来秒回帖子调戏我的行为,我只想说:好的,我马上过去~~
2015-8-21 16:28
0
游客
登录 | 注册 方可回帖
返回
//