最近学习了一个反汇编类库 opdis,改类库是开源的,能够通过命令行和程序调用两种方式对指令进行反汇编。
主要操作的步骤分为2个:
1) 输入 指令流,opdis lib 提供了多个方式了来获取指令流,可以通过读取文件,字符串等方式获取,将指令流保存在opdis_buf_t 中
2) 通过调用 opdis_disam_liner 或者 opdis_disam_cflow 来进行反汇编,并将结果保存在opdis_inst_t中
在反汇编过程包含四个callback函数:
1) display : 输出反汇编后的每条指令,参数为 opdis_t 和 (* print_display) (*arg)
2) handler : 决定是否要解析下一条指令,起到一个承上启下的作用, 这样可以控制自己所要截取的指令条数,以及根据自己的条件假设来获取指令
3) resolver : 得到当前指令的分叉目标地址(the vma address of the branch target of the current instruction)
4) decoder: 根据指定的体系结构以及汇编类型来解析指令, 主要包含两种汇编类型(att 和 intel),和体系结构结构相关,因此需要设置 opdis_set_arch,设置
体系结构和汇编类型。实现把libopcode 字符流转化为 反汇编流,保存在 opdis_insn_t中
For x86 and x86-64 platforms, arch is always bfd_arch_i386, and mach is one of the following: (/usr/include/bfd.h 或者 dism
- bfd_mach_i386_i386
- bfd_mach_i386_i8086
- bfd_mach_i386_i386_intel_syntax
- bfd_mach_x86_64
在编译opdis程序时,需要链接到lbfd , lopcode ,lopdis动态链接,程序才能正常使用,但如果动态链接库保存在全局可访问路径中,如在/etc/ld.so.conf.d/下添加动态链接库路径文件,执行/sbin/ldconfig 即可生效,这样就可以全局访问了。(需要root权限),局部可以修改LD_LIBRARY_PATH,来实现。
遇到的其它问题:
十六进制文件保存: 可以用hexedit编辑,或者用vim :%!xxd ,然后用%!xxd -r ,记得打开vim -b。