如何使用charlesproxy检查websocket流量以用于iOS模拟器/设备

mat*_*tes 34 sockets cfnetwork websocket ios charles-proxy

我想检查通过网络套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,所以我不能在网络部分做任何日志/断点码.

我已经尝试使用最新版本的CharlesProxy声称能够嗅探网页框,但是当我尝试使用网页框时,我甚至没有在我的iPhone调用的端点列表中提到网址.

版本3.11发行说明

我已经验证CharlesProxy配置正确,因为即使在SSL下我也可以检查非websocket流量.

所以我的问题是:有没有人找到一个解决方案来检查通过CharlesProxy通过websockets的流量?

注意:使用iOS9时,我禁用了ATS

谢谢!

kli*_*mat 24

我终于找到了答案.

Charles 3.11.2与WebSocket完美配合.

我使用socketIO,所以我已经看到在协商阶段发送的http请求,但我错过了websockets流量.

最初,socketIO尝试使用轮询,然后切换到使用websockets.

当您转到具有以下状态的请求时,可以看到websocket流量:"发送请求正文",这实际上是wss:// request.

您甚至可以为此类流量设置专用标签.其余的消息将出现在那里.

在此输入图像描述

PS1.确保您已正确连接到插座,然后它出现在Charles中.
PS2.我建议使用socketIO,这对于像websockets这样的全双工流量来说是一个很好的增强.

  • 问题是关于 iOS 模拟器的网络套接字。通过 JS 发送时,使用 Charles 看到 Web 套接字没有问题。 (3认同)

Jon*_*lis 6

更新:显然socket.io-client-swift v15.1.0现在正确支持SOCKS代理。我尚未尝试过,但这意味着不再需要对Starscream进行这些手动编辑。


可接受的答案似乎不适用于iOS设备上的Socket.IO。

Socket.IO-Client-Swift的最新版本(在撰写本文时为15.0.0)在iOS / OS X上使用Starscream for WebSockets。

好消息是,Starscream支持SOCKS代理:

  1. Socket.IO不会公开Starscream Websocket或提供任何用于启用SOCKS代理行为的API。

  2. Starscream内置的SOCKS代理使用OS SOCKS代理设置,这些设置很麻烦设置(至少对于iOS是这样)。

如果有时间,我可能会提出PR来更彻底地解决此问题,但是鉴于Starscream和Socket.IO-Client-Swift都需要工作,因此这并不完全简单。

出于临时调试目的(这是Charles的用例),解决此问题的最简单方法是将WebSocket.swift文件编辑为Starscream的一部分,并替换以下代码:

if enableSOCKSProxy {
    let proxyDict = CFNetworkCopySystemProxySettings()
    let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, proxyDict!.takeRetainedValue())
    let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
    CFWriteStreamSetProperty(outputStream, propertyKey, socksConfig)
    CFReadStreamSetProperty(inputStream, propertyKey, socksConfig)
}
Run Code Online (Sandbox Code Playgroud)

使用此代码:

let socksConfig = CFDictionaryCreateMutableCopy(nil, 0, CFNetworkCopySystemProxySettings()!.takeRetainedValue()) as! [String: Any]
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let ip = socksConfig["HTTPSProxy"]
let proxySocksConfig = ["SOCKSProxy": ip, "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
Run Code Online (Sandbox Code Playgroud)

这将确保默认情况下启用SOCKS代理,并将通过Charles路由所有WebSocket流量。

然后,您需要确保在iOS中配置了HTTP代理设置(因为HTTP和SOCKS都将使用相同的IP),在Charles中启用了SOCKS代理,并且端口与上面代码中的端口匹配(默认情况下) 8889)。