几种ARM反汇编器
来源:互联网 发布:淘宝详情页尺寸是多少 编辑:程序博客网 时间:2024/06/05 10:06
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 日。属于信息安全分类。
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的反汇编器并不会特别困难,这个指令集本来就很简单。关键是选择好要实现的特性。
- 几种ARM反汇编器
- arm反汇编方法
- ARM反汇编学习
- arm反汇编方法
- arm 反汇编基础
- arm 反汇编
- ARM反汇编练习
- arm 反汇编
- ARM 反汇编的查看
- ARM反汇编基础(一)
- 几种程序的反汇编代码入口特征
- 一个ARM简单反汇编例子
- ARM的BIN文件反汇编方法
- ARM的BIN文件反汇编方法
- ARM的BIN文件反汇编方法
- ARM的BIN文件反汇编方法
- ARM反汇编动态链接分析
- IDA分析HELLO ARM 程序的ARM 反汇编
- 使用Dom4j解析xml文件---SAXReader方式
- java 正则表达式
- linux C复习:文件操作(stat获取文件属性)
- 封装系统JSON解析(YHJSONSerialization),适合IOS 5.0以上
- HDU 1249 三角形 数论
- 几种ARM反汇编器
- 汇编代码注入器
- python with 语句的实例用法 & 高级用法:
- ORACLE PL/SQL编程之八: 把触发器说透
- css基础(二)IE CSS Bugs 列表和解决方法
- android camera(一):camera模组CMM介绍
- 【AndroidManifest.xml详解】Manifest属性之versionCode,versionName
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- 古典问题: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?