diff --git a/Cargo.lock b/Cargo.lock index 2229f77..042de45 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1134,7 +1134,7 @@ dependencies = [ [[package]] name = "idevice" -version = "0.1.27" +version = "0.1.28" dependencies = [ "async-recursion", "base64", diff --git a/README.md b/README.md index c9a96c8..cac5e1c 100644 --- a/README.md +++ b/README.md @@ -6,53 +6,124 @@ and [pymobiledevice3](https://github.com/doronz88/pymobiledevice3), this library interfaces with lockdownd and usbmuxd to perform actions on an iOS device that a Mac normally would. +For help and information, join the [idevice Discord](https://discord.gg/qtgv6QtYbV) + ## State **IMPORTANT**: Breaking changes will happen at each point release until 0.2.0. -The library is still in the development and brainstorming stage. Pin your `Cargo.toml` to a specific version to avoid breakage. This library is in development and research stage. Releases are being published to crates.io for use in other projects, but the API and feature-set are far from final or even planned. -- [x] lockdownd connection -- [x] SSL support -- [x] Heartbeat -- [x] Pairing file -- [ ] Instproxy (partial support) -- [ ] afc -- [ ] amfi -- [ ] companion proxy -- [ ] diagnostics -- [ ] file relay -- [ ] house arrest -- [ ] misagent (certificates) -- [x] RemoteXPC -- [ ] mobile backup -- [ ] notification proxy -- [x] DVT protocol -- [ ] screenshot -- [ ] simulate location -- [x] process control -- [ ] web inspector -- [ ] usbmuxd connection -- [ ] Documentation - ## Features To keep dependency bloat and compile time down, everything is contained in features. -- core_device_proxy -- heartbeat +- afc - Apple File Conduit, partial/in-progress support +- core_device_proxy - Start a secure tunnel to access protected services +- debug_proxy - Send GDB commands +- dvt - Developer tools/instruments +- heartbeat - Heartbeat the device +- installation_proxy - Install/manage apps, partial support +- springboardservices - Manage the sprinboard, partial support +- misagent - Manage provisioning profiles +- mobile_image_mounter - Manage the DDI mounted on the device +- location_simulation - Simulate the GPS location +- tcp - Connect to devices over TCP +- tunnel_tcp_stack - Naive software TCP stack for core_device_proxy +- tss - Requests to Apple's TSS servers, partial support +- tunneld - Interface with pymobiledevice3's tunneld +- usbmuxd - Connect to devices over usbmuxd daemon +- xpc - Get protected services over RSD via XPC +- full (all features) + +### Planned/TODO + +Finish the following: + +- lockdown support +- afc - installation_proxy -- mounter -- xpc -- full +- sprinboard + +Implement the following: + +- amfi +- companion_proxy +- crash_reports +- diagnostics +- house_arrest +- mobilebackup2 +- notification_proxy +- screenshot +- syslog_relay +- webinspector As this project is done in my free time within my busy schedule, there is no ETA for any of these. Feel free to contribute or donate! +## Usage + +idevice is purposefully verbose to allow for powerful configurations. +No size fits all, but effort is made to reduce boilerplate via providers. + +```rust +// enable the usbmuxd feature +use idevice::{lockdown::LockdowndClient, IdeviceService}; +use idevice::usbmuxd::{UsbmuxdAddr, UsbmuxdConnection}, + +#[tokio::main] +async fn main() { + // usbmuxd is Apple's daemon for connecting to devices over USB. + // We'll ask usbmuxd for a device + let mut usbmuxd = UsbmuxdConnection::default() + .await + .expect("Unable to connect to usbmxud") + let devs = usbmuxd.get_devices().unwrap(); + if devs.is_empty() { + eprintln!("No devices connected!"); + return; + } + + // Create a provider to automatically create connections to the device. + // Many services require opening multiple connections to get where you want. + let provider = devs[0].to_provider(UsbmuxdAddr::from_env_var().unwrap(), 0, "example-program") + + // ``connect`` takes an object with the provider trait + let mut lockdown_client = match LockdowndClient::connect(&provider).await { + Ok(l) => l, + Err(e) => { + eprintln!("Unable to connect to lockdown: {e:?}"); + return; + } + }; + + println!("{:?}", lockdown_client.get_value("ProductVersion").await); + println!( + "{:?}", + lockdown_client + .start_session( + &provider + .get_pairing_file() + .await + .expect("failed to get pairing file") + ) + .await + ); + println!("{:?}", lockdown_client.idevice.get_type().await.unwrap()); + println!("{:#?}", lockdown_client.get_all_values().await); +} +``` + +More examples are in the ``tools`` crate and in the crate documentation. + +## FFI + +For use in other languages, a small FFI crate has been created to start exposing +idevice. Example C programs can be found in this repository. + ## Version Policy As Apple prohibits downgrading to older versions, this library will @@ -62,7 +133,7 @@ not keep compatibility for older versions than the current stable release. doronz88 is kind enough to maintain a [repo](https://github.com/doronz88/DeveloperDiskImage) for disk images and personalized images. -On MacOS, you can find them at ``~/Library/Developer/DeveloperDiskImages`` on a Mac. +On MacOS, you can find them at ``~/Library/Developer/DeveloperDiskImages``. ## License diff --git a/idevice/Cargo.toml b/idevice/Cargo.toml index e67c5b8..3d51214 100644 --- a/idevice/Cargo.toml +++ b/idevice/Cargo.toml @@ -2,7 +2,7 @@ name = "idevice" description = "A Rust library to interact with services on iOS devices." authors = ["Jackson Coxson"] -version = "0.1.27" +version = "0.1.28" edition = "2021" license = "MIT" documentation = "https://docs.rs/idevice" @@ -89,3 +89,6 @@ full = [ "tunneld", "springboardservices", ] + +[package.metadata.docs.rs] +all-features = true diff --git a/idevice/src/lib.rs b/idevice/src/lib.rs index c49157c..4645f65 100644 --- a/idevice/src/lib.rs +++ b/idevice/src/lib.rs @@ -1,3 +1,4 @@ +#![doc = include_str!("../../README.md")] // Jackson Coxson #[cfg(feature = "afc")] diff --git a/tools/src/ideviceinfo.rs b/tools/src/ideviceinfo.rs index 25956e1..583dd72 100644 --- a/tools/src/ideviceinfo.rs +++ b/tools/src/ideviceinfo.rs @@ -2,7 +2,7 @@ // idevice Rust implementation of libimobiledevice's ideviceinfo use clap::{Arg, Command}; -use idevice::{lockdown::LockdowndClient, pairing_file::PairingFile, IdeviceService}; +use idevice::{lockdown::LockdowndClient, IdeviceService}; mod common; @@ -67,8 +67,17 @@ async fn main() { println!("{:?}", lockdown_client.get_value("ProductVersion").await); - let p = PairingFile::read_from_file(pairing_file.unwrap()).unwrap(); - println!("{:?}", lockdown_client.start_session(&p).await); + println!( + "{:?}", + lockdown_client + .start_session( + &provider + .get_pairing_file() + .await + .expect("failed to get pairing file") + ) + .await + ); println!("{:?}", lockdown_client.idevice.get_type().await.unwrap()); println!("{:#?}", lockdown_client.get_all_values().await); }