APP攻防
资产收集
抓包问题
没有限制过滤
1、抓不到-工具证书没配置好
2、抓不到-app走的不是http/s,走的其他协议
有限制过滤
3、抓不到-反模拟器调试
4、抓不到-反代理VPN
5、抓不到-反证书检验(单、双向校验)
做移动安全测试时,设置好了代理,但抓不到数据包
反抓包Demo:https://github.com/AndroidAppSec/vuls
反调试Demo:https://github.com/lamster2018/EasyProtector
APP防护手段
1、反模拟器:禁用模拟器进行调试访问
2、反证书检验:SSL证书绑定(单向校验和双向校验)
单项校验-客户端校验服务端的证书。
双向认证-客户端不仅仅要校验服务端的证书,也会在app内放一张证书,同时服务端也会检验客户端里的证书。
特征:正常该正常访问的,但抓包后就无法访问;提示网络错误等
3、反代理VPN:代理检测、VPN检测、发包框架强制不走代理
配置代理后无法访问,数据异常等
连接VPN节点后无法访问,数据异常等
配置代理后正常访问且无任何异常,但无数据包
反抓包绕过手段
反模拟器:(某社交相亲)
1、用真机
2、模拟器模拟真机
3、逆向删反代码重打包
反证书检验:(某游戏营地)
1、单向-XP框架
- 注意:在使用模块时,启动模块后需要重启设备才能生效
2、双向-见后文
3、逆向删反代码重打包
XP框架安装:(操作看85天课程演示)
反代理&VPN:(某社交软件)
1、用APP工具设置代理-Postern
2、用PC工具设置代理-Proxifier
3、逆向删反代码重打包
APP-综合分析-Mobexler&MobSF识别
移动安全框架 (MobSF)
一种自动化的一体化移动应用程序 (Android/iOS/Windows) 渗透测试、恶意软件分析和安全评估框架,能够执行静态和动态分析。MobSF 支持移动应用程序二进制文件(APK、XAPK、IPA 和 APPX)以及压缩源代码,并提供 REST API 以与您的 CI/CD 或 DevSecOps 管道无缝集成。动态分析器可帮助您执行运行时安全评估和交互式仪器测试。
Mobexler
是基于Elementary OS的定制虚拟机,旨在帮助进行Android和iOS应用程序的渗透测试。Mobexler预装了各种开源工具,脚本,黑客必备软件等,这些都是安全测试Android和iOS应用程序所必需的。
APP-某社交-双向证书绕过&Frida&HOOK
测试工具
r0capture
仅限安卓平台,测试安卓7、8、9、10、11可用 ;无视所有证书校验或绑定,不用考虑任何证书的事情;
通杀TCP/IP四层模型中的应用层中的全部协议;通杀协议包括:Http,WebSocket,Ftp,Xmpp,Imap,Smtp,Protobuf等、及它们的SSL版本;
通杀所有应用层框架,包括HttpUrlConnection、Okhttp1/3/4、Retrofit/Volley等等;无视加固,不管是整体壳还是二代壳或VMP,不考虑加固事情。
Firda
一款易用的跨平Hook工具, Java层到Native层的Hook无所不能,是一种 动态 的插桩工具,可以插入代码到原生App的内存空间中,动态的去监视和修改行为,原生平台包括Win、Mac、Linux、Android、iOS全平台。
测试环境
Python3 夜神模拟器 r0capture frida-server Burpsuite wireshark
https://github.com/frida/frida/releases
1、本地安装Frida
pip install frida
pip install frida-tools
2、模拟器安装Frida
注意:版本要与本地Frida一致
下载:https://github.com/frida/frida/releases
真机:ARM版本及位数
模拟器:无ARM的位数
# 获取虚拟机的硬件版本 x64/x86
getprop ro.product.cpu.abi
# 在模拟器安装目录下打开shell,连接夜神模拟器终端
nox_adb.exe devices
nox_adb.exe shell
# 移动下载的 frida 文件
nox_adb.exe push frida-server /data/local
# 进入文件存放目录
cd /data/local/tmp/
# 更改权限
chmod 777 frida-server
# 执行文件
./frida-server
# 查看进程中是否存在 frida
ps | grep frida
3、转发并启动Frida(方案一)
adb.exe forward tcp:27042 tcp:27042
本地连接判断:
frida-ps -U frida-ps -R
测试方案
方案1:Firda+r0capture+WireShark
模拟器执行:
./frida-server
本地执行:
python r0capture.py -U -f APP包名 -p xxxx.pcap
获取包名:ls /data/data 或 Apk资源器查看
方案2:Firda+HOOK-JS+BurpSuite
模拟器执行:
./frida-server
本地执行:
frida -U -f APP包名 -l hookjs文件
方案3:导入证书
利用场景:能反编译,有证书文件
1、解压获取apk的证书文件,在assets、res文件夹中找证书文件,一般导入时要求验证密码的才是对的
2、反编译后得到证书文件的密钥
3、Burp导入证书后实现对应抓包
IOS端-双向认证-SSL Kill switch 2
教程地址:https://testerhome.com/topics/17249
GitHub:https://github.com/nabla-c0d3/ssl-kill-switch2/releases
APP-某游戏-单向证书绕过&XP框架&Frida
方案1:Xposed+SSL模块+BurpSuite
逍遥模拟器安装xp见前文
夜神模拟器安装xp直接市场下载后激活即可
方案2:Firda+HOOK-JS+BurpSuite
模拟器执行:
./frida-server
本地执行:
frida -U -f 包名 -l hookjs文件
安卓逆向
常见安卓逆向工具及环境
1、设备环境:安卓模拟器(最好root的真机)
2、HOOK环境(安装指导):Magisk&XP&LSP框架
3、反编译&Java代码查看器:Jadx-Gui
4、查壳工具:ApkScan-PKID
5、文件管理:MT管理器&NP管理器
6、APP内信息获取:开发助手&开发者助手
7、HOOK模块:算法助手&XP&LSP框架模块
8、语法查询:Smail语法查询
9、脱壳相关:https://mp.weixin.qq.com/s/poQPuvaQPadQxRu_WGvy1A
APK逆向基本流程
图解
注意事项
1、常规的用mt管理器就可以直接逆向apk,提取app的安装包,对安装包进行操作即可,或者使用 ApkScan-PKID 进行逆向
2、如果app内的文本等内容无法复制,那么可以使用 开发者助手 对相应文本进行提取,真机有些有文本识别功能可以直接识别提取
APK逆向-数据修改-结构&格式
1、目录结构
apk 全称 Android Package,它相当于一个压缩文件,只要在电脑上将apk后缀改为zip即可解压。
| 文件 | 注释 |
|---|---|
| assets目录 | 存放APK的静态资源文件,比如视频、音频、图片等 |
| lib目录 | armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是C或C++编译的动态链接库文件 |
| META-INF目录 | 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否已被修改) |
| res目录 | res目录存放资源文件,包括图片、字符串等等,APK的脸蛋由他的layout文件设计 |
| AndroidManifest.xml文件 | APK的应用清单信息,它描述了应用的名字、版本、权限、引用的库文件等信息 |
| classes.dex文件 | classes.dex是Java源码编译后生成的Java字节码文件,APK运行的主要逻辑 |
| resources.arsc文件 | resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源 |
2、数据格式
注:虽然smail语法可以转为java,但java代码不能修改
APK逆向-逻辑修改-Smail语法
1、判断逻辑
直接修改判断语句
2、存储器值
APK逆向-视图修改-Activity&Xml
0、视图
| 组件 | 描述 |
|---|---|
| Activity(活动) | 在应用中的一个Activity可以用来表示一个界面,意思可以理解为“活动”,即一个活动开始,代表Activity启动,活动结束,代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运行和启动,Activity的生命周期交给系统统一管理。 |
| Service(服务) | Service可以在后台运行长时间操作而没有用户界面的应用组件,不依赖任何用户界面,例如后台播放音乐,后台下载文件等。 |
| Broadcast Receiver(广播接收器) | 一个用于接收广播信息,并做出相应处理的组件。例如我们常见的系统广播:通知时区改变、电量低、用户改变了语言选项等。 |
| Content Provider(内容提供者) | 作为应用程序之间唯一的共享数据途径,Content Provider主要的功能就是存储并检索数据以及向其他应用程序提供访问数据的接口。Android内置的许多数据都是使用Content Provider形式,供开发者调用的(如视频、音频、图片、通讯录等)。 |
1、时间机制
时间倒数
2、引用更改
更改引用的目标地址
3、HOOK模块
算法助手等
注:视图的捕获可以使用管理器软件中自带的activity记录功能进行捕获,而视图相关文件一般是xml文件
Activity的生命周期及回调方法
APK逆向-反编译&动态调试-Jeb&Adb
准备工作
0、模拟器开发者模式
启用开发者模式(快速单击5次关于平板电脑-版本号)<= 系统-高级-进入开发者选项
启用USB调试模式
模拟器设置里面开启root及磁盘共享可写入
1、Jeb环境配置
安装Jdk11,加入环境变量JAVA_HOME(保证启动Jeb工具时使用的是JDK11即可)
安装ADB,加入环境变量Android
保证启动Jeb工具时使用的是ADB即可(Jeb激活)
开始调试
1、APP加入动态调试
在apk文件中的 AndroidManifest.xml 文件中的 application下面写入以下内容
android:debuggable="true"
其他方法:https://www.52pojie.cn/thread-1714727-1-1.html
2、端口转发以及开启adb权限
MuMu模拟器:adb connect 127.0.0.1:7555
夜神模拟器:adb connect 127.0.0.1:62001
雷电模拟器:adb connect 127.0.0.1:5555
逍遥安卓模拟器:adb connect 127.0.0.1:21503
天天模拟器:adb connect 127.0.0.1:6555
海马玩模拟器:adb connect 127.0.0.1:53001
3、debug模式启动APP
注:jeb对APP进行debug时用的安装包必须是和虚拟机里面安装的那个添加了动态调试代码的app一样
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity
adb shell am start -D -n
adb shell am start -D -n 包名/类名
am start -n 表示启动一个activity
am start -D 表示将应用设置为可调试模式
APK逆向-反编译&动态调试-算法分析&会员机制-案例
案例:淘小说用户会员制
1、反编译淘小说家调试分析
2、找到判断逻辑修改返回值
案例:嘟嘟牛登录加解密
1、抓包分析嘟嘟牛登录加密数据
2、反编译嘟嘟牛加调试分析算法
APK逆向-HOOK技术-LSP模块
前置解释
0、Magisk
是当前Android社区用来获取root权限的主流方式开源工具
1、LSP框架
XPosed框架因只支持安卓8及以下,故高版本应使用Magisk+LSPosed
2、HOOK技术
钩子技术,本质就是劫持调用,将自身的代码“融入”被勾住(Hook)的程序的进程中
3、算法助手
LSPosed下的模块,集成常见功能外加自定义HOOK方便逆向调试
安装使用:见前文(第88天内容)
APK逆向-反编译&LSP&HOOK-绕检测
案例1
APP环境检测
private final void K() {
LogUtils.b("niming", "===AppUtils.isAppRoot():" + com.blankj.utilcode.util.c.r() + " DeviceUtils.isDeviceRooted() " + w.q());
if (!A() && !m.a(this.activity)) {
if (a((Context) this)) {
h("检测到您使用了代理软件,不允许继续使用");
return;
}
h.a().a(com.niming.weipa.b.a.n, "");
x();
return;
}
h("检测到您使用的是模拟器或者设备已经root,不允许继续使用");
}
1、跳过验证:goto :end end (无条件跳转到end处)
2、mg+lsp+算法组手 自带屏蔽hook
3、代理检测绕过:postern软件代理
4、通过修改验证函数返回值代码绕过验证
5、通过hook技术,拦截、修改目标函数返回值
APK逆向-反编译&LSP&HOOK-逻辑验证
屏蔽掉 /api/mv/watching 接口调用
逆向app修改代码
让user.getIs_vip 永远返回true
getIsvip - >1 const/4 v0, 0x1
getVip_level ->4 const/4 v0, 4
if (userBean.getIs_vip() == 1) {
String format = String.format("到期時間:%s", c.d.a.f.i.a(userBean.getExpired_str()));
if (userBean.getVip_level() == 4) {
format = "永久無限觀看";
} else {
this.v.setVisibility(0);
HOOK技术对指定类的返回值进行劫持、修改
1、com.blmvl.blvl.bean.UserBean
getIsvip ->1
2、com.blmvl.blvl.bean.UserBean
getVip_level ->4
APK逆向-反编译&LSP&HOOK-加密算法
HOOK:
mg+lsp+算法助手 算法+逆向=找解密
小程序
测试基本思路

小程序抓包-全局代理&进程转发
可能存在的问题
安卓系统 7.0以下版本,不管微信任意版本,都会信任系统提供的证书
安卓系统 7.0 以上版本,微信 7.0 以下版本,微信会信任系统提供的证书
安卓系统 7.0 以上版本,微信 7.0 以上版本,微信只信任它自己配置的证书列表
相应的解决办法如下
将证书安装到系统证书中(需root)
苹果手机(苹果手机不受此影响)
采用安卓系统低于7.0的模拟器
代理方法
1、全局代理-BurpSuite&科来等
2、进程转发-Proxifier+BurpSuite
小程序逆向-反编译&主包&分包&调试
反编译工具项目
1、wxpUnpacker
https://github.com/sanriqing/WxAppUnpacker
2、小锦哥小工具
https://www.xjgxcx.xiejijin.com/
3、分包-unveilr
https://github.com/r3x5ur/unveilr
4、小程序开发者工具
https://q.qq.com/wiki/tools/devtool/
反编译步骤
主包小程序:小程序只有一个 .wxpakg 文件
方案一:
1、先用 小程序包解密 工具将目标小程序的 .wxapkg 文件进行解密
2、将解密生成的文件放到 wxpUnpacker 工具目录下
3、在当前目录shell执行 node .\wuWxapkg.js .\刚才移动的文件 生成逆向结果
方案二:
使用 小锦哥小工具 逐步进行:解密,反编译,即可生成结果
方案三:
使用 unveilr 工具shell直接执行 unveilr.exe "目标小程序所在目录",即可生成结果
分包小程序:小程序有多个 .wxapkg 文件
使用 unveilr 可以对小程序整个文件夹进行分析、逆向

浙公网安备 33010602011771号