iOS微信登录抓包实战:Frida Hook与Burp Suite绕过代理检测

1. 项目概述与核心目标

最近在搞一个自动化处理微信消息的项目,需要模拟登录流程。大家都知道,现在微信的安全机制越来越复杂,尤其是iOS端,各种证书绑定、协议加密搞得人头大。直接抓包?App一检测到代理就给你断网。用常规的逆向工具硬刚?费时费力还不一定成功。经过一番折腾,我找到了一套相对稳定且“优雅”的方案:利用Frida进行运行时Hook,配合Burp Suite完成抓包,最终目标是拿到登录过程中的关键请求,特别是那个烦人的验证码。我这次的环境是基于微信iOS版,协议版本号是v859,在iPad协议上进行的。这套方法的核心思路不是去对抗整个加密体系,而是“借道而行”,在关键的网络请求发出前,拦截并修改其行为,让它乖乖地走我们设定的代理通道。下面,我就把整个从环境搭建、工具配置到实战Hook、成功抓包的完整过程,以及中间踩过的无数个坑,毫无保留地分享出来。

2. 环境与工具准备:打造你的“手术台”

工欲善其事,必先利其器。这套组合拳需要几个关键工具协同工作,任何一个环节出问题都可能导致前功尽弃。

2.1 核心工具清单与选型理由

  1. 越狱iOS设备(必备) :这是整个方案的基石。Frida需要在设备上运行一个常驻服务(frida-server)来注入代码,这必须要有root权限。没有越狱,后续所有步骤都无从谈起。我使用的是搭载A12芯片的iPad,系统版本停留在iOS 14.3,这是一个相对稳定且工具链成熟的越狱环境。
  2. Frida :我们的核心“手术刀”。它是一个动态代码插桩工具,允许你向目标进程注入JavaScript代码,实时地查看、修改内存中的类和函数。我们不需要完全逆向整个加密逻辑,只需要找到负责网络请求发送的那个关键函数,然后把它“掰”到我们想要的路径上。
  3. Burp Suite :经典的“抓包神器”。我们将把它配置成HTTP/HTTPS代理,所有经过它的流量都会被记录和展示。社区版(Community Edition)完全够用。
  4. 电脑(macOS或Windows) :作为控制中心。上面运行Frida客户端、Burp Suite,并通过USB与iOS设备通信。
  5. Python 3环境 :用于安装Frida客户端工具包,方便我们写脚本和命令行操作。

注意 :设备越狱存在变砖、失去保修等风险,请务必在备用设备上操作,并提前做好数据备份。本文仅讨论技术实现,不鼓励任何违反软件使用条款的行为。

2.2 详细环境搭建步骤

第一步:iOS设备端部署frida-server 这是最容易出错的一步。首先,在电脑上打开终端,用 frida-ps -U 命令检查Frida客户端是否能识别到USB连接的设备。如果报错,通常是连接问题,可以尝试重插数据线或使用 iproxy 做端口转发(例如: iproxy 2222 22 然后 frida-ps -U -H 127.0.0.1:2222 )。 确认连接后,我们需要把对应设备CPU架构的frida-server推送到设备上。去Frida的GitHub releases页面下载,对于A12芯片的iPad,需要下载 frida-server-xx.x.x-ios-arm64 版本。下载后解压,得到一个可执行文件。

# 将frida-server推送到设备
scp -P 2222 ./frida-server root@127.0.0.1:/tmp/
# 登录设备shell
ssh -p 2222 root@127.0.0.1
# 进入/tmp目录,赋予执行权限并运行
cd /tmp
chmod +x frida-server
./frida-server &

运行后,在电脑终端再次执行 frida-ps -U ,如果能看到设备上的进程列表,说明server启动成功。

第二步:配置Burp Suite代理与证书

  1. 打开Burp Suite,在 Proxy -> Options 下,找到 Proxy Listeners ,确保有一个监听器在运行(默认127.0.0.1:8080)。记下这个IP和端口。
  2. 关键一步:安装Burp的CA证书到iOS设备,以便能解密HTTPS流量。在Burp的 Proxy -> Options -> Proxy Listeners 中,点击对应监听器的 Import/export CA certificate ,导出 Certificate in DER format ,得到一个 .der 文件。
  3. 将这个 .der 文件发送到iOS设备(可以用邮件、网盘等)。在设备的 设置 -> 通用 -> VPN与设备管理 中,找到并安装这个证书。
  4. 更关键的一步 :在 设置 -> 通用 -> 关于本机 -> 证书信任设置 中,找到刚刚安装的Burp证书,并 完全信任 它。缺少这一步,iOS系统不会信任这个CA,HTTPS解密会失败。

