引言
反编译技术是通过对低级语言代码(字节码或者汇编代码等)进行分析转化,得到等价的高级语言(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代码形式。其处理界面为: