如何监控从 iOS 模拟器发出的网络调用
Posted
技术标签:
【中文标题】如何监控从 iOS 模拟器发出的网络调用【英文标题】:How to monitor network calls made from iOS Simulator 【发布时间】:2012-06-23 02:37:34 【问题描述】:我正在尝试像 Firebug 一样监控从应用程序到我的服务器的调用。 我找不到在 ios 模拟器或 xCode 中查看的方法。
有没有办法在不嗅探所有流量的情况下做到这一点? 如果没有,你会推荐什么工具?
【问题讨论】:
【参考方案1】:就我个人而言,我使用 Charles 来处理这类事情。 启用后,它将监控每个网络请求,显示扩展的请求详细信息,包括对 SSL 和各种请求/响应格式(如 JSON 等)的支持...
您还可以将其配置为仅嗅探对特定服务器的请求,而不是整个流量。
它是商业软件,但有试用版,恕我直言,它绝对是一个很棒的工具。
【讨论】:
非常易于使用和配置,完全符合我的要求,谢谢! 当你的服务器受到 TLS 保护时,它就不容易工作了。 我尝试了 Charles,但无法很好地监控传出流量。例如,我无法将 POST 请求的格式更改为 JSON【参考方案2】:如其他答案所建议的那样,如果您只想查看 HTTP/HTTPS 流量,那么中间人代理是一个很好的解决方案。 Burp Suite 很不错。不过配置起来可能会很痛苦。我不确定您将如何说服模拟器与之交谈。您可能必须将本地 Mac 上的代理设置为代理服务器实例才能拦截,因为模拟器将使用您本地 Mac 的环境。
我发现数据包嗅探的最佳解决方案(尽管它仅适用于实际 iOS 设备,而不适用于模拟器)是使用rvictl
。 This blog post 写得很好。基本上你会这样做:
rvictl -s <iphone-uid-from-xcode-organizer>
然后你用 Wireshark(或你最喜欢的工具)嗅探它创建的界面,当你完成后关闭界面:
rvictl -x <iphone-uid-from-xcode-organizer>
这很好,因为如果你想对模拟器进行数据包嗅探,你也不得不涉足到本地 Mac 的流量,但是rvictl
创建了一个虚拟接口,只显示来自你的 iOS 设备的流量已插入您的 USB 端口。
【讨论】:
Burp Suite +1,配置起来很轻松:engadget.com/2011/02/21/… 不到 10 分钟【参考方案3】:最近我发现了一个git repo,这很容易。
你可以试试。
这是一个应用程序的屏幕截图:
最好的问候。
【讨论】:
虽然 Bagel 很棒而且很简单,但我最近注意到它还会显示缓存的请求。因此,例如,如果您想知道实际传输的字节数,这是没有帮助的。 来自 Web 开发,这是您在浏览器中找到的最简单和最相似的网络选项卡工具。我真的很喜欢这个工具。【参考方案4】:在 Mac 上轻松运行的免费开源代理工具是mitmproxy。
该网站包含指向 Mac 二进制文件的链接,以及 Github 上的源代码。
文档包含一个非常有用的介绍,用于将证书加载到您的测试设备以查看 HTTPS 流量。
不像 Charles 那样 GUI-tastic,但它可以满足我的一切需求,而且它是免费的,并且可以维护。 好东西,如果您以前使用过一些命令行工具,那么非常简单。
更新:我刚刚在网站上注意到 mitmproxy 可作为自制软件安装。再简单不过了。
【讨论】:
你在 iOS 模拟器上使用过 mitm 吗?我已经设置了它,但是来自模拟器之外的计算机的流量也被捕获,这不是最好的。在实际设备上使用它是惊人的。多年来一直这样做。 mitmweb 是 mitmproxy 的基于 Web 的用户界面,允许交互式检查和修改 HTTP 流量。与 mitmproxy 一样,它与 mitmdump 的不同之处在于所有流都保存在内存中,这意味着它旨在获取和操作小样本mitmproxy.readthedocs.io/en/v2.0.2/mitmweb.html【参考方案5】:Xcode 提供 CFNetwork 诊断日志。 Apple doc
要启用它,请在环境变量部分添加CFNETWORK_DIAGNOSTICS=3
:
这将显示来自应用程序的请求及其标头和正文。请注意,OS_ACTIVITY_MODE
必须设置为 enable
,如图所示。否则控制台上不会显示任何输出。
【讨论】:
OS_ACTIVITY_MODE
不再需要根据最新文档:developer.apple.com/documentation/network/…。还需要在你的 Mac 上使用单独的控制台应用程序,而不是在 Xcode 的调试控制台中查找消息。来自文档:“确保从主控制台窗口左侧的源列表中选择您的 iOS 设备(如果源列表不可见,请选择查看 > 显示源)。”从那里您可以添加过滤器,例如您的进程、cfnetwork、HTTPProtocol: request
等(右键单击一行或使用搜索框)【参考方案6】:
Wireshark
选择你的界面
添加filter
启动capture
测试
单击任何会触发 GET/POST/PUT/DELETE 请求的操作或按钮
你会在wireshark中看到它
如果您想了解有关某个特定数据包的更多详细信息,只需选择它并Follow > HTTP Stream。
希望这对其他人有所帮助!
【讨论】:
如何知道请求的更多细节是 HTTPS(不是 HTTP)?【参考方案7】:这似乎是最近添加的。在模拟器上点击command
+control
+z
会弹出调试菜单。在该菜单中,单击Inspect
。检查将显示选项卡。单击网络选项卡,这将显示正在发出的所有网络请求。
【讨论】:
这很酷,但它阻塞了模拟器的底部,使其无法使用。 facepalm有什么办法可以移动吗? 是的,我相信您可以将输出窗口移动到模拟器的顶部。这很烦人,有时您必须将输出屏幕从模拟器的底部移动到顶部,反之亦然。【参考方案8】:如果你有cable连接和Mac,那么有一个简单而强大的方法:
安装免费的 Wireshark,确保它可以捕获设备(并且您需要在每次计算机重新启动后进行此操作!):
sudo chmod 644 /dev/bpf*
现在与 wifi 共享您的网络。系统偏好设置 > 共享 > Internet 共享。检查您是否有“共享来自:以太网的连接”并使用:Wi-Fi。您可能还想配置一些 wifi 安全性,它不会干扰您的数据监控。
将手机连接到新创建的网络。我在这里经常需要几次尝试。如果手机不想连接,请关闭Mac的wifi,然后重复上面的步骤2并耐心等待。
启动 Wireshark 使用 Wireshark 捕获您的无线接口,它可能是“en1”。过滤您需要的 IP 地址和/或端口。当您找到一个有趣的包时,选择它,右键单击(上下文菜单)> 关注 TCP 流,您会看到请求和答案的漂亮文本表示。
什么是最好的:同样的技巧也适用于 android!
【讨论】:
你的模拟器能用这个吗?我的手机上还没有这个应用程序。 @Joshua Dance 如果它有外部网络请求,您可以将它与模拟器一起使用。无法使用wireshark 跟踪到本地主机的连接,因为它们没有通过“电线”(网卡)【参考方案9】:Telerik Fiddler 是个不错的选择
http://www.telerik.com/blogs/using-fiddler-with-apple-ios-devices
【讨论】:
这将如何在 OSX 机器上工作?考虑到其中两个标签是 xcode 和 ios-simulator。 @KevinR,1. Telerik 确实有适用于 OS X 2 的 Fiddler 测试版。问题中没有任何地方说选择仅限于 OS X telerik.com/blogs/using-fiddler-with-apple-ios-devices @KonstantinSalavatov,原帖的主题是“如何监控从 iOS 模拟器发出的网络调用”。 iOS 模拟器仅在 OS X 上运行,所以是的,选择 仅限于 OS X。 +1 我认为你现在应该投票赞成,因为现在支持 Mac OS X! :D telerik.com/fiddler#SupportedTechnologies 和这里 telerik.com/download/fiddler/fiddler-osx-beta【参考方案10】:从Xcode 13
开始,您可以使用 Xcode Instruments -> Network instrument 来监控所有网络流量及其所有详细信息。你需要一台运行 iOS 15+ 的物理设备
更多详情请参阅 WWDC 2021 视频中的 Analyze Network Traffic。
【讨论】:
【参考方案11】:-
安装 WireShark
从 xcode 网络监视器获取 ip 地址
听wifi接口
在 WireShark 中设置过滤器 ip.addr == 192.168.1.122
【讨论】:
【参考方案12】:您也可以使用这个open source library called Wormholy(由我制作)。
您只需将它集成到您的项目中(无需代码),就是这样,您将能够监控您应用的所有 API 请求,也可以在真实设备上。
而且您不需要像 Charles 那样管理证书。这一切都靠魔法!
【讨论】:
看起来真不错!我尝试安装它,但我没有看到它只跟踪来自NSURLSession
的流量【参考方案13】:
FLEX 是监控 iOS 应用程序网络流量的绝佳工具。
单击上面屏幕截图中列出的任何请求时,我将被重定向到另一个屏幕,在该屏幕上我可以看到有关该请求的更多详细信息。
但是,我有一个用例,我正在开发的应用程序会将用户重定向到 Safari。我也想监控 Safari 中的网络流量,但 FLEX 只能监控来自您的 iOS 应用程序的流量,而不是来自任何其他应用程序的流量(在撰写此答案时)。
然后我切换到Proxyman 来监控来自 iOS 模拟器的网络流量。
它有一套明确的说明,说明如何使用iOS simulators 和Android emulators 进行设置。 它有一个简单、直观的用户界面,使用起来很容易。【讨论】:
【参考方案14】:如果您习惯了 chrome 检查器工具,一个很好的解决方案是 Pony 调试器:https://github.com/square/PonyDebugger
设置起来有点麻烦,但是一旦设置好就可以了。请务必使用 Safari 而不是 Chrome 来使用它。
【讨论】:
【参考方案15】:我使用 netfox。它非常易于使用和集成。您可以在模拟器和设备上使用它。它显示了所有的请求和响应。它支持 JSON、XML、HTML、图像和其他类型的响应。您可以通过 IOS 默认共享格式(Gmail、WhatsApp、电子邮件、slack、短信等)共享请求、响应和完整日志
您可以在 GitHub 上查看:https://github.com/kasketis/netfox
Netfox 可以快速查看您的 iOS 或 OSX 应用程序执行的所有已执行网络请求。它抓取所有请求 - 当然是您的请求,来自 3rd 方库(例如 AFNetworking、Alamofire 或其他)、UIWebViews 等的请求
【讨论】:
【参考方案16】:您可以尝试使用https://github.com/BugBlock/BugBlock-iOS 这是我创建的一个小工具,所以您需要的一切是:
import BugBlock
然后
var config = BBConfiguration()
config.consoleLoggingEnabled = false
config.serverLoggingEnabled = true
config.crashReportingEnabled = true
BBLog.start(appId: "SDK key", configuration: config)
并设置网络拦截器
let conf = URLSessionConfiguration.default
BBLog.networkLogging(with: conf)
let session = URLSession(configuration: conf)
然后在您的请求中使用session
。
希望能帮助您捕获日志。
【讨论】:
以上是关于如何监控从 iOS 模拟器发出的网络调用的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
从 iOS UIAutomation 发出同步 HTTP GET 请求或在 JavaScript 中调用 shell 脚本