Itunsとiphoneの通信プロトコルusbmuxd解析
5994 ワード
http://liang8305.github.com/ios/itunsiphoneとの通信プロトコルUSbmuxd解析/
iphoneとの通信を最初に検討すると、当然のことながらgoogleがusb契約を下し、必ずiphoneでusb線でパソコンに接続します.そうではないです.iTunesはTCPプロトコルでiPhoneと通信しています.
usbmuxd
iTunesは「usbmux」というものを使ってiphoneと通信しています.これはUSB-TCPの変換サービスを提供しています. このサービスはMac端末で
では、第三者プログラムを作成してiPhoneと通信したいなら、iTunesのような機能を実現します.あなたのプログラムはusbmuxdを通じてできます.
lockdowndプロトコル
iTunesで使うプロトコルが分かりましたが、iTunesでどんなカバンが送られているか確認する方法がありますか?簡単な方法は
頭の後ろに付いているのは、payload、つまりxml形式の要求内容です.
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を通じてできます.
/var/run/usbmuxd
ポートにTCP接続を確立し、プロトコルに従って対応するリクエストパケットを送信すると、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
つまり0 x 01 e 3=483で、カバンの長さ頭の後ろに付いているのは、payload、つまりxml形式の要求内容です.