Ituns与iphone的通信协议usbmuxd解析

最开始研究与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格式的请求内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
五一放假,出门在外,有时候没有WiFi,没法通过无线ssh到iOS中调程序,怎么办呢?好在大神Nikias Bassen(即@pimskeks5)写了一个可以把本地OSX/Windows端口转发到远程iOS端口的工具usbmuxd16,使我们能够通过USB连接线ssh到iOS中,大大增加了ssh连接的速度,也方便了那些没有WiFi的朋友。下面我们就简单介绍一下怎么使用神器usbmuxd。(注:以下操作在OSX中进行,Windows用户请自行安装python环境) 下载usbmuxd 从这里下载usbmuxd(http://cgit.sukimashita.com/usbmuxd.git/snapshot/usbmuxd-1.0.8.tar.gz),解压到本地。我们要用到的只有python-client目录下的tcprelay.py和usbmux.py两个文件,把它们放到同一个目录下,如笔者的 /Users/snakeninny/Code/USBSSH/ 使用usbmuxd usbmuxd的用法比较简单,在Terminal中输入 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 远程iOS上的端口:本地OSX/Windows上的端口 即可把本地OSX/Windows上的端口转发到远程iOS上的端口,如 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 22:2222 可把本地的2222端口转发到iOS上的22端口,那么直接 ssh root@localhost -p 2222 即可ssh到iOS中。 使用场景举例 完全脱离WiFi,使用USB连接到iOS,用lldb调试SpringBoard。 i) 把本地2222端口转发到iOS的22端口 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 22:2222 ii) ssh过去并用debugserver attach到SpringBoard ssh root@localhost -p 2222 debugserver *:1234 -a "SpringBoard" iii) 把本地1234端口转发到iOS的1234端口 /Users/snakeninny/Code/USBSSH/tcprelay.py -t 1234:1234 iv) 用lldb开始调试 lldb process connect connect://localhost:1234
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值