app不走系统代理?如何抓包?

安卓模拟器抓包问题及解决方案
博客主要讲述安卓模拟器开启WLAN代理后抓不到包,但app仍正常返回数据的现象。其原理是网络请求代理设置NO_PROXY,app可自定义代理。给出三种解决方案,一是用proxifier转发请求到抓包软件;二是用本地VPN抓包软件;三是使代理设置语句无效。

现象

模拟器开启WLAN代理如下:

发现抓不到包:

但是app却依旧正常返回数据,没有断网:

原理

网络请求代理设置NO_PROXY

  • android系统设置的代理并不是强制对所有app生效的
  • app可以在网络请求类库中通过自定义代理设置,选择是否要走系统代理
 public void run() {
        Looper.prepare();
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                proxy(Proxy.NO_PROXY).//okhttp不设置代理
                build();
        Request request = new Request.Builder()
                .url("http://www.baidu.com")
                .build();
        Response response = null;
        try {
            response = okHttpClient.newCall(request).execute();
            Toast.makeText(this, Objects.requireNonNull(response.body()).string(), Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Looper.loop();
    }

解决方案

既然不走系统代理,那么直接抓系统的包不就可以了吗

被抓包的APP并不知道自己被套在了第几层

方案一

使用proxifier 将模拟器请求直接转发到抓包软件,相当于抓安卓系统的包:

抓包结果:正常抓包

方案二

同理,使用本地VPN抓包软件,如抓包精灵

方案三

justtrustme或者直接okhttp代理方法,使代理设置语句无效

 

总结

一层一层又一层,总有套路得人心!

 

 

<think> 我们正在讨论APP的HTTPS抓包解密方法。根据引用内容,我们可以总结出以下几个关键点: 1. 客户端证书绑定(SSL Pinning)使得抓包工具无法直接解密HTTPS流量(引用[1])。 2. 由于HTTPS的会话密钥是临协商的,中间人攻击(MITM)无法直接获取对称密钥(引用[2])。 3. 需要借助一些工具和技术来绕过这些限制,例如: - 使用JustTrustMe等工具绕过SSL Pinning(引用[1])。 - 使用mitmproxy进行二次开发以支持多种解密方式(引用[3])。 - 使用Frida进行Hook,修改APP的加密函数,实现解密(引用[4])。 因此,我们可以将APP的HTTPS抓包解密方法归纳为以下步骤: ### 一、准备工作 1. **配置抓包环境**: - 安装抓包工具(如Charles、Fiddler、mitmproxy)并配置HTTP/HTTPS代理。 - 在手机上安装抓包工具的CA证书,并信任该证书(注意:Android 7.0以上需要将证书安装到系统信任区,否则可能被信任)。 2. **解决SSL Pinning**: - 使用工具如JustTrustMe(Xposed模块)或Frida脚本绕过SSL Pinning。这些工具可以阻止APP验证服务器的证书,从而使抓包工具能够拦截HTTPS流量。 - 对于未Root的设备,可以考虑使用虚拟环境(如VirtualXposed)或重新打包APP(去除证书验证)。 ### 二、解密HTTPS流量 根据引用[2]和[3],我们可以知道,仅仅配置代理和CA证书可能足以解密HTTPS流量,因为: - HTTPS的对称密钥是每次会话临协商的,且被服务器的公钥加密,因此无法直接从网络流量中获取。 - 抓包工具(如Charles、mitmproxy)实际上是通过中间人攻击(MITM)的方式,即模拟服务器与客户端通信,同模拟客户端与服务器通信,从而能够解密流量。但这就要求客户端信任抓包工具的CA证书(即第一步中安装的证书)。 然而,如果APP使用了自定义的证书验证(SSL Pinning),则上述方法失效,需要先绕过SSL Pinning(如第一步所述)。 ### 三、处理自定义加密 有些APP在HTTPS的基础上还额外对请求和响应体进行了加密(如AES、RSA等)。此,即使HTTPS被解密,我们看到的仍然是加密后的内容。针对这种情况,我们可以: - 使用Frida等工具Hook加密/解密函数,获取明文(引用[4])。 - 反编译APP使用Jadx、JEB等工具)分析加密算法,然后模拟加密过程构造请求。 ### 四、具体步骤 下面以使用mitmproxy和Frida为例,给出详细步骤: #### 步骤1:配置mitmproxy 1. 安装mitmproxy:`pip install mitmproxy` 2. 启动mitmproxy:`mitmproxy` 3. 配置手机代理,指向运行mitmproxy的电脑的IP和端口(默认为8080)。 4. 在手机浏览器访问`mitm.it`,下载并安装CA证书。 #### 步骤2:绕过SSL Pinning 使用Frida脚本绕过SSL Pinning: 1. 在电脑上安装Frida:`pip install frida-tools` 2. 下载一个通用的SSL Pinning绕过脚本,如`frida-multiple-unpinning`(https://github.com/m0bilesecurity/frida-multiple-unpinning)。 3. 将脚本保存为`unpinning.js`,然后运行: ```bash frida -U -f com.example.app -l unpinning.js ``` 其中`com.example.app`为目标APP的包名。 #### 步骤3:使用mitmproxy捕获流量 此,mitmproxy应该能够捕获到APP的HTTPS流量,并显示明文。如果APP有自定义加密,则捕获到的请求/响应体可能是加密的。 #### 步骤4:处理自定义加密(如果需要) 1. 使用Frida Hook加密/解密函数,将输入输出打印出来(如引用[4]所示)。 2. 修改Frida脚本,将加密前的请求体或解密后的响应体打印出来,或者直接修改请求/响应。 ```javascript Java.perform(function() { var DecryptUtils = Java.use("com.example.utils.DecryptUtils"); DecryptUtils.decrypt.implementation = function(encrypted) { console.log("Encrypted data: " + encrypted); var result = this.decrypt(encrypted); console.log("Decrypted data: " + result); return result; }; }); ``` 运行该脚本后,Frida会输出解密后的数据。 ### 五、注意事项 - **法律合规性**:抓包仅用于合法目的,如安全测试或调试,得用于非法用途。 - **复杂加密**:有些APP可能使用白盒加密或强混淆,使得逆向难度极大,此需要更深入的分析。 ### 六、相关问题 §§相关问题§§ 1. 如何绕过APP的SSL Pinning? 2. 如何使用Frida对APP进行Hook? 3. 如何处理APP自定义的加密请求? </think> ### APP的HTTPS抓包解密方法详解 APP的HTTPS抓包解密需要突破**双向加密验证**和**动态密钥机制**,以下是完整操作流程: --- ### 一、核心原理 HTTPS抓包本质是**中间人攻击(MITM)**,需解决两个关键问题: 1. **证书绑定(SSL Pinning)** APP内置服务器证书指纹验证,拒绝第三方证书[^1] 2. **动态密钥协商** 每次会话生成临对称密钥,无法直接获取传输层密钥[^2] --- ### 二、操作步骤 #### ▶ 阶段1:基础抓包环境搭建 ```mermaid graph TD A[安装抓包工具] --> B[Charles/mitmproxy] B --> C[配置代理端口] C --> D[手机安装CA证书] D --> E[配置手机网络代理] ``` 1. **工具选择**: - Charles/Fiddler:图形化操作友好 - mitmproxy:支持Python二次开发[^3] - Wireshark:底层协议分析 2. **证书安装**: - Android 7+需将CA证书放入系统证书目录: ```bash adb push charles.pem /system/etc/security/cacerts ``` - iOS需通过描述文件信任证书 #### ▶ 阶段2:突破证书绑定(SSL Pinning) | 方法 | 适用场景 | 工具 | |---------------------|--------------------------|--------------------------| | Frida动态Hook | 主流APP | Objection + Frida脚本[^4] | | Xposed框架模块 | Root设备 | JustTrustMe[^1] | | 逆向修改APK | 无Root设备 | Apktool + Jadx | **Frida脚本示例**(绕过证书验证): ```javascript Java.perform(() => { const X509TrustManager = Java.use('javax.net.ssl.X509TrustManager'); X509TrustManager.checkServerTrusted.implementation = function() { console.log("[+] Bypassing SSL verification"); }; }); ``` 执行:`frida -U -f com.target.app -l ssl_bypass.js` #### ▶ 阶段3:处理自定义加密 当APP在HTTPS基础上叠加加密: 1. **定位加密函数**: ```bash jadx -d output target.apk # 反编译APK grep -r "encryptData" output/ # 搜索加密方法 ``` 2. **Hook解密过程**(Frida示例): ```javascript Java.perform(() => { const CryptoUtil = Java.use('com.app.util.Crypto'); CryptoUtil.decrypt.implementation = function(data) { console.log(`原始密文: ${data}`); const plain = this.decrypt(data); console.log(`解密结果: ${plain}`); return plain; }); }); ``` #### ▶ 阶段4:流量解析(mitmproxy示例) ```python from mitmproxy import http def response(flow: http.HTTPFlow): if "api.target.com" in flow.request.url: raw = flow.response.content.decode('utf-8') decrypted = custom_decrypt(raw) # 调用自定义解密 print(f"解密响应: {decrypted}") # 启动:mitmproxy -s decrypt_script.py ``` --- ### 三、常见问题解决方案 | 问题现象 | 解决方案 | |---------------------------|-----------------------------------| | 抓包工具显示`TLS handshake failed` | 检查SSL Pinning是否绕过成功 | | 看到乱码数据 | Hook应用层加解密函数 | | 频繁断连 | 关闭APP的证书吊销检查(OCSP Stapling) | | 抓包APP闪退 | 检测反调试机制,使用Frida Anti Anti-debug | --- ### 四、进阶技巧 1. **自动化解密**: - 使用mitmproxy的[addon API](https://docs.mitmproxy.org/stable/addons-api/)实现实解密 - 结合FRIDA实现动态密钥提取 2. **协议逆向**: - 对Protobuf/Thrift等二进制协议:使用`protoc --decode_raw`解析 - 对自定义压缩:Hook`GzipInputStream`等Java类 --- ### 五、注意事项 1. **法律边界**: - 仅用于安全测试或授权分析 - 避免抓取用户隐私数据 2. **技术限制**: - HTTPS双向认证(客户端证书)需额外处理 - 强混淆APP(如银行类)可能需要动态调试 > 提示:优先选择官方开放API,抓包应是最后手段[^1][^2]
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值