引言
反编译技术是通过对低级语言代码(字节码或者汇编代码等)进行分析转化,得到等价的高级语言(C或者Java等)代码的过程。它涉及指令系统,可执行文件格式,反汇编技术,数据类型分析技术,控制流分析技术和高级代码生成技术等。反编译处理过程一般可以分为7个阶段:文件转载,指令解码,语义映射,相关图构造,过程分析,类型分析和结果输出等。
软件可靠性测试是为了达到或验证用户对软件的可靠性要求而对软件进行的测试,通过测试发现并纠正软件中的缺陷,提高其可靠性水平,并验证它是否达到了用户的可靠性要求。
本文设计并实现了针对适用于android系统的apk应用程序的反编译工具。通过对一个apk应用程序的逆向分析,描述了反编译技术在软件测试中的作用。
实验过程
本实验通过对“com.example.android.BluetoothChat.BluetoothChat.apk”,的分析描述了反编译在软件测试中的作用。我们看一下测试用例的相关信息。
1,为了分析该apk程序的代码结构,首先,我们要对apk文件进行反汇编获得其对应的汇编代码,该过程通过apktool工具实现:
2,通过该过程处理,我们就得到了apk程序反汇编后的smali代码形式,smali文件保存在com.example.android.BluetoothChat.BluetoothChat文件夹下。Smali代码形式如下
3,在获得smali代码后,我们设计的反编译器就针对smali文件进行处理以得到对应的java代码形式。该软件对指定目录下的所有文件和文件夹进行遍历,如果遇到smali文件就对其进行反编译处理,如果是其他类型文件就直接将其复制到目标文件夹,如果遇到的是文件夹就递归进行遍历直到指定目录下的所有文件被遍历。如果遇到的是smali文件,首先,对文件中的指令进行装载,即将文件中的每一条指令进行读取分析并保存到设计好的数据结构中,构成指令序列;其次,对指令序列进行分析确定数据域和代码域,将数据域的数据提取出来并对代码域进行分析,查找出类的函数信息。再次,对类的每一个函数进行处理:包括基本快划分,控制流图构造,控制流分析,控制树生成,参数类型确定和高级代码生成等。最后对类的信息进行处理并输出。这样就得到了smali文件对应的java代码形式。其处理界面为:
4,经过处理,得到的java代码形式如下:
相关技术介绍
控制流分析技术
为了从汇编语言中获得if-then。If-then-else,while等高级语言的控制结构,必须对汇编代码进行控制流分析。控制流分析过程可以划分为三个阶段:a,对函数的汇编级指令序列进行基本快划分,构造出函数的控制流图;b,对控制流图进行控制流分析;c,对控制流分析的结果进行处理获得函数的控制树。本项目采用经典的控制流分析方法----结构分析方法。该算法为:
通过该算法的处理结果,我们可以获得函数的控制树:
高级代码生成技术
对于产生的控制树,从根节点开始递归的进行代码生成,如果是分支节点,就生成该节点对应的高级语言控制结构形式,如果是叶子节点,就生成对应基本快的内容。其中,如何将多条汇编指令合并为一条高级语言指令是难点。
参数类型确定技术
Smali指令本身包含了丰富的类型信息,但是,如果单纯依靠分析指令确定参数类型是不合适的。因为,有些指令的参数类型是由程序上下文确定的。为了正确获得参数的类型信息,我们设计了算法对每个参数进行分析。该算法首先对每一条汇编指令进行处理,如果该指令的参数类型可以通过指令本身确定,那么就直接初始化。否则沿着程序执行的路径逆向搜索该参数,如果在某条指令中该参数类型已确定,则将其类型也定为该类型。
结论
通过对apk文件的反汇编处理,我们可以得到它们对应的smali汇编代码,通过反编译技术,我们可以获得其对应的java代码形式。这样,程序测试人员可以更加方便的对apk应用程序进行分析和测试。测试结果表明,反编译技术可以极大地提高程序的可读性和结构化程度,更加方便人们对低级代码的分析和处理。