首页
社区
课程
招聘
1
[原创] Android安全测试流程以及一些简单过滤 part1
发表于: 2020-4-29 12:14 6718

[原创] Android安全测试流程以及一些简单过滤 part1

2020-4-29 12:14
6718

0x00 反编译测试

测试目的

测试目标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使用方法:

  1. 在apk所在文件夹打开cmd或者powershell ,然后在空白处按住shift然后鼠标右键,选择在此处打开powershell/cmd
    图片描述

或者在地址栏直接输入cmd或者powershell,然后回车运行,即可在当前目录打开powershell/cmd
图片描述

 

如下所示:
图片描述

  1. 在当前目录执行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直播授课

收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-1-16 05:12
最新回复 (3)
雪    币: 2708
活跃值: (1702)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
期待了
2020-4-29 13:12
0
雪    币: 2097
活跃值: (1727)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
flowDroid这个开源的自动化测试工具好用不啊?
2020-4-29 14:26
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
期待
2020-5-8 20:37
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册