原文由 YueChen 发表于 TesterHome 社区网站,点击原文链接可与 YueChen 交换。
前言
获取 iOS 性能数据,始终都是比拟麻烦的事件,之前在构建测试框架 & 平台的时候,获取 iOS 性能也是没有什么好的方法,也只能应用比拟原始的形式,获取非越狱 iOS 性能数据,例如 xcode 调试能够获取,Instruments 获取数据,用起来也是极为不便。
到当初能做到跨平台,对非越狱 iOS 机器进行监控数据的貌似只有腾讯一家 PerfDog,的确十分优良,然而腾讯对于 PerfDog 的技术还是比拟窃密的,GitHub 上比拟有名的对于 iOS 设施管制仓库上例如 facebook idb,libimobiledevice 等,也都没有获取性能数据相干内容。
目前曾经实现
应用纯 Python 代码跨平台(win,mac,linux) 获取 iOS 局部性能数据 & 其余数据,10.3 < iOS version < 14.2 尽管能够获取绝大部分 iOS 设施性能数据,当然也有局部设施没有兼容,也心愿有趣味的同学能够一起探讨共同开发。最终开源我的项目地址会在文章开端凋谢
根本工作原理介绍
- Usbmux
- Lcokdown
- LaunchDaemon
- Instruments 通道
-
Framework
- DeveloperDiskImage.dmg
- MobileDevice.framework
- DTXMessage 流
Usbmux
usbmuxd 的次要作用就是,通过 usb 来构建一条 socket 通道来实现 Mac OS 与 iOS 之间的通信
windows 上则是 C:\Program Files\Common Files\Apple\Mobile Device Support\AppleMobileDeviceService.exe 驱动来监听 27105 端口与 iOS 之间进行通信
想做相干工具开发,获取数据显然必不可少,上面监听 usbmuxd
### 转移 usbmuxd
sudo mv /var/run/usbmuxd /var/run/usbmuxx
### 监听 usbmuxd
sudo socat -t100 -x -v UNIX-LISTEN:/var/run/usbmuxd,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/usbmuxx
### socat 工具是以文原本展现的,看起来相当吃力,### 通过管道转到 wiershark 下面,wireshark 查看 usbmuxd
sudo socat -d -d -lf /dev/stdout -x -v 2>&1 UNIX-LISTEN:/var/run/usbmuxd,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/usbmuxx | awk '/^[<>]/{a=0; $1 =="<"?"I":"0"; next}{$0 = substr($0, 1, 48);printf"%.4x %s\n",a,$0;a+=NF}' | text2pcap - - | wireshark -ki -
### 很重要!!!用完之后必须要复位,不然你的电脑之后就找不到手机了,必须重启电脑才行
sudo mv /var/run/usbmuxx /var/run/usbmuxd
LaunchDaemon & Lcokdown
用于与设施配对并启动其余服务。
胜利配对后能力拜访其余服务。胜利配对须要解锁设施,并且用户单击手机屏幕上的“信赖此设施”。前面次要都是与 Lcokdown 服务进行交互通信
次要交互方式通过 plist 格式文件进行交互来启动相干服务,这里咱们应用 python plistlib 来进行 byte 流转换
例如启动 com.apple.syslog_relay 服务
2020-12-15 14:04:53,987 - plist_service.py[line:88] - DEBUG: 发送 Plist: {'Request': 'StartService', 'Label': 'pyMobileDevice', 'Service': 'com.apple.syslog_relay'}
2020-12-15 14:04:53,987 - plist_service.py[line:90] - DEBUG: 发送 Plist byte: b'<?xml version="1.0"encoding="UTF-8"?>\n<!DOCTYPE plist PUBLIC"-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n<plist version="1.0">\n<dict>\n\t<key>Label</key>\n\t<string>pyMobileDevice</string>\n\t<key>Request</key>\n\t<string>StartService</string>\n\t<key>Service</key>\n\t<string>com.apple.syslog_relay</string>\n</dict>\n</plist>\n'
Instruments 服务
想要与 Instruments 服务进行通信,第一个咱们须要找到入口,第二个咱们须要晓得替换 DTXMessage 数据流格局,并对其进行编解码
这里如何开启通道,以及数据解析,就要看向 Troy Bowman 大佬在逆向工程大会上公布的演讲。
大佬的两个我的项目连贯共大家参考
https://github.com/troybowman…
https://github.com/troybowman…
好了晓得相干流程了,开始抄作业吧
DTXMessage Header 头解析
https://github.com/troybowman…
https://github.com/facebook/i… IDB 仓库也有大量不同协定头,有趣味的可自行查看,应用 python 结构 DTXMessage 头解析协定头示例
class DTXMessageHeader(Structure):
_fields_ = [('magic', c_uint32),
('cb', c_uint32),
('fragmentId', c_uint16),
('fragmentCount', c_uint16),
('length', c_uint32),
('identifier', c_uint32),
('conversationIndex', c_uint32),
('channelCode', c_uint32),
('expectsReply', c_uint32)
]
class DTXMessagePayloadHeader(Structure):
_fields_ = [('flags', c_uint32),
('auxiliaryLength', c_uint32),
('totalLength', c_uint64)
]
如何拿到 dtx 流数据能够参考我的项目:
https://github.com/danielpaul…
该我的项目能够间接获取和模拟器进行交互时的 dtx,能够用来测试数据解析是否失常。
sysmontap.py 示例成果展现
[
{
"PerCPUUsage": [
{
"CPU_NiceLoad": 0.0,
"CPU_SystemLoad": -1.0,
"CPU_TotalLoad": 11.881188118811878,
"CPU_UserLoad": -1.0
},
{
"CPU_NiceLoad": 0.0,
"CPU_SystemLoad": -1.0,
"CPU_TotalLoad": 17.0,
"CPU_UserLoad": -1.0
}
],
"EndMachAbsTime": 656566442146,
"CPUCount": 2,
"EnabledCPUs": 2,
"SystemCPUUsage": {
"CPU_NiceLoad": 0.0,
"CPU_SystemLoad": -1.0,
"CPU_TotalLoad": 28.881188118811878,
"CPU_UserLoad": -1.0
},
"Type": 33,
"StartMachAbsTime": 656542341717
},
{
"Processes": {
"351": [
351, // pid
417710325760, // memVirtualSize
770048, // memResidentSize
0.0, // cpuUsage
528,
-82,
934232, // physFootprint
819200, // memAnon
0.0, // powerScore
708608 // diskBytesRead
],
"519": [
519,
418581921792,
46628864,
13.8574323237612,
30281,
6465,
61965152,
20381696,
14.082756426586586,
57790464
],
"311": [
311,
417748434944,
6635520,
0.0,
10189,
43,
1671552,
1540096,
0.0,
22274048
],
"271": [
271,
417744961536,
4718592,
0.0,
8188,
473,
2130344,
1998848,
0.0,
36442112
]
},
"Type": 5,
"EndMachAbsTime": 656567535862,
"StartMachAbsTime": 656542716738
}
]
应用时注意事项及需要:
- 电脑须要有 iOS 驱动 iTunes,Linux 装置 usbmuxd 驱动自行百度
- 如果是 mac 可能没有 lockdown 权限,须要 sudo chmod 777 /var/db/lockdown/
- 如果抛出 StartServiceError 异样,须要应用 xcode 激活一下设施,激活形式关上 xcode,插上手机点击“信赖”,即可拔掉数据线。(实践上这一步也能够用脚本进行激活,暂未实现)
本我的项目源码地址:
https://github.com/YueChen-C/…
既然看完了,要是能点个 star 就最好啦
本我的项目基于
https://github.com/iOSForensi… 因为我的项目比拟久,在我的项目根底上进行优化和批改并减少了 instruments 协定
参考我的项目:
https://github.com/troybowman…
https://github.com/troybowman…
https://github.com/danielpaul…
https://github.com/libimobile…
https://github.com/facebook/idb
原文由 YueChen 发表于 TesterHome 社区网站,点击原文链接可与 YueChen 交换。
今日份的常识已摄入~
- 想理解更多前沿测试开发技术,结识行业大牛:欢送关注「第十届 MTSC 大会·上海」
- 1 个主会场 +12 大专场,大咖星散精英齐聚
- 12 个专场包含:
知乎、物流、开源、游戏、酷家乐、音视频、客户端
服务端、数字经济、效力晋升、品质保障、智能化测试