安卓逆向4
- 本人太蠢,刚做题以为flutter模块是用于app与手机屏幕的交互。
- 结果flutter模块是用于app与服务器交互,搞了半天原来要抓包,于是前来学习安卓逆向抓包
- 工具
- 教程Demo(更新)
- Reqable
抓包
概念
-
包:在计算机网络中,“包”通常指的是在网络上传输的数据单元,也被称为数据包。在互联网协议(IP)的语境下,数据包是由报头(Header)和载荷(Payload)组成,其中报头包含了源地址、目的地址、长度等信息,而载荷则是实际要传输的数据。
-
抓包:抓包具体指的是通过某些工具获取安卓App与服务器之间传输的网络数据,这些数据通常用于逆向分析、协议接口分析或App渗透测试,帮助安全工程师理解App与服务器之间的通信细节,如请求和响应的具体内容,从而进行安全评估或逆向工程
-
抓包一般用于:
- 帮助定位加密或混淆的代码中的关键部分
- 逆向接口(比如:一些第三方影视app的解析接口、分析是否为服务器校验)
- 篡改数据包实现免重打包破解和屏蔽广告
- 协议分析和爬虫需求
前置知识
- 这一部分都是计算机网络的知识,涉及到web、http协议
抓包工具
- 常见的工具:
- Charles:代理抓包工具网络抓包工具Charles 4.5.6 中文版(Windows便携免安装) - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
- Fiddler:代理抓包工具阿里云盘分享 (alipan.com)
- Burp Suit:代理抓包工具,安卓抓包不常用BurpSuite v2024.8.1汉化无cmd框版(2024.09.15更新) - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
- Reqable:代理抓包工具客户端下载 | Reqable
- ProxyPin:VPN抓包工具版本 V1.1.0 ·wanghongenpin/network_proxy_flutter (github.com)
- WireShark:网卡抓包工具Wireshark · Download
- R0Capture:Hook抓包工具r0ysue/r0capture: 安卓应用层抓包通杀脚本 (github.com)
- tcpdump:内核抓包工具the-tcpdump-group/tcpdump: the TCPdump network dissector (github.com)
- eCapture(旁观者):内核抓包工具Releases · gojue/ecapture (github.com)
- ptcpdump:内核抓包工具mozillazg/ptcpdump: Process-aware, eBPF-based tcpdump (github.com)
- 这里主要是下载Reqable,Reqable好用,先去到官网这边下载客户端下载 | Reqable,下载好后拖入雷电模拟器中
- 然后下滑同意协议,选择该模式
-
接下来安装证书
-
Reqable使用经典的中间人(MITM)技术分析HTTPS流量,当客户端与Reqable的代理服务器(下面称为中间人)进行通信时,中间人需要重签远程服务器的SSL证书。为了保证客户端与中间人成功进行SSL握手通信,需要将中间人的根证书(下文检查CA根证书)安装到客户端本地的证书管理中心
-
进行如下点击
- 这里可以选用其他方式安装证书
- 好了之后证书已经安装好了
抓包
- 如果直接抓包的话所以应用程序的包都会被抓到,这时候就需要过滤一下,才可以方便我们对包进行分析
- 然后点击加号
- 添加教程Demo
- 回到主界面,当右下角出现这个的时候就表明已经开始在抓包了
- 然后点击Demo的APP,找到第9关,点击进去就会有包发过来,我们就会收到包了
- 抓到的包如下
- 点击关闭包
- 抓包的详细过程如下
- 还有证书支持的加密算法
- 还会显示服务器的证书
- 接下来查看原始报文
- 接下来查看响应体的原始报文
- 还有一些响应内容
Flutter逆向
-
终于到了今天的正题,Flutter逆向了,牢半天还没学知识点
-
工具:
- 某读app
- proxypin:抓包工具
- blutter:Flutter快照的解析逆向
Flutter简介
-
Flutter是Google构建在开源的Dart VM之上,使用Dart语言开发的移动应用开发框架,可以帮助开发者使用一套Dart代码就能快速在移动IOS、Android上构建高质量的原生用户界面,同时还支持开发web和桌面应用
-
Flutter引擎是一个用于高质量跨平台应用的可移植运行时,由
c/c++
编写。它实现了Flutter
的核心库,包括动画和图形、文件和网络I/O、辅助功能支持、插件架构,以及用于开发、编译和运行Flutter
应用程序的Dart
运行时和工具链。引擎将底层c++
代码包装成Dart
代码,通过dart:ui
暴露给Flutter
框架层 -
Flutter的相关网站
Flutter特征
- 在逆向分析前,我们首先要确定测试目标是否用Flutter开发的。当使用Flutter构建Android APP时,在assets文件夹下会有dexopt和Flutter_assets两个文件夹。(这里以ByteCTF给的题目附件为例子)
- 在lib文件夹会有俩个so文件:libapp.so和libFlutter.so(flutter动态链接库,与实际业务代码无关),如果我们要修改代码一般都是需要去修改
libapp.so
Flutter抓包对抗
-
Flutter难抓包、难反编译,将介绍三种方法来绕过Flutter抓包对抗
-
先讲难抓包的问题
- Dart语言标准库的网络请求不走
Wi-Fi
代理:Flutter使用的是Dart语言,其标准库中的网络请求不会通过代理发送,这与许多其他应用不同。常规的抓包工具通常依赖于代理来捕获网络流量,因此无法捕获Flutter应用的网络请求 - Dart SDK中的证书信任:Dart SDK在Android平台上强制只信任系统目录下的证书。这意味着Flutter应用不会信任用户安装的证书,除非这些证书位于
Android
系统的/system/etc/security/cacerts
目录中。这是通过Dart源码中的runtime/bin/security_context_linux.cc
文件实现的。
- Dart语言标准库的网络请求不走
-
这里就使用某读app来做示范,这里我使用
Reqable
进行抓包,从图中可以看到,使用该应用是可以抓到某读app的包。这是因为之前我们将证书添加到了系统目录下的证书目录中
hook_ssl_client
- 在
libFlutter.so
文件里面搜索ssl_client
定位到方法,先将libFlutter.so
文件拖入IDA里面,可以看到里面的符号表全部给去除了
- 现在先打开字符串,搜索
ssl_client
,在内存中搜刮函数前10字节定位,在运行时将返回函数改为true即可绕过证书链检查,实现抓包(以64为的so为例子,这里用的是ByteCTF的附件)
- 选中后并点击,就会跳转到相应字符串中,然后还会出现引用该字符串的函数
- 点击引用该字符串的函数就会跳转到对应函数中去
- 然后内存搜刮函数前10字节定位
patch
- 使用reFlutter这个开源项目,将so文件给patch掉
Reqable&proxyPin(推荐)
- proxyPin这个工具比较强大,可以直接绕过Flutter的证书校验
Flutter反编译
-
快照:指Flutter应用在编译过程中生成的特定数据结构,用于加速应用的启动和运行。具体来说快照包括四个类型:
_kDartVmSnapshotData
:代表isolate直接共享的Dart堆的初始状态_kDartVmSnapshotInstructions
:包含VM中所有Dart isolate之间共享的通用例程AOT指令。这种快照的体积通常非常小,并且大多会包含程序桩(stub)_kDartIsolateSnapshotData
:代表Dart堆的初始状态,并包含isolate专属的信息_kDartIsolateSnapshotInstructions
:包含由Dart isolate执行的AOT代码
其中
_kDartIsolateSnapshotInstructions
是最为重要的,因为包含了所有需要执行的AOT代码,即业务相关的代码 -
使用
readelf -s
命令读取保存快照信息的libapp.so
将为输出下面的内容 -
这边
Flutter
的逆向方法有两种方式
1 |
|
静态分析
-
使用工具
blutter
:worawit/blutter: Flutter Mobile Application Reverse Engineering Tool (github.com) -
解析
libapp.so
,即写一个解析器,将libapp.so中的快照数据按照其既定格式进行解析,获取业务代码的类的各种信息,包括类的名称、其中方法的偏移等数据,从而辅助逆向工作 -
先安装blutter所需要的环境
- Python3.10环境
- 安装git,版本稍微高一点
- 下载vs
-
clone项目:
1 | git clone https://github.com/worawit/blutter --depth=1 |
- 进入到blutter文件夹,cmd窗口运行初始化脚本
1 | python .\scripts\init_env_win.py |
- 打开
x64 Native Tools Command Prompt
,它可以在Visual Studio
文件夹中找到
- 再切换到
blutter
的路径下,把需要反编译的flutterapp
用压缩包打开,提取v8a里的``
动态编译
-
使用工具
reFlutter
:Impact-I/reFlutter: Flutter Reverse Engineering Framework (github.com) -
编译修改过的
libflutter.so
并且重新打包到APK中,在启动APP的过程中,由修改过的引擎动态链接库将快照数据获取并且保存。
注意:不同版本的Dart引擎快照格式不同,所以静态的方法就需要频繁跟着版本更新迭代,成本极高,而动态也需要重新编译堆应版本的链接库。同时如果APP作者抹除版本信息和hash信息,则无从下手,且重新打包APK极易被检测到