summaryrefslogtreecommitdiffstats
path: root/README
diff options
context:
space:
mode:
Diffstat (limited to 'README')
-rw-r--r--README264
1 files changed, 77 insertions, 187 deletions
diff --git a/README b/README
index 65219c1..7b0cfe4 100644
--- a/README
+++ b/README
@@ -1,206 +1,96 @@
1About
2=====
3
4A socket daemon to multiplex connections from and to iOS devices.
5
1Background 6Background
2========== 7==========
3 8
4'usbmuxd' stands for "USB multiplexing daemon". This daemon is in charge of 9'usbmuxd' stands for "USB multiplexing daemon". This daemon is in charge of
5multiplexing connections over USB to an iPhone or iPod touch. To users, it means 10multiplexing connections over USB to an iOS device. To users, it means
6you can sync your music, contacts, photos, etc. over USB. To developers, it 11you can sync your music, contacts, photos, etc. over USB. To developers, it
7means you can connect to any listening localhost socket on the device. usbmuxd 12means you can connect to any listening localhost socket on the device. usbmuxd
8is not used for tethering data transfer, which uses a dedicated USB interface as 13is not used for tethering data transfer which uses a dedicated USB interface as
9a virtual network device. 14a virtual network device. Multiple connections to different TCP ports can happen
15in parallel. The higher-level layers are handled by libimobiledevice.
10 16
11Multiple connections to different TCP ports can happen in parallel. An example 17When usbmuxd is running (normally started, or stopped as a result of 'udev'
12(and useful) tool called 'iproxy' is included that allows you to forward 18auto-insertion messages or by systemd) it provides a socket interface in
13localhost ports to the device---allows SSH over USB on jailbroken devices, or 19'/var/run/usbmuxd' that is designed to be compatible with the socket interface
14allowing access the lockdown daemon (and then to all of the file access, sync, 20that is provided on Mac OS X.
15notification and backup services running on the device).
16 21
17The higher-level layers are handled by libimobiledevice. 'ifuse' is then able 22You should also create a 'usbmux' user that has access to USB devices on your
18to sit on top of this and mount your device's AFC filesystem share. 23system. Alternatively, you can pass a different username using the -U argument.
19 24
20License 25Due to iOS 7 the daemon now also manages pairing records with iOSdevices and
21======= 26the host in '/var/lib/lockdown' (Linux) or '/var/db/lockdown' (Mac OS X).
27Ensure proper permissions are setup for the daemon to access the directory.
22 28
23The contents of this package are licensed under the GNU General Public License, 29Requirements
24versions 2 or 3 (see COPYING.GPLv2 and COPYING.GPLv3). If a more permissive 30============
25license is specified at the top of a source file, it takes precedence over this.
26 31
27Legal 32Development Packages of:
28===== 33 libimobiledevice
34 libplist
35 libusb
29 36
30Apple, iPhone, and iPod touch are trademarks of Apple Inc., registered in the 37Software:
31U.S. and other countries. 38 make
39 autoheader
40 automake
41 autoconf
42 libtool
43 pkg-config
44 gcc
45 udev (Linux only)
32 46
33Building 47Optional:
34======== 48 systemd (Linux only)
35 49
36 ./autogen.sh 50Installation
37 make 51============
38 sudo make install
39 52
40You should also create a 'usbmux' user that has access to USB devices on your 53To compile run:
41system. Alternatively, you can pass a different username after the -U argument. 54 ./autogen.sh
55 make
56 sudo make install
57
58The daemon is automatically started by udev or systemd depending on what you
59have configured it on hotplug of an iOS device and exits if the last device
60was unplugged.
61
62For debugging purposes it is helpful to start usbmuxd using the foreground '-f'
63argument and enable verbose mode '-v' to get suitable logs.
42 64
43Running (with magic) 65Who/What/Where?
44==================== 66===============
67
68Home:
69 http://www.libimobiledevice.org/
70
71Code:
72 git clone http://git.sukimashita.com/usbmuxd.git
73
74Code (Mirror):
75 git clone https://github.com/libimobiledevice/usbmuxd.git
76
77Tickets:
78 http://github.com/libimobiledevice/usbmuxd/issues
79
80Mailing List:
81 http://lists.libimobiledevice.org/mailman/listinfo/libimobiledevice-devel
82
83IRC:
84 irc://irc.freenode.net#libimobiledevice
85
86Credits
87=======
45 88
46 (Unplug + replug your jailbroken device) 89The first usbmuxd daemon implementation was authored by Hector Martin.
47 ./iproxy 2222 22 &
48 ssh -p 2222 root@localhost
49 90
50Hopefully you get the normal SSH login prompt. You may still lots of debugging 91Apple, iPhone, iPod, and iPod Touch are trademarks of Apple Inc.
51output for the moment. If this is getting in the way of your ssh login, then 92libimobiledevice is an independent software library and has not been
52run the 'ssh' command from a different xterminal or virtual console. Of course, 93authorized, sponsored, or otherwise approved by Apple Inc.
53you need to have OpenSSH installed on your jailbroken device for this to work.
54 94
55If you have iFuse, you can run "ifuse <mountpoint">. This doesn't require 95README Updated on:
56iproxy and works on all devices, jailbroken or not. 96 2014-10-02
57
58Running (without magic)
59=======================
60
61If 'udev' is _not_ automatically running on your machine and picking up the new
62.rules file, you will need to start usbmuxd by hand first. Check it's running
63and that there is only one copy with 'ps aux | grep
64usbmuxd'.
65
66 sudo usbmuxd -U usbmux -v -v &
67 ./iproxy 2222 22 &
68 ssh -p 2222 root@localhost
69
70Tip: Starting SSH if disabled
71=============================
72
73If your device is rooted, but SSH isn't started and you _cannot_ (for instance,
74cracked/broken screen) get to the Services control panel on the device, then you
75can start the SSH service over the USB by mounting the (jailbroken) filesystem.
76
77You will need to mount it using 'ifuse --afc2' (to access the root directory of
78the device), and then edit:
79
80 /Library/LaunchDaemons/com.openssh.sshd.plist
81
82to _remove_ the lines:
83
84 <key>Disabled</key>
85 <true/>
86
87Reboot the device and then sshd should be running.
88
89TODO
90====
91
92The server currently assumes that the device is well-behaved and does not do a
93bunch of checks like looking for the expected SEQ and ACK numbers from it. This
94is normally not an issue, but it's annoying for debugging because lost packets
95(which shouldn't happen, but can happen if the code is buggy) mean that stuff
96gets out of sync and then might crash and burn dozens of packets later.
97
98The server needs more testing, and some optimizing.
99
100Someone should probably do some edge-case testing on the TCP stuff.
101
102The outgoing ACK handling on the server probably needs some thought. Currently,
103when there's an outstanding ACK, we send it after a timeout (to avoid sending
104a no-payload ACK packet for everything the phone sends us). However, there's
105probably a better way of doing this.
106
107Architecture information
108========================
109
110The iPhone / iPod Touch basically implements a rather strange USB networking
111system that operates at a higher level. It is of course completely proprietary.
112Generally speaking, this is what goes on in a typical usage scenario:
113
1140. iTunes opens a connection to usbmuxd and asks it for device notifications
1151. User inserts phone into computer
1162. usbmuxd notices the phone and pings it with a version packet
1173. phone replies
1184. usbmuxd now considers the phone to be connected and tells iTunes
1195. iTunes opens another separate connection to usbmuxd and asks it to connect
120 to, say, the afc port on the device
1216. usbmuxd sends a pseudo-TCP SYN packet to the phone
1227. the phone's kernel driver receives the SYN packet and itself opens a
123 TCP connection to localhost on the afc port
1248. the phone replies with a pseudo-TCP SYN/ACK indicating that the port is open
125 and the connection can proceed
1267. usbmuxd sends a final ACK to the phone
1278. usbmuxd replies to iTunes with a "connection successful" message
1289. any data that iTunes writes to the usbmuxd socket from now on is forwarded,
129 through pseudo-TCP, through USB, back into a more regular TCP connection to
130 localhost, to the afc daemon on the phone, and vice versa
131
132The usbmuxd protocol is a relatively simple binary message protocol documented
133here:
134
135http://wikee.iphwn.org/usb:usbmux
136
137Note that once a connection is established the UNIX socket essentially becomes
138a dedicated pipe to the TCP connction and no more high-level control is
139possible (closing the socket closes the TCP connection). Ditto for the "listen
140for devices" mode - usbmuxd will reject any commands in such mode, and the
141socket essentially becomes a dedicated device notification pipe. This means
142that you need, at minimum, TWO connections to usbmuxd to do anything useful.
143
144On Windows, usbmuxd works the same way but a TCP connection to localhost port
14527015 replaces the UNIX socket. On OSX, the UNIX socket is /var/run/usbmuxd. The
146server and client implemented here default the same /var/run/usbmuxd socket.
147
148The phone protocol operates over a pair of USB bulk endpoints. There is an outer
149layer used for packet size info and a "protocol" (version and TCP are the only
150two options), and that header is followed by TCP headers for actual data comms.
151However, the protocol isn't actual TCP, just a custom protocol which for some
152reason uses a standard TCP header and leaves most fields unused.
153
154There is no reordering or retransmission. There are no checksums, no URG, no
155PSH, no non-ACK, no FIN. What there *is* is the SEQ/ACK/window mechanism used
156for flow control, and RST is used as the only connection teardown mechanism (and
157also for "connection refused"), and the connection startup is SYN/SYNACK/ACK.
158
159Windows are constant-scaled by 8 bits. This is legal TCP as long as the
160corresponding option is negotiated. Of course, no such negotiation happens on
161this protocol.
162
163Note that, since there are no retransmissions, there is some overlap between ACK
164and window for flow control. For example, the server doesn't ever touch its
165window size, and just refuses to ACK stuff if its buffers are full and the
166client isn't reading data. The phone happily seems to stop sending stuff.
167
168Also, if the phone RSTs you out of nowhere, look at the packet payload for a
169textual error message. Note: if it claims to suffer from amnesia, that probably
170means you overflowed its input buffer by ignoring its flow control / window
171size. Go figure. Probably a logic bug in the kernel code.
172
173Note that all normal packets need to have flags set to ACK (and only ACK). There
174is no support for, erm, not-acking. Keep the ack number field valid at all
175times.
176
177The usbmuxd CONNECT request port field is byte-swapped (network-endian). This is
178even more annoying for the plist based protocol, since it's even true there
179(where the field is plain text). So even for the plain text int, you need to
180swap the bytes (port 22 becomes <integer>5632</integer>). I have no clue if this
181is the case on the new plist protocol on PPC macs (is the newer iTunes available
182for those?)
183
184There are a bunch of gotchas due to the USB framing, and this is even worse
185because implementations tend to get it wrong (i.e. libusb, and this is the
186reason for the patch). Basically, USB Bulk offers, at the low level, the ability
187to transfer packets from 0 to wMaxPacketSize (512 here) bytes, period. There is
188no other support for higher level framing of transfers. The way you do those is
189by breaking them up into packets, and the final shorter packet marks the end of
190the transfer. The critical bit is that, if the transfer happens to be divisible
191by 512, you send a zero-length packet (ZLP) to indicate the end of the transfer.
192Libusb doesn't set this option by default and the iPhone gets packets stuck to
193each other, which it doesn't like. Actually, this framing is sort of redundant
194because the usbmux packet header includes a length field, but the phone still
195wants the ZLPs or else it breaks. To make matters worse, usbdevfs imposes a max
196transfer size of 16k, so libusb breaks transfers into that size. This is okay
197for sending as long as the ZLP is only added to the last transfer (the patch
198does that), but it can easily cause nasty race conditions on RX due to libusb
199doing multiple outstanding reads at the same time and then cancelling the rest
200when shorter data arrives (but what if some data got into the other requests
201already?), so we only do 16k reads and stick them together ourselves by looking
202at the packet size header. We still depend on ZLPs being sent to end transfers
203at non-16k boundaries that are multiples of 512, but that seems to work fine. I
204guess the ZLPs might cause spurious 0-byte transfers to show up on RX if things
205line up right, but we ignore those. By the way, the maximum packet/transfer size
206is 65535 bytes due to the 16-bit length header of the usbmux protocol.