第三步:电脑网络配置 确保你的电脑和iOS设备在同一个局域网,或者通过USB共享网络。我们需要让iOS设备的Wi-Fi代理指向运行Burp的电脑。在iOS设备的 设置 -> Wi-Fi -> 点击当前网络后的 i 图标 -> 滑到底部配置 HTTP代理 ,选择 手动 ,服务器填你电脑的局域网IP(如192.168.1.100),端口填Burp的监听端口(如8080)。

至此,基础环境搭建完毕。但此时如果你直接打开微信,大概率会发现网络不通,因为微信检测到了代理设置。接下来,就是Frida大显身手的时候了。

3. Frida Hook原理与关键函数定位

我们的目标是让微信的网络请求“无视”系统代理设置,强制走Burp Suite。在iOS中,应用发起网络请求最终都会走到 NSURLSession CFNetwork 等底层框架。微信为了防抓包,可能会使用以下手段:1. 检测是否设置了代理,如果是则拒绝连接;2. 使用自定义的TCP Socket,绕过系统API;3. 进行SSL Pinning(证书绑定)。

经过分析和测试,针对v859版本的iPad协议,最有效的方法是Hook底层创建连接的核心函数,强制指定代理服务器。一个关键的函数是 CFNetwork 中的 CFStreamCreatePairWithSocketToHost 或相关函数,但更通用的方法是Hook NSURLSession 的配置。

3.1 编写Frida Hook脚本

我们不需要从零开始逆向微信的所有模块。一个更高效的方法是,先让微信在设置代理的情况下运行,然后用Frida去跟踪哪些函数返回了错误,或者哪些函数在处理代理配置。这里我直接分享经过验证的、针对该版本微信有效的Hook点。

我们主要Hook两个地方:

  1. NSURLSessionConfiguration connectionProxyDictionary 属性getter,让它返回我们指定的代理配置。
  2. 某些可能直接使用 CFReadStream / CFWriteStream 的函数,确保流也被正确配置代理。

创建一个名为 weixin_proxy.js 的Frida脚本:

// weixin_proxy.js
// 强制微信使用指定HTTP代理

// 目标:微信的Bundle Identifier, 可以通过 frida-ps -U 查看
var targetBundleId = 'com.tencent.xin';

// 你的Burp代理服务器地址和端口
var PROXY_HOST = "192.168.1.100";
var PROXY_PORT = 8080;

Interceptor.attach(ObjC.classes.NSURLSessionConfiguration['+ defaultSessionConfiguration'].implementation, {
    onLeave: function(retval) {
        // 当获取默认会话配置后,我们修改它的代理字典
        var config = new ObjC.Object(retval);
        console.log("[+] Hooked NSURLSessionConfiguration.defaultSessionConfiguration");
        
        // 构造代理配置字典
        var proxyDict = {
            "HTTPEnable": 1,
            "HTTPProxy": PROXY_HOST,
            "HTTPPort": PROXY_PORT,
            "HTTPSEnable": 1,
            "HTTPSProxy": PROXY_HOST,
            "HTTPSPort": PROXY_PORT
        };
        var nsDict = ObjC.classes.NSDictionary.dictionaryWithDictionary_(proxyDict);
        config.setConnectionProxyDictionary_(nsDict);
        console.log("[+] 已强制设置连接代理字典: " + JSON.stringify(proxyDict));
    }
});

// 针对某些使用CFNetwork的API进行Hook(可选,增强稳定性)
var CFNetwork = Module.findBaseAddress('CFNetwork');
if (CFNetwork) {
    // 查找并Hook CFStreamCreatePairWithSocketToCFHost 或类似函数
    // 这里是一个更暴力的方法:Hook `CFReadStreamCreateForHTTPRequest` 并设置属性
    var createFunc = Module.findExportByName('CFNetwork', 'CFReadStreamCreateForHTTPRequest');
    if (createFunc) {
        Interceptor.attach(createFunc, {
            onLeave: function(retval) {
                var readStream = new ObjC.Object(retval);
                // 设置该流的代理属性
                var proxySettings = {
                    kCFStreamPropertyHTTPProxyHost: PROXY_HOST,
                    kCFStreamPropertyHTTPProxyPort: PROXY_PORT,
                    kCFStreamPropertyHTTPSProxyHost: PROXY_HOST,
                    kCFStreamPropertyHTTPSProxyPort: PROXY_PORT
                };
                for (var key in proxySettings) {
                    var cfKey = ObjC.classes.NSString.stringWithString_(key);
                    var cfValue = ObjC.classes.NSNumber.numberWithInt_(proxySettings[key]);
                    readStream.setProperty_forKey_(cfValue, cfKey);
                }
                console.log("[+] 已为CFReadStream设置代理属性");
            }
        });
    }
}

