mat*_*tes 34 sockets cfnetwork websocket ios charles-proxy
我想检查通过网络套接字的网络流量,我无法控制网络代码,因为这是一个二进制库,我没有源代码,所以我不能在网络部分做任何日志/断点码.
我已经尝试使用最新版本的CharlesProxy声称能够嗅探网页框,但是当我尝试使用网页框时,我甚至没有在我的iPhone调用的端点列表中提到网址.
我已经验证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这样的全双工流量来说是一个很好的增强.
更新:显然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代理:
Socket.IO不会公开Starscream Websocket或提供任何用于启用SOCKS代理行为的API。
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)。
| 归档时间: |
|
| 查看次数: |
22113 次 |
| 最近记录: |