反汇编学习

最近学习了一个反汇编类库 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
disassemble_info  structure  在dis-asm.h 中,用来保存opcode反汇编信息,该结构也存储在opdis_t 中


在编译opdis程序时,需要链接到lbfd , lopcode ,lopdis动态链接,程序才能正常使用,但如果动态链接库保存在全局可访问路径中,如在/etc/ld.so.conf.d/下添加动态链接库路径文件,执行/sbin/ldconfig 即可生效,这样就可以全局访问了。(需要root权限),局部可以修改LD_LIBRARY_PATH,来实现。

遇到的其它问题:

十六进制文件保存: 可以用hexedit编辑,或者用vim :%!xxd ,然后用%!xxd -r ,记得打开vim -b。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值