测试目的
测试目标apk是否能被反编译 目前绝大多数的Android软件都是由java编写,由于java的本质属于解释型语言(即java编译之后需要依赖JVM虚拟机执行,类似于C#编译之后会生成IL),故java代码编译之后,从理论上来讲是可以还原的。若源代码未混淆,源代码反编译之后就可以看到源代码,对Android应用程序来讲,是极大的隐患。 将apk反编译通常是安全测试的第一步,目前有很多工具可以实现apk的反编译。其中大多数依赖于apktool,所以首先以Apktool为例,介绍一下Apktool的配置和使用
测试方法
windows平台常用工具
windows平台下有许多apk反编译工具,例举几个常用的如下: apktool JEB Android killer ApkToolBox dex2jar ....
Apktool安装以及使用
apktool官方下载地址:https://ibotpeaches.github.io/Apktool/install/ apktool提供了三个平台的下载以及安装教程
apktool使用方法:
在apk所在文件夹打开cmd或者powershell ,然后在空白处按住shift然后鼠标右键,选择在此处打开powershell/cmd
或者在地址栏直接输入cmd或者powershell,然后回车运行,即可在当前目录打开powershell/cmd
如下所示:
在当前目录执行apktool d 包名 对目标apk进行解包(需要先根据apktool官网教程将apktool配置到环境变量)
成功执行后,会在当前目录生成一个和apk同名的文件夹,里面即包含了apk解包后的数据
一个简单的apk,解包后的文件夹结构如下:
其中
反编译是否成功,可以通过查看反编译之后的AndroidManifest.xml 来判断。 AndroidManifest.xml文件中存放了APK的大量配置信息,比如软件的名称、包名、图标、组件配置等。 如果反编译之后的AndroidManifest.xml 以明文显示则说明反编译成功,比如在本例子中该文件如下:
我们可以从Application标签的Activity标签的Android:name字段中知道,该apk在开发的时候,程序入口点在com.example.myapplication.MainActivity。 一般来说,AndroidManifest文件被反编译成功即说明apk未做反编译保护,我们也可以接着对res目录下的资源文件以及smali目录下的smali文件进行查看,如果明文显示则说明反编译成功。如下所示
使用ApktoolBox工具集反编译
由于Apktool依赖于命令行,有些参数和操作不太方便,所以后面有了许多带UI界面的反编译工具,但其实基本上都是依赖于Apktool。以ApktoolBox为例。ApktoolBox界面如图所示,是一个工具集:
通过查看ApktoolBox的路径可以得知,反编译所使用的工具还是Apktool.jar
可以看到,这里的Apktool.jar是17年的,比较老,我们直接替换为刚从官网下载的最新版。(其他工具的替换方式同理,直接下载新版本替换即可)
现在直接用ApktoolBox打开我们想要反编译的apk,然后选择<反编译apk>即可
这里的<是否需要忽略res资源文件>需要选<取消>,如果选择了<确定>则会在反编译的时候不对AndroidManifest以及资源文件进行反编译,没有AndroidManifest,我们将不能直观的了解到程序的入口Activity在哪里。 反编译完成之后,则会在指定目录下释放生成对应的文件夹,和Apktool d 包名 的方式的结果一样。
解决方案
可以针对AndroidManifest做简单的处理,起到入门级的反编译作用。 首先介绍一下AndroidManifest的相关知识。Android studio在编译APK的时候会把AndroidManifest.xml处理为一个二进制文件。我们必须对APK反编译之后,才能看到原本的AndroidManifest.xml内容,否则只能看到一个全是乱码的文件,这种文件格式称为"AXML" 根据之前大佬们发现的AXML解析漏洞,我们可以直接尝试修改AXML文件,使得反编译工具无法正常识别该文件,从而起到防反编译的作用。 我们通过ApktoolBox打开目标apk,然后选择<反编译apk>,在反编译的时候会弹出选项<是否需要忽略res资源文件> 选择<确定>,忽略了资源文件之后,将只会反编译smali文件,不会反编译AndroidManifest以及res目录下的各种资源文件。
然后打开AndroidManifest,此时的AndroidManifest是一个AXML文件格式的二进制数据流。
根据AndroidManifest的解析漏洞,我们可以使用一个简单的方法起到反编译的作用,即更改编译之后的AndroidManifest文件头,然后直接重新打包,签名。这样可以在一定程度上防止程序被直接反编译。 所以我们把的AndroidManifest的文件头 03 00 08 00 更改为00 00 08 00 然后将后面的数据跟改一下再保存。
再重新打开该文件,可以看到010edit已经没有正常识别该文件为AndroidManifest
此时我们直接使用ApktoolBox打开我们修改过后的文件夹,选择<回编译apk>。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课