• Stars
    star
    1,430
  • Rank 32,906 (Top 0.7 %)
  • Language
    Python
  • License
    GNU General Publi...
  • Created over 3 years ago
  • Updated 29 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Pure python3 implementation for working with iDevices (iPhone, etc...).

Python application Pypi version Downloads

Description

pymobiledevice3 is a pure python3 implementation for working with iDevices (iPhone, etc...). This means this tool is both architecture and platform generic and is supported and tested on:

  • Windows
  • Linux
  • macOS

Main features include:

  • Device discovery over bonjour
  • TCP port forwarding
  • Viewing syslog lines (including debug)
  • Profile management
  • Application management
  • File system management (AFC)
  • Crash reports management
  • Network sniffing (PCAP)
  • Firmware update
  • Mounting images
  • Notification listening and triggering (notify_post() api)
  • Querying and setting SpringBoard options
  • Automating WebInspector features
  • DeveloperDiskImage features:
    • Taking screenshots
    • Simulate locations
    • Process management
    • Sniffing KDebug messages (strace capabilities++)
    • Process monitoring (top like)
    • Accessibility features
    • Sniffing oslog which includes both syslog and signposts
  • Backup

Installation

Install the last released version using pip:

python3 -m pip install -U pymobiledevice3

Or install the latest version from sources:

git clone [email protected]:doronz88/pymobiledevice3.git
cd pymobiledevice3
python3 -m pip install -U -e .

You can also install auto-completion for all available sub-commands by adding the following into your ~/.zshrc:

# python-click<8.0
eval "$(_PYMOBILEDEVICE3_COMPLETE=source_zsh pymobiledevice3)"
# python-click>=8.0
eval "$(_PYMOBILEDEVICE3_COMPLETE=zsh_source pymobiledevice3)"

Lower iOS versions (<13)

If you wish to use pymobiledevice3 with iOS versions lower than 13, Make sure to install openssl:

On MAC:

brew install openssl

On Linux:

sudo apt install openssl

Usage

The CLI subcommands are divided roughly by the protocol layer used for interacting in the device. For example, all features derived from the DeveloperDiskImage will be accessible from the developer subcommand. This also means that every feature which isn't there won't require it.

This is the main CLI usage:

Usage: python -m pymobiledevice3 [OPTIONS] COMMAND [ARGS]...

Options:
  -h, --help  Show this message and exit.

Commands:
  activation       activation options
  afc              FileSystem utils
  amfi             amfi options
  apps             application options
  backup2          backup utils
  bonjour          bonjour options
  companion        companion options
  crash            crash report options
  developer        developer options.
  diagnostics      diagnostics options
  lockdown         lockdown options
  mounter          mounter options
  notification     notification options
  pcap             sniff device traffic
  power-assertion  Create a power assertion (wraps...
  processes        processes cli
  profile          profile options
  provision        privision options
  restore          restore options
  springboard      springboard options
  syslog           syslog options
  usbmux           usbmuxd options
  webinspector     webinspector options

Or import the modules and use the API yourself:

from pymobiledevice3.lockdown import create_using_usbmux
from pymobiledevice3.services.syslog import SyslogService

lockdown = create_using_usbmux()
for line in SyslogService(lockdown=lockdown).watch():
    # just print all syslog lines as is
    print(line)

Example

A recorded example for using a variety of features can be viewed at: https://terminalizer.com/view/18920b405193

There is A LOT you may do on the device using pymobiledevice3. This is just a TL;DR of some common operations:

  • Listing connected devices:
    • pymobiledevice3 usbmux list
  • Discover network devices using bonjour:
    • pymobiledevice3 bonjour browse
  • View all syslog lines (including debug messages):
    • pymobiledevice3 syslog live
  • Filter out only messages containing the word "SpringBoard":
    • pymobiledevice3 syslog live -m SpringBoard
  • Restart device:
    • pymobiledevice3 diagnostics restart
  • Pull all crash reports from device:
    • pymobiledevice3 crash pull /path/to/crashes
  • Manage the media directory:
    • pymobiledevice3 afc shell
  • List all installed applications and their details:
    • pymobiledevice3 apps list --user --system
  • Create a TCP tunnel from your HOST to the device:
    • pymobiledevice3 usbmux forward HOST_PORT DEVICE_PORT
  • Create a full backup of the device:
    • pymobiledevice3 backup2 backup --full DIRECTORY
  • Restore a given backup:
    • pymobiledevice3 backup2 restore DIRECTORY
  • The following will require Web Inspector feature to be turned on:
    • Get interactive JavaScript shell on any open tab:
      • pymobiledevice3 webinspector js_shell
    • List currently opened tabs is device's browser:
      • pymobiledevice3 webinspector opened-tabs
    • The following will require also the Remote Automation feature to be turned on:
      • Get interactive JavaScript shell on new remote automation tab:
        • pymobiledevice3 webinspector js_shell --automation
      • Launch an automation session to view a given URL:
        • pymobiledevice3 webinspector launch URL
      • Get a a selenium-like shell:
        • pymobiledevice3 webinspector shell
  • Mount DeveloperDiskImage:
    • pymobiledevice3 mounter mount
    • The following will assume the DeveloperDiskImage is already mounted:
      • Simulate an x y location:
        • pymobiledevice3 developer simulate-location set x y
      • Taking a screenshot from the device:
        • pymobiledevice3 developer screenshot /path/to/screen.png
      • View detailed process list (including ppid, uid, guid, sandboxed, etc...):
        • pymobiledevice3 developer dvt sysmon process single
      • Sniffing oslog:
        • pymobiledevice3 developer dvt oslog
      • Kill a process:
        • pymobiledevice3 developer dvt kill PID
      • List files in a given directory (un-chrooted):
        • pymobiledevice3 developer dvt ls PATH
      • Launch an app by its bundle name:
        • pymobiledevice3 developer dvt launch com.apple.mobilesafari
      • Sniff all KDebug events to get an strace-like output:
        • pymobiledevice3 developer dvt core-profile-session parse-live
      • Sniff all KDebug events into a file for parsing later with tools such as pykdebugparser, fs_usage and so on...
        • pymobiledevice3 developer dvt core-profile-session save FILENAME
      • Get device extended information (kernel name, chipset, etc...):
        • pymobiledevice3 developer dvt device-information
      • Monitor energy-consumption for a specific PID:
        • pymobiledevice3 developer dvt energy PID1 PID2 ...

The bits and bytes

To understand the bits and bytes of the communication with lockdownd you are advised to take a look at this article:

https://jon-gabilondo-angulo-7635.medium.com/understanding-usbmux-and-the-ios-lockdown-service-7f2a1dfd07ae

Lockdown services

Implemented services

This is the list of all the services from lockdownd which we reversed and implemented API wrappers for. A click on each will lead to each one's implementation, where you can learn more about.

Un-implemented services

This is the list of services we haven't dedicated time in implementing. If you feel the need to use one of them or any other that is not listed in here, feel free to create us an issue request .

  • com.apple.idamd
    • Allows settings the IDAM configuration (something to do with loading of AppleUSBDeviceAudioDevice)
  • com.apple.atc
    • AirTraffic related
  • com.apple.atc2
  • com.apple.ait.aitd
    • AirTraffic related
  • com.apple.mobile.file_relay (Deprecated)
    • On older iOS versions (iOS <= 8), this was the main relay used for file operations, which was later replaced with AFC.
  • com.apple.mobilesync
  • com.apple.purpletestr (Deprecated)
  • com.apple.PurpleReverseProxy.Conn
    • Something to do with tethering internet connection to restored devices
  • com.apple.PurpleReverseProxy.Ctrl
    • Something to do with tethering internet connection to restored devices
  • com.apple.dt.remotepairingdeviced.lockdown
  • com.apple.commcenter.mobile-helper-cbupdateservice
  • com.apple.carkit.service
    • Used to transfer data to accessories. Data is transferred using iAP2 packets.
  • com.apple.bluetooth.BTPacketLogger
  • com.apple.streaming_zip_conduit
    • Another relay used to install IPAs

Sending your own messages

Lockdown messages

Every such subcommand may wrap several relay requests underneath. If you wish to try and play with some the relays yourself, you can run:

pymobiledevice3 lockdown service <service-name>

This will start an IPython shell where you already have the connection established using the client variable and you can send & receive messages.

# This shell allows you to communicate directly with every service layer behind the lockdownd daemon.

# For example, you can do the following:
client.send_plist({"Command": "DoSomething"})

# and view the reply
print(client.recv_plist())

# or just send raw message
client.sendall(b"hello")

# and view the result
print(client.recvall(20))

Instruments messages

If you want to play with DTServiceHub which lies behind the developer options, you can also use:

pymobiledevice3 developer shell

To also get an IPython shell, which lets you call ObjC methods from the exported objects in the instruments' namespace like so:

# This shell allows you to send messages to the DVTSecureSocketProxy and receive answers easily.
# Generally speaking, each channel represents a group of actions.
# Calling actions is done using a selector and auxiliary (parameters).
# Receiving answers is done by getting a return value and seldom auxiliary (private / extra parameters).
# To see the available channels, type the following:
developer.supported_identifiers

# In order to send messages, you need to create a channel:
channel = developer.make_channel('com.apple.instruments.server.services.deviceinfo')

# After creating the channel you can call allowed selectors:
channel.runningProcesses()

# If an answer is expected, you can receive it using the receive method:
processes = channel.receive_plist()

# Sometimes the selector requires parameters, You can add them using MessageAux. For example lets kill a process:
channel = developer.make_channel('com.apple.instruments.server.services.processcontrol')
args = MessageAux().append_obj(80)  # This will kill pid 80
channel.killPid_(args, expects_reply=False)  # Killing a process doesn't require an answer.

# In some rare cases, you might want to receive the auxiliary and the selector return value.
# For that cases you can use the recv_plist method.
return_value, auxiliary = developer.recv_plist()

Contributing

See CONTRIBUTING.

More Repositories

1

hilda

LLDB wrapped and empowered by iPython's features
Python
131
star
2

harlogger

Simple utlity for sniffing decrypted HTTP/HTTPS traffic on an macOS/iOS device (either jailbroken or not)
Python
110
star
3

fa

Automation tool for locating symbols & structs in binary (primary IDA focused)
Python
70
star
4

DeveloperDiskImage

Home for both DeveloperDiskImage files (iOS < 17.0) and Personalized files (iOS >= 17.0)
Python
53
star
5

rpc-project

Minimalistic server (written in C) and a python3 client to allow calling native functions on a remote host for automation purposes
Python
44
star
6

pylera1n

Python adaptation for pelara1n
Python
35
star
7

ida-scripts

Python
28
star
8

swift_reversing

My ongoing premier on reversing Swift
C
28
star
9

pycrashreport

Python3 parser for Apple's crash reports
Python
25
star
10

cfprefsmon

Python utility for discovering interesting CFPreferences values on iDevices
Python
16
star
11

simpleelf

Parse and build simple ELFs (useful for mapping memory to load into IDA and other disassemblers)
Python
12
star
12

applecatalog

Python library and CLI for listing and downloading Apple's updates for macOS (Secruity updates, CommandLineTools, OS Upgrades and etc...)
Python
11
star
13

cfnetwork_diagnotics_log_filter

Sniffing decrypted HTTP/HTTPS traffic for non-jailbroken iOS devices
11
star
14

ipsw_parser

python3 utility for parsing and extracting data from IPSW
Python
10
star
15

pytbd

Swiss army knife for Apple's .tbd file manipulation
Python
10
star
16

cklogger

Simple pure python utility for sniffing CloudKit usages on iDevices
Python
9
star
17

pyusbmuxd

Pure python3 fork of usbmuxd
Python
7
star
18

c-helpers

Helpers for c-structs sizes and offsets
Python
7
star
19

dotfiles

My collection of dotfiles
4
star
20

doronz88

2
star
21

maclog

Query macOS syslog from python3
Python
2
star
22

pychangelog2

Simple tool for creating changelogs
Python
2
star
23

debugserver-deploy

Python
2
star
24

pytun-pmd3

This is a fork of https://github.com/montag451/pytun with partial Darwin support.
C
2
star
25

xontrib-fzf-completions

fzf completions for xonsh
Xonsh
2
star
26

download-jetbrains-plugins

Automatically download selected JetBrains plugins
Python
1
star
27

dns_local

Simple python3 DNS server
Python
1
star
28

Pogo

My own version of Pogo.app
Swift
1
star
29

mirror-casks

Python3 utility for mirroring brew casks
Python
1
star
30

python-package

1
star
31

worksetup

Python
1
star
32

sslpsk-pmd3

A fork of sslpsk-pmd3
Python
1
star
33

ida_ios15_got_fix

IDAPython script for fixing .got entries on iOS15 executables
Python
1
star
34

xattrios

`xattr -l` for iOS
Objective-C
1
star
35

downloader

Download scripts
Python
1
star