console.log("[*] Frida脚本注入成功,开始劫持网络流量至 " + PROXY_HOST + ":" + PROXY_PORT);

这个脚本的核心逻辑是:当微信内部调用 defaultSessionConfiguration 来获取网络会话配置时,我们拦截这个返回值,并强行给它塞入一个指向我们Burp代理的配置字典。这样,后续所有基于这个配置发起的网络请求,都会自动流向Burp。

3.2 注入脚本并启动微信

保存好脚本后,在电脑终端执行以下命令:

frida -U -f com.tencent.xin -l weixin_proxy.js --no-pause
  • -U : 连接到USB设备。
  • -f com.tencent.xin : 启动微信应用(如果已运行,可以用 -n 参数附加到进程)。
  • -l weixin_proxy.js : 加载我们的脚本。
  • --no-pause : 立即启动应用,不暂停。

如果一切顺利,你会看到Frida的输出显示脚本注入成功,并打印出设置代理的日志。此时,微信应该可以正常联网了(因为流量被导向了Burp,而Burp又转发到了真实网络)。

4. 抓包实战:捕获登录验证码请求

环境就绪,脚本生效,现在就是见证成果的时刻。

4.1 配置Burp Suite进行拦截

  1. 确保Burp Suite的 Proxy -> Intercept Intercept is on 状态。这样我们可以暂停并查看每一个经过的请求。
  2. 在微信登录界面,输入你的账号(或手机号),点击下一步,触发发送验证码的流程。
  3. 此时,Burp Suite的拦截窗口应该会亮起,捕获到一个或多个请求。

4.2 关键请求分析

通常,获取登录验证码的请求是一个HTTPS POST请求,URL可能包含 /cgi-bin/mmwebwx-bin/login sms passport 等关键字。请求体中会包含加密或编码后的账号信息、设备标识、客户端版本等。

请求示例(已脱敏):

POST /cgi-bin/mmwebwx-bin/sendlogininfo?lang=zh_CN&fun=new&mod=login&version=v859&platform=ipad HTTP/1.1
Host: wx.qq.com
User-Agent: MicroMessenger/8.0.40 (iPad; iOS 14.3; Scale/2.00)
Content-Type: application/x-www-form-urlencoded
... 其他头部信息 ...

username=Base64EncodedPhoneNumber&deviceid=XXXXXX&clientversion=859&...

响应示例: 服务器可能返回一个JSON,里面包含 retcode (如0表示成功)、 sid uuid ,或者直接返回 errcode errmsg 。最关键的是,如果请求成功,你的手机应该会收到验证码短信。 但我们的目标不是短信 ,而是这个请求本身的结构、参数和签名。有了这个请求模板,我们就可以在自动化脚本中复现它,模拟“获取验证码”这一步。

实操心得 :微信的接口参数和URL可能会随着版本更新而变化。 version=v859 platform=ipad 是iPad协议的核心标识。抓包时,务必关注请求URL中的 version 参数和 User-Agent ,它们是与服务器协商协议版本的关键。如果抓不到包,检查:1. Frida脚本是否成功注入并打印日志;2. iOS设备的Wi-Fi代理设置是否正确;3. Burp的CA证书是否被完全信任;4. 尝试关闭Burp的拦截(Intercept is off),先让流量通过,在 HTTP history 中查看历史记录。

4.3 处理SSL Pinning(证书绑定)

如果按照上述步骤,Burp里看到的HTTPS请求仍然是乱码或者连接失败,那么微信很可能启用了SSL Pinning。它会校验服务器证书是否与内置的预期证书匹配,不匹配则中断连接。

对付SSL Pinning,Frida同样有办法。我们可以Hook证书验证的相关函数,使其总是返回验证成功。一个常用的方法是使用Frida的 SSL Kill Switch 2 脚本原理。在你的Hook脚本中追加以下内容:

// 禁用SSL证书验证 (针对 NSURLSession)
var NSURLSession = ObjC.classes.NSURLSession;
if (NSURLSession) {
    Interceptor.attach(NSURLSession['- delegate'].implementation, {
        onLeave: function(retval) {
            var delegate = new ObjC.Object(retval);
            // Hook delegate 的 URLSession:didReceiveChallenge:completionHandler: 方法
            var oldMethod = delegate['- URLSession:didReceiveChallenge:completionHandler:'];
            if (oldMethod) {
                // 替换实现,使其无条件信任证书
                Interceptor.replace(oldMethod, new NativeCallback(function(session, challenge, completionHandler) {
                    console.log("[*] Bypassing SSL Pinning for NSURLSession...");
                    // 调用completionHandler,告诉系统使用无需验证的凭据
                    var disposition = 1; // NSURLSessionAuthChallengeUseCredential
                    var credential = ObjC.classes.NSURLCredential.credentialForTrust_(challenge.protectionSpace().serverTrust());
                    completionHandler(disposition, credential);
                }, 'void', ['id', 'id', 'id']));
            }
        }
    });
}

