如何在iOS设备上使用Fiddler进行抓包

1. 流程

下面是在iOS设备上使用Fiddler进行抓包的整个流程:

步骤 描述
步骤 1 配置网络代理
步骤 2 安装Fiddler根证书
步骤 3 配置Fiddler

2. 步骤说明

步骤 1:配置网络代理

在iOS设备上配置网络代理,以将网络流量导向Fiddler进行抓包。

代码示例(Objective-C):

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.connectionProxyDictionary = @{(NSString *)kCFNetworkProxiesHTTPEnable: @YES,
                                            (NSString *)kCFNetworkProxiesHTTPProxy: @"127.0.0.1",
                                            (NSString *)kCFNetworkProxiesHTTPPort: @8888};
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];

代码说明:

  • NSURLSessionConfiguration用于配置NSURLSession的行为。
  • connectionProxyDictionary是一个NSDictionary,用于指定代理服务器的配置。
  • kCFNetworkProxiesHTTPEnable设置为@YES表示启用HTTP代理。
  • kCFNetworkProxiesHTTPProxy设置为Fiddler的IP地址(通常是"127.0.0.1")。
  • kCFNetworkProxiesHTTPPort设置为Fiddler监听的端口号(通常是"8888")。

步骤 2:安装Fiddler根证书

为了让Fiddler能够解密HTTPS流量,需要在iOS设备上安装Fiddler根证书。

代码示例(Objective-C):

NSString *certPath = [[NSBundle mainBundle] pathForResource:@"FiddlerRoot" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:certPath];
CFDataRef certDataRef = (__bridge_retained CFDataRef)certData;
SecCertificateRef certificate = SecCertificateCreateWithData(NULL, certDataRef);
CFRelease(certDataRef);
CFArrayRef certificates = CFArrayCreate(NULL, (const void **)&certificate, 1, NULL);
CFRelease(certificate);
NSDictionary *options = @{(__bridge id)kSecImportExportPassphrase: @"password"};
SecPKCS12Import(certificates, (__bridge CFDictionaryRef)options, &items);

代码说明:

  • certPath是Fiddler根证书的路径。
  • certData是从证书文件读取的数据。
  • certificate是使用certData创建的证书对象。
  • certificates是一个包含证书对象的CFArrayRef
  • options是一个包含密码信息的NSDictionary,用于导入证书。
  • SecPKCS12Import函数将证书导入到设备的钥匙串中。

步骤 3:配置Fiddler

配置Fiddler以允许iOS设备的连接,并确保Fiddler监听指定的端口。

代码示例(Fiddler脚本):

if (oSession.HTTPMethodIs("CONNECT") && oSession.HostnameIs("api.example.com")) {
    // 解密HTTPS流量
    oSession["https-Client-Certificate"]= "FiddlerRoot";
}

if (oSession.HostnameIs("api.example.com")) {
    // 修改请求和响应
    oSession.utilDecodeResponse();
    oSession.utilReplaceInRequest("User-Agent: ", "User-Agent: MyCustomUserAgent/");
    oSession.utilReplaceInResponse("</html>", "</html><!-- Injected by Fiddler -->");
}

代码说明:

  • 使用Fiddler脚本可以对请求和响应进行修改。
  • 第一个if语句用于解密HTTPS流量,将证书名称设置为"FiddlerRoot"。
  • 第二个if语句用于修改请求和响应。在此示例中,我们将User-Agent头部添加了自定义的用户代理,并在响应中注入了一段HTML代码。

总结

使用Fiddler进行iOS抓包需要配置网络代理、安装Fiddler根证书和配置Fiddler脚本。以上是一个简单的示例,你可以根据实际情况进行修改和扩展。通过使用Fiddler进行抓包,你可以更好地了解iOS应用程序的网络通信情况,并进行调试和优化。希望这篇文章能