几种ARM反汇编器

本文对比了smiasm、radare与IDAPython三种ARM反汇编器,分析了它们的优劣。smiasm提供Python特性学习机会,但不支持Thumb指令集。radare拥有强大的逆向能力,但存在Python绑定问题和信息解析不足。IDAPython在ARM反汇编方面功能强大,但价格昂贵且不适合自动化处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.claudxiao.net/2011/12/arm-disassemblers/

最近在为androguard实现ARM反汇编和ARM漏洞利用代码检测的功能。Anthony告诉我三种方案:smiasm、radare、IDAPython。前段时间尝试了这些方法,各有优劣。归纳如下:

方案 开源 支持Thumb 递归反汇编 提供指令详情
smiasm
radare
IDAPython

下面是详细情况:

smiasm

smiasm是一个纯Python的反汇编框架。它由三个子项目构成,其中elfesteem实现ELF和PE格式解析,miasm实现反汇编。

smiasm的代码使用了Python的很多特性,比如elfesteem/elf_init.py中的这一段代码:

class StructWrapper( object ):
     class __metaclass__( type ):
         def __new__( cls , name, bases, dct):
             wrapped = dct[ "wrapped" ]
             if wrapped is not None : # XXX: make dct lookup look into base classes
                 for fname,v in wrapped._fields:
                     dct[fname] = property (dct.pop( "get_" + fname,
                                                   lambda self ,fname = fname: getattr ( self .cstr,fname)),
                                           dct.pop( "set_" + fname,
                                                   lambda self ,v,fname = fname: setattr ( self .cstr,fname,v)),
                                           dct.pop( "del_" + fname, None ))
             return type .__new__( cls , name, bases, dct)
     wrapped = None

让我这样的python初学者学到很多新的知识。

此外,smiasm使用递归下降反汇编,反汇编结果质量非常好。

但它不能很好地满足我的需求。ARM架构下有三种指令集:ARM、Thumb、Thumb-2。在Android的NDK中,默认使用Thumb;在其他代码中,ARM与Thumb的混合使用也是经常出现的。但smiasm目前仍不支持Thumb指令集。

另外,smiasm的代码还是有些臃肿,比如反汇编接口定义如下:

def dis_bloc(mnemo, pool_bin, cur_bloc, offset, job_done, symbol_pool,
              dont_dis = [], follow_call = False , patch_instr_symb = True ,
              dontdis_retcall = False , lines_wd = None ,
              dis_bloc_callback = None , dont_dis_nulstart_bloc = False ,
              * * kargs):

但大部分参数最后都没有真正使用,或者用了一个硬编码默认值。这种情况应该是作者希望写一个通用的反汇编框架导致的。但整个项目的代码都没有足够的文档或注释,可用性大打折扣。

radare

radare应该是最好的开源逆向框架了。它使用C语言书写,支持多种指令集和文件格式,例如支持ARM和Thumb。另外,它提供了对多种动态语言的绑定。radare对逆向的抽象非常到位,可以说是框架设计的一个典型。

但是在使用radare时,遇到不少问题。

一、它的python绑定使用SWIG实现,在unsigned char *型参数的传递上至今仍存在bug没有被补上(而且在近期不大可能解决这个问题了),就连自己用ctypes定义一个该类型都无法搞定。虽然能够把binary data转成hex string,以字符串的形式传给本地库,但效率上无疑打了折扣。

二、其对ARM的反汇编是线性扫描反汇编,需要自行判断一个函数是否返回,否则不断地反汇编下去。

三、从Python中得到的反汇编结果仅仅是可以给人读的字符串而已,不包含任何其他信息,例如指令类型、是否分支跳转、寄存器列表、注释等等。也就是说,如果要给人读,radare勉强足够,但如果要进一步处理,例如对代码序列做检测、画出CFG等,就需要再去解析字符串了。这样还不如从头开始解析binary code。

我们来看一个输出的片段,可以更直观地了解到这两个问题:

mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4 ; 0x4
sub sp, sp, #16 ; 0x10
ldr r2, [pc, #164] ; 0x000000bc
str r2, [fp, #-28]
......
mov r0, r3
mov r1, #0 ; 0x0
bl 0xfffffffffffff9f4
mov r3, r0
......
sub sp, fp, #12 ; 0xc
ldm sp, {fp, sp, pc}
andeq r2, r0, r0, lsr sp
undefined instruction 0xfffff678
undefined instruction 0xfffff690

四、对ELF文件格式的解析同样能力不足,太多信息被封装起来而无法获得。

IDAPython

IDAPython是对IDA Pro的一个功能扩展接口,封装了IDC的几乎所有API。

在ARM反汇编和反编译上,IDA Pro的功能无疑是最强大的。无论是其递归下降反汇编、多指令集支持、混合指令识别,还是交叉引用、CFG、自动注释、反编译等等。IDAPython的接口也非常丰富,完全可以获得需要的每个细节信息。

IDA Pro的主要问题在于,首先,它是一个商业软件(目前6.2的demo版包括了arm反汇编,但无法保存数据库);其次,它不适合于自动化处理。

结语

所以我说这三个方案是各有优劣,都无法完美地满足我的需求。

目前来看,自己写一个ARM/Thumb的反汇编器并不会特别困难,这个指令集本来就很简单。关键是选择好要实现的特性。

本条目发布于2011 年 12 月 25 日。属于信息安全分类。

汇编带符号表的32位/64位ELF目标文件,CPU类型:ARM PowerPC MIPS 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有文本比较等杂项功能。V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序汇编错误,网上最新版本提示;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家馈相关软件使用过程中的问题!
汇编带符号表的32位/64位ELF目标文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有文本比较等杂项功能。V1.26.00相对上一版本,增强EXE汇编,增加dbx老邮件解析、二维码功能,;V1.25.07相对上一版本,增加二进制汇编、IQ数据解析功能,完善MIPS汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家馈相关软件使用过程中的问题!
汇编Linux/Windows OS运行的32位/64位程序/动态库文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有CORE文件解调用栈、文本比较等功能。V2.0.3相对上一版本,完善ARM64、X8664、PPC64汇编、ko汇编,完善汇编文本文件比较、IQ数据解析,修复小BUG;V2.0.2相对上一版本,完善ARM64、X8664汇编、ARM64位core文件调用栈,完善文本文件比较、增加高亮、查找功能,修复小BUG;V2.0.0相对上一版本,完善ARM64汇编、ARM64位core文件调用栈,完善C++符号名字解析,支持工具运行在英文版OS;V1.26.01相对上一版本,增加ARM64汇编、64位core文件解析;V1.26.00相对上一版本,增强EXE汇编,增加dbx老邮件解析、二维码功能;V1.25.07相对上一版本,增加二进制汇编、IQ数据解析功能,完善MIPS汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家馈相关软件使用过程中的问题!
汇编带符号表的32位/64位ELF目标文件,CPU类型:ARM PowerPC MIPS X86 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有文本比较等杂项功能。V1.26.01相对上一版本,增加ARM64汇编、64位core文件解析;V1.26.00相对上一版本,增强EXE汇编,增加dbx老邮件解析、二维码功能;V1.25.07相对上一版本,增加二进制汇编、IQ数据解析功能,完善MIPS汇编,修复小BUG;V1.25.05相对上一版本,增加内存数据按数据类型解析功能;V1.25.04相对上一版本,完善X86汇编,修复小BUG;V1.25.02相对上一版本,COREDUMP统计、匹配目标文件等相关功能优化,修复小BUG;V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家馈相关软件使用过程中的问题!
汇编带符号表的32位/64位ELF目标文件,CPU类型:ARM PowerPC MIPS 操作菜单选择:文件解析 Alx+P ELF文件解析 Alt+E 另有文本比较等杂项功能。V1.25.00相对上一版本,相关功能支持动态库文件,查询代码支持无符号目标文件+有符号目标文件,COREDUMP统计、与问题单关联、目标文件/CORE文件/问题单同步;V1.24.02相对上一版本,针对进程主动捕捉异常的信息定制处理进一步完善COREDUMP文件解析与应用,增强软件管理;V1.24.01相对上一版本,进一步完善COREDUMP文件解析与应用,提供部分ARM Thumb指令汇编;V1.24.00相对上一版本,进一步完善COREDUMP文件解析与应用,提供堆栈调用关系分析;V1.23.03相对上一版本,提供32位X86汇编;V1.23.02相对上一版本,提供源代码行查询指令地址,OBJ/COREDUMP文件解析,sprintf函数参数特定检查,完善文件拖放操作,修复小BUG;V1.23.01相对上一版本,提供ELF文件指令修改,修复ARM MLS指令汇编错误等BUG;V1.23.00相对上一版本,提供程序地址对应源代码行查询,修复MIPS调试信息错误;V1.22相对上一版本,修复MIPS小端字节序汇编错误,网上最新版本提示;V1.21相对上一版本,菜单调整,完善64位ELF文件解析,解析调试信息;另部分增强功能的菜单操作设有密码,如有兴趣欢迎咨询。欢迎大家馈相关软件使用过程中的问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值