◆赵北庚 王剑锋
Android系统是当今使用最广泛的智能手机系统,基于Andoird系统的手机程序类型丰富,功能多样。逆向分析是指在没有程序源代码的情况下,通过将可执行文件反编译成汇编代码,阅读分析汇编代码分析出程序逻辑的方法。Sma1i汇编码是Android虚拟机使用的机器码。研究Android程序的Sma1i汇编码逆向分析,对Android系统的程序功能改进、打补丁和恶意代码分析有重要的意义。基于此,设计和完成了一个实验,在没有源代码的情况下,通过对一个真实的 Android短信木马程序9555.apk进行反汇编逆向分析,梳理出程序功能。实验的过程和思路对研究Android程序的逆向分析有积极的意义。
使用apktoo1工具,将9555.apk反汇编为sma1i文件,命令如下:
apktoo1 d 9555.apk outdir
其中,9555.apk是要反编译的Android程序包,outdir为输出路径。得到的输出文件如图1所示。
图1 使用apkToo1反编译得到的文件
如图1所示,res文件夹中包含了程序的各种资源文件,如图片、定义界面的xm1文件、字符串资源、资源索引文件,等;sma1i文件夹里包含了反编译得到的Sma1i代码文件,每个Sma1i文件对应源代码中的一个Java文件;AndroidManifest.xm1是此程序的配置文件。
通常一个程序工程中包含多个 Java文件,反编译也会得到多个Sma1i文件,在逆向分析过程中,可以在AndroidManifest.xm1的app1ication节点中找到程序入口,如图2所示。
图2 在AndroidManifest.xm1中找程序入口
如图2所示,9555.apk的程序入口是A.sma1i。系统地分析sma1i代码,应从程序入口开始,梳理逻辑,定位程序的走向,根据程序走向依次分析项目中的各个文件。
在锁定程序入口文件后,从入口文件开始,以此对每个Sma1i文件进行分析。一个Sma1i文件代码的结构与一个Java C1ass对应,包含了实例变量和方法。与X86汇编代码不同,Sma1i汇编码中只有“寄存器”概念,而没有“内存地址”的概念。实际上,除了真正的物理寄存器,对内存的调用也被Sma1i抽象成了虚拟寄存器的调用。Sma1i代码中的寄存器以字母v开头,后接编号,如v0、v1、v2等。对于Sma1i代码分析人员来说,分析程序中数据的处理和流向,需要注意各个寄存器中数值的类型和变化。
整理每个Sma1i文件的代码,将每个C1ass的类名、父类,以及主要的功能整理成矩形形式,并用虚线箭头标注出调用关系,如图3所示。
图3 程序部分流程图
实验过程中,以一个真实的Android短信木马9555.apk为例,进行了一次完整的Sma1i汇编码逆向分析过程。通过本次实验,总结出Android程序逆向分析基本流程如下:
(1)通过apktoo1或类似的反汇编工具,将apk程序包反汇编成Sma1i文件。
(2)在AndroidManifest.xm1中查看程序入口。
(3)从程序入口开始,依次分析每个 Sma1i文件,梳理程序逻辑。
(4)根据分析结果,绘制流程图,归纳程序功能。
本文所述的实验,在没有源代码的情况下,对一个真实的Android木马程序进行了反汇编和逆向分析,并梳理出程序功能。基于Sma1i代码的Android程序反汇编逆向分析,是分析Android程序功能的有效方法,在恶意代码调查、改进软件功能等领域有重要意义。本文所述的实验,为后续更深入的Android程序逆向分析研究打下基础。在今后的研究中,我们会重点关注在没有源代码的情况下,对Android程序进行动态调试的方法和技巧。