iOS遠端真機之iTunes與iPhone的通訊協議usbmuxd解析
阿新 • • 發佈:2019-01-01
最開始研究與iPhone通訊, 都會想當然的google下usb協議, 必經iphone是通過usb線連線到電腦. 其實不然, iTunes是通過TCP協議與iPhone通訊的
usbmuxd
iTunes使用一種叫”usbmux”的東西與iphone通訊, 這個東西提供了一個USB - TCP的轉換服務.
這個服務在Mac端是由
/System/Library/PrivateFrameworks/MobileDevice.framework/Resources/usbmuxd
提供的, 當然, 開機自動啟動.
它建立了一個Unix Domain Socket
/var/run/usbmuxd. usbmuxd
服務程式監控iPhone在USB口上的連線, 當它監控到iPhone以使用者模式連線到USB, (相對的是recovery模式), usbmuxd服務程式就會連線到這個/var/run/usbmuxd
的TCP埠, 並開始成為一個USB - TCP
請求轉發器
那麼,如果想編寫個第三方程式與iphone進行通訊,實現類似iTunes的功能, 你的程式可以通過usbmuxd! 建立一個TCP連線到/var/run/usbmuxd
埠, 根據協議傳送對應的請求包, usbmuxd服務會將請求轉發到USB的iPhone上
lockdownd協議
//協議頭
struct usbmux_header {
u32 length; // 訊息長度,包括頭部
u32 version; // 協議版本號
u32 type; // 訊息型別,請求,響應,握手,等
u32 tag; // 訊息編號, 用來對應響應
char payload; //請求體
};
//頭部中的type型別
enum {
usbmux_result = 1,
usbmux_connect = 2,
usbmux_hello = 3,
usbmux_payload = 8,
};
監聽
知道了iTunes使用的協議, 那麼有沒有辦法看看iTunes都發了些什麼包? 有個簡單的辦法就是使用socat, 類似:
sudo mv /var/run/usbmuxd /var/run/usbmuxx
sudo socat -t100 -x -v UNIX-LISTEN:/var/run/usbmuxd,mode=777,reuseaddr,fork UNIX-CONNECT:/var/run/usbmuxx
包示例:
> 2013/02/04 00:07:19.567563 length=483 from=0 to=482
e3 01 00 00 01 00 00 00 08 00 00 00 02 00 00 00 ................
3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 <?xml version="1
2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 55 54 .0" encoding="UT
46 2d 38 22 3f 3e 0a F-8"?>.
3c 21 44 4f 43 54 59 50 45 20 70 6c 69 73 74 20 <!DOCTYPE plist
50 55 42 4c 49 43 20 22 2d 2f 2f 41 70 70 6c 65 PUBLIC "-//Apple
2f 2f 44 54 44 20 50 4c 49 53 54 20 31 2e 30 2f //DTD PLIST 1.0/
2f 45 4e 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 /EN" "http://www
2e 61 70 70 6c 65 2e 63 6f 6d 2f 44 54 44 73 2f .apple.com/DTDs/
50 72 6f 70 65 72 74 79 4c 69 73 74 2d 31 2e 30 PropertyList-1.0
2e 64 74 64 22 3e 0a .dtd">.
3c 70 6c 69 73 74 20 76 65 72 73 69 6f 6e 3d 22 <plist version="
31 2e 30 22 3e 0a 1.0">.
3c 64 69 63 74 3e 0a <dict>.
09 3c 6b 65 79 3e 42 75 6e 64 6c 65 49 44 3c 2f .<key>BundleID</ 6b 65 79 3e 0a key>.
09 3c 73 74 72 69 6e 67 3e 63 6f 6d 2e 61 70 70 .<string>com.app
6c 65 2e 69 54 75 6e 65 73 48 65 6c 70 65 72 3c le.iTunesHelper< 2f 73 74 72 69 6e 67 3e 0a /string>.
09 3c 6b 65 79 3e 43 6c 69 65 6e 74 56 65 72 73 .<key>ClientVers
69 6f 6e 53 74 72 69 6e 67 3c 2f 6b 65 79 3e 0a ionString</key>.
09 3c 73 74 72 69 6e 67 3e 75 73 62 6d 75 78 64 .<string>usbmuxd
2d 32 39 36 2e 33 3c 2f 73 74 72 69 6e 67 3e 0a -296.3</string>.
09 3c 6b 65 79 3e 4d 65 73 73 61 67 65 54 79 70 .<key>MessageTyp
65 3c 2f 6b 65 79 3e 0a e</key>.
09 3c 73 74 72 69 6e 67 3e 4c 69 73 74 65 6e 3c .<string>Listen< 2f 73 74 72 69 6e 67 3e 0a /string>.
09 3c 6b 65 79 3e 50 72 6f 67 4e 61 6d 65 3c 2f .<key>ProgName</ 6b 65 79 3e 0a key>.
09 3c 73 74 72 69 6e 67 3e 69 54 75 6e 65 73 48 .<string>iTunesH
65 6c 70 65 72 3c 2f 73 74 72 69 6e 67 3e 0a elper</string>.
09 3c 6b 65 79 3e 6b 4c 69 62 55 53 42 4d 75 78 .<key>kLibUSBMux
56 65 72 73 69 6f 6e 3c 2f 6b 65 79 3e 0a Version</key>.
09 3c 69 6e 74 65 67 65 72 3e 33 3c 2f 69 6e 74 .<integer>3</int
65 67 65 72 3e 0a eger>.
3c 2f 64 69 63 74 3e 0a </dict>.
3c 2f 70 6c 69 73 74 3e 0a </plist>.
--
< 2013/02/04 00:07:19.570319 length=294 from=0 to=293
26 01 00 00 01 00 00 00 08 00 00 00 02 00 00 00 &...............
3c 3f 78 6d 6c 20 76 65 72 73 69 6f 6e 3d 22 31 <?xml version="1
2e 30 22 20 65 6e 63 6f 64 69 6e 67 3d 22 55 54 .0" encoding="UT
46 2d 38 22 3f 3e 0a F-8"?>.
3c 21 44 4f 43 54 59 50 45 20 70 6c 69 73 74 20 <!DOCTYPE plist
50 55 42 4c 49 43 20 22 2d 2f 2f 41 70 70 6c 65 PUBLIC "-//Apple
2f 2f 44 54 44 20 50 4c 49 53 54 20 31 2e 30 2f //DTD PLIST 1.0/
2f 45 4e 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 /EN" "http://www
2e 61 70 70 6c 65 2e 63 6f 6d 2f 44 54 44 73 2f .apple.com/DTDs/
50 72 6f 70 65 72 74 79 4c 69 73 74 2d 31 2e 30 PropertyList-1.0
2e 64 74 64 22 3e 0a .dtd">.
3c 70 6c 69 73 74 20 76 65 72 73 69 6f 6e 3d 22 <plist version="
31 2e 30 22 3e 0a 1.0">.
3c 64 69 63 74 3e 0a <dict>.
09 3c 6b 65 79 3e 4d 65 73 73 61 67 65 54 79 70 .<key>MessageTyp
65 3c 2f 6b 65 79 3e 0a e</key>.
09 3c 73 74 72 69 6e 67 3e 52 65 73 75 6c 74 3c .<string>Result< 2f 73 74 72 69 6e 67 3e 0a /string>.
09 3c 6b 65 79 3e 4e 75 6d 62 65 72 3c 2f 6b 65 .<key>Number</ke
79 3e 0a y>.
09 3c 69 6e 74 65 67 65 72 3e 30 3c 2f 69 6e 74 .<integer>0</int
65 67 65 72 3e 0a eger>.
3c 2f 64 69 63 74 3e 0a </dict>.
3c 2f 70 6c 69 73 74 3e 0a </plist>.
--
第一個iTunes向/var/run/usbmuxd
發的請求包, 第一行 e3 01 00 00 01 00 00 00 08 00 00 00 02 00 00 00
是頭部 e3 01 00 00
即0x01e3 = 483
, 包長度
頭部後面緊跟的是payload, 也就是xml格式的請求內容