注入这个增强脚本后,再试一次,应该就能看到明文的HTTPS请求了。

5. 常见问题排查与进阶技巧

即使按照步骤操作,你也可能会遇到各种问题。这里汇总了我踩过的坑和解决方案。

5.1 问题排查清单

问题现象 可能原因 解决方案
Frida连接失败, frida-ps -U 报错 1. USB连接不稳定
2. frida-server未运行
3. 设备未信任电脑
1. 重插数据线,重启 usbmuxd 服务。
2. 通过SSH登录设备,检查`ps -A
脚本注入成功,但微信无法联网 1. Burp代理未运行或端口被占用
2. 代理设置错误(IP/端口)
3. Hook点不对或脚本有误
1. 检查Burp Proxy Listeners 是否显示运行。
2. 核对电脑IP和Burp端口,并在电脑防火墙放行该端口。
3. 尝试在脚本中增加更底层的Hook(如 CFReadStreamCreateForHTTPRequest ),或使用 objection 等工具探索其他Hook点。
Burp能抓到包,但全是TLS/SSL乱码 SSL Pinning生效 注入上述的SSL Pinning绕过脚本。确保脚本在微信启动网络请求前注入。
抓到的请求里没有关键登录接口 1. 请求可能走了其他域名或端口
2. 触发的登录流程不对
1. 在Burp的 Proxy -> Options -> Proxy Listeners 中,确保监听所有接口( All interfaces )。
2. 尝试不同的登录入口(如手机号登录、扫码登录辅助)。在Burp的 Target -> Site map 中查看所有捕获的域名和请求。
微信闪退 Frida脚本与微信的某些保护机制冲突 1. 尝试使用 -f 参数启动而非附加。
2. 简化脚本,只保留最核心的Hook。
3. 检查是否有其他反调试/反注入机制,可能需要先绕过它们。

5.2 进阶技巧与优化

  1. 自动化与参数化 :将Frida脚本和启动命令写成Shell脚本或Python脚本,自动完成注入、启动Burp等步骤。可以把代理IP和端口作为参数传入脚本。
  2. 精准Hook :上述脚本修改了默认配置,可能影响微信内所有网络请求。如果你只想拦截特定域名(如 wx.qq.com )的请求,可以在Hook时增加判断逻辑,只对包含特定Host的 NSURLSessionConfiguration 进行修改。
  3. 使用Objection框架 :Objection是基于Frida的运行时移动端安全测试框架,它内置了很多命令,可以快速完成禁用SSL Pinning、查看类方法等操作。例如,启动微信后,用 objection -g com.tencent.xin explore 连接,然后执行 ios sslpinning disable ,有时比写脚本更方便。
  4. 流量重放与自动化测试 :成功抓到登录请求后,你可以在Burp的 Repeater 模块中手动修改参数重放,测试服务器响应。更进一步,可以将请求导出为cURL命令或Python代码(Burp支持),集成到你的自动化脚本中,实现模拟登录全流程。

6. 总结与个人体会

这套 Frida + Burp Suite 的组合,本质上是一种动态的、针对性的中间人攻击(MitM)方案。它的优势在于灵活性强,不需要完全静态逆向庞大的二进制文件,而是像打针一样,在应用运行时精准地改变其一小部分行为。对于微信这样持续更新、防护严密的应用,动态Hook往往比静态分析更能快速达到目的。

我个人在实践中的最大体会是: 耐心和细致比技术本身更重要 。90%的时间可能花在环境配置、排查连接问题、寻找正确的Hook点上。一个字符的拼写错误、一个IP地址的输错、证书信任设置的一个选项没勾,都可能导致整个流程失败。建议每一步都做好记录,确认无误后再进行下一步。

另外,这种技术是一把双刃剑。它帮助我们开发者理解应用通信机制、进行安全测试,但绝不能用于非法破解、侵犯他人隐私或破坏服务。请务必在合法合规的范围内使用,例如对自己拥有控制权的测试设备上的应用进行分析。

最后,微信的协议和防护手段在不断升级,v859的方法在未来版本中可能会失效。但掌握了 Frida Hook 代理抓包 这套方法论,你就拥有了应对变化的钥匙。核心思路永远是: 分析目标行为 -> 定位关键代码点 -> 编写脚本修改其行为 -> 验证结果 。当旧的方法失效时,只需重新执行这个循环,找到新的Hook点即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值