我想检查通过网络套接字的网络流量,我没有控制网络代码,因为这是一个二进制的库,我没有源代码,所以我不能做任何日志/断点在网络部分的代码。
我已经尝试使用最新版本的CharlesProxy,它声称能够嗅探websockets,但是当我尝试使用websockets的url和apis时,从我的iPhone调用的端点列表中甚至都没有提到。
我已经验证了CharlesProxy的配置是否正确,因为即使在SSL下,我也能够检查非websocket流量。
所以我的问题是:有没有人找到了用CharlesProxy检查通过websockets的流量的解决方案?
注意:我在使用iOS9时禁用了自动测试系统
谢谢!
发布于 2016-02-02 19:57:00
我终于找到了答案。
Charles 3.11.2与WebSocket完美配合。
我使用socketIO,所以我已经看到在协商阶段发送http请求,但是我错过了websockets流量。
在一开始,socketIO尝试使用轮询,然后切换到使用websockets。
当您转到状态为“正在发送请求正文”的请求时,可以看到websocket流量,该请求实际上是wss:// request。
你甚至有一个专门的标签来处理这种流量。其余的消息就会出现在那里。
PS1。确保您已正确连接到套接字,然后它将出现在Charles中。
PS2。我建议使用socketIO,对于像websockets这样的全双工通信来说,这是一个很好的增强。
发布于 2019-04-04 19:38:49
客户端更新:显然Socket.IO--swift v15.1.0现在可以正确支持SOCKS代理。我还没有尝试过,但这意味着不再需要对红蜘蛛进行这些手动编辑。
公认的答案似乎不适用于iOS设备上的Socket.IO。
最新版本的Socket.IO-Client-Swift (撰写本文时为15.0.0)在iOS/OS上使用WebSockets的Starscream。
好消息是,红蜘蛛支持SOCKS代理:
如果我有一些时间,我可能会提出一个PR来更彻底地解决这个问题,但考虑到它需要红蜘蛛和Socket.IO-Client-Swift的工作,这并不是完全直接的。
为了临时调试的目的(这就是Charles的用例),解决这个问题的最简单方法是将WebSocket.swift
文件作为红蜘蛛的一部分进行编辑,并替换以下代码:
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)
}
使用以下代码:
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)
这将确保默认情况下启用SOCKS代理,并通过Charles路由所有websockets流量。
然后,您需要确保在iOS中配置了HTTP代理设置(因为HTTP和SOCKS将使用相同的IP ),在Charles中启用了SOCKS代理,并且端口与上面代码中的端口匹配(缺省为8889)。
发布于 2019-05-15 01:35:31
谢谢你非常非常有帮助的回答Jonathan Ellis!我使用的是Pusher,它工作得很好!
然而,我发现socksConfig
并不总是包含有效的数据,当我从那里提取IP时,它不工作或会崩溃。因为我们从那里得到的唯一东西是本地主机IP,所以我在WebSocket.swift
中替换了以下内容
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)
}
有了这个:
let propertyKey = CFStreamPropertyKey(rawValue: kCFStreamPropertySOCKSProxy)
let proxySocksConfig = ["SOCKSProxy": "127.0.0.1", "SOCKSPort": 8889, "SOCKSEnable": true] as CFDictionary // Where 8889 is the SOCKS proxy port in Charles
CFWriteStreamSetProperty(outputStream, propertyKey, proxySocksConfig)
CFReadStreamSetProperty(inputStream, propertyKey, proxySocksConfig)
然后按照您所描述的在Charles中启用了socks代理。
再次感谢!
https://stackoverflow.com/questions/33090087
复制相似问题