pymobiledevice3 4.20.21__tar.gz → 7.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/FUNDING.yml +1 -1
- pymobiledevice3-7.3.0/.github/workflows/generate-executable.py +67 -0
- pymobiledevice3-7.3.0/.github/workflows/python-app.yml +45 -0
- pymobiledevice3-7.3.0/.github/workflows/python-publish.yml +27 -0
- pymobiledevice3-7.3.0/.pre-commit-config.yaml +9 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/PKG-INFO +13 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/README.md +1 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/plist_sniffer.py +15 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/remotexpc_sniffer.py +29 -28
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/understanding_idevice_protocol_layers.md +11 -6
- pymobiledevice3-7.3.0/pymobiledevice3/__main__.py +440 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/_version.py +16 -3
- pymobiledevice3-7.3.0/pymobiledevice3/bonjour.py +380 -0
- pymobiledevice3-7.3.0/pymobiledevice3/ca.py +290 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/activation.py +46 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/afc.py +64 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/amfi.py +33 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/apps.py +104 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/backup.py +241 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/bonjour.py +87 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/cli_common.py +309 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/companion_proxy.py +22 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/crash.py +131 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/__init__.py +62 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/accessibility/__init__.py +65 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/accessibility/settings.py +44 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/arbitration.py +50 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/condition.py +33 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/core_device.py +294 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/debugserver.py +286 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/__init__.py +442 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/core_profile_session.py +295 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/simulate_location.py +56 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/sysmon/__init__.py +69 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/dvt/sysmon/process.py +188 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/fetch_symbols.py +108 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/developer/simulate_location.py +51 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/diagnostics/__init__.py +75 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/diagnostics/battery.py +47 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/idam.py +42 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/lockdown.py +191 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/mounter.py +241 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/notification.py +68 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/pcap.py +78 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/power_assertion.py +26 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/processes.py +31 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/profile.py +236 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/provision.py +59 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/remote.py +348 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/restore.py +252 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/springboard.py +90 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/syslog.py +294 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/usbmux.py +116 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/version.py +14 -0
- pymobiledevice3-7.3.0/pymobiledevice3/cli/webinspector.py +584 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/common.py +1 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/exceptions.py +164 -61
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/irecv.py +49 -53
- pymobiledevice3-7.3.0/pymobiledevice3/irecv_devices.py +1503 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/lockdown.py +425 -257
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/lockdown_service_provider.py +10 -7
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/os_utils.py +18 -9
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/posix_util.py +28 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/win_util.py +14 -8
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/pair_records.py +19 -19
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/common.py +4 -4
- pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/app_service.py +154 -0
- pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/core_device_service.py +37 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/device_info.py +5 -5
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/diagnostics_service.py +10 -8
- pymobiledevice3-7.3.0/pymobiledevice3/remote/core_device/file_service.py +102 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remote_service_discovery.py +63 -37
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remotexpc.py +69 -44
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/tunnel_service.py +401 -306
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/utils.py +14 -13
- pymobiledevice3-7.3.0/pymobiledevice3/remote/xpc_message.py +346 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/dsc_uuid_map.py +19 -19
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/firmware_notifications.py +16 -16
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/notifications.txt +52 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/asr.py +27 -27
- pymobiledevice3-7.3.0/pymobiledevice3/restore/base_restore.py +162 -0
- pymobiledevice3-7.3.0/pymobiledevice3/restore/consts.py +91 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/device.py +47 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/fdr.py +46 -48
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/ftab.py +19 -19
- pymobiledevice3-7.3.0/pymobiledevice3/restore/img4.py +163 -0
- pymobiledevice3-7.3.0/pymobiledevice3/restore/mbn.py +587 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/recovery.py +141 -149
- pymobiledevice3-7.3.0/pymobiledevice3/restore/restore.py +1396 -0
- pymobiledevice3-7.3.0/pymobiledevice3/restore/restore_options.py +225 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/restored_client.py +25 -22
- pymobiledevice3-7.3.0/pymobiledevice3/restore/tss.py +912 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/service_connection.py +85 -72
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/accessibilityaudit.py +137 -127
- pymobiledevice3-7.3.0/pymobiledevice3/services/afc.py +1551 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/amfi.py +22 -19
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/companion.py +23 -19
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/crash_reports.py +61 -47
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/debugserver_applist.py +3 -3
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/device_arbitration.py +8 -8
- pymobiledevice3-7.3.0/pymobiledevice3/services/device_link.py +229 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/diagnostics.py +1038 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dtfetchsymbols.py +8 -8
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +4 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +4 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +85 -74
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/application_listing.py +2 -3
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +7 -6
- pymobiledevice3-7.3.0/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +769 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/device_info.py +20 -11
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +1 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/graphics.py +1 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/location_simulation.py +1 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +10 -10
- pymobiledevice3-7.3.0/pymobiledevice3/services/dvt/instruments/network_monitor.py +158 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/notifications.py +1 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/process_control.py +25 -10
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/screenshot.py +2 -2
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/sysmontap.py +15 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +42 -52
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/file_relay.py +10 -10
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/heartbeat.py +8 -7
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/house_arrest.py +12 -15
- pymobiledevice3-7.3.0/pymobiledevice3/services/idam.py +20 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/installation_proxy.py +121 -99
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/lockdown_service.py +20 -10
- pymobiledevice3-7.3.0/pymobiledevice3/services/misagent.py +58 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/mobile_activation.py +237 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/mobile_config.py +435 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/mobile_image_mounter.py +141 -113
- pymobiledevice3-7.3.0/pymobiledevice3/services/mobilebackup2.py +425 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/notification_proxy.py +11 -11
- pymobiledevice3-7.3.0/pymobiledevice3/services/os_trace.py +242 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/pcapd.py +412 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/power_assertion.py +10 -9
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/preboard.py +4 -4
- pymobiledevice3-7.3.0/pymobiledevice3/services/remote_fetch_symbols.py +53 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/remote_server.py +176 -146
- pymobiledevice3-7.3.0/pymobiledevice3/services/restore_service.py +45 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/screenshot.py +32 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/simulate_location.py +7 -7
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/springboard.py +15 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/syslog.py +5 -5
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/alert.py +26 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/automation_session.py +411 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/cdp_screencast.py +46 -37
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/cdp_server.py +19 -19
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/cdp_target.py +718 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/driver.py +198 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/element.py +208 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/inspector_session.py +268 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/selenium_api.py +91 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/session_protocol.py +18 -12
- pymobiledevice3-7.3.0/pymobiledevice3/services/web_protocol/switch_to.py +70 -0
- pymobiledevice3-7.3.0/pymobiledevice3/services/webinspector.py +380 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tcp_forwarder.py +64 -50
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tunneld/api.py +20 -15
- pymobiledevice3-7.3.0/pymobiledevice3/tunneld/server.py +614 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/usbmux.py +224 -158
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/utils.py +14 -11
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/PKG-INFO +13 -15
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/SOURCES.txt +20 -3
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/requires.txt +9 -12
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pyproject.toml +72 -7
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pytest.ini +2 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/requirements.txt +9 -12
- pymobiledevice3-7.3.0/tests/cli/test_cli.py +77 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/conftest.py +23 -24
- pymobiledevice3-7.3.0/tests/services/instruments/test_core_profile_session.py +17 -0
- pymobiledevice3-7.3.0/tests/services/instruments/test_dvt_secure_socket_proxy.py +108 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_fetch_symbols.py +9 -8
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_location.py +3 -2
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/test_screenshot.py +4 -3
- pymobiledevice3-7.3.0/tests/services/test_accessibility.py +23 -0
- pymobiledevice3-7.3.0/tests/services/test_afc.py +355 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_apps.py +5 -5
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_backup2.py +12 -7
- pymobiledevice3-7.3.0/tests/services/test_bonjour.py +25 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_crash_reports.py +24 -23
- pymobiledevice3-7.3.0/tests/services/test_house_arrest.py +26 -0
- pymobiledevice3-7.3.0/tests/services/test_list_devices.py +6 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_lockdown.py +3 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_pcapd.py +2 -1
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_springboard_services_relay.py +5 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_start_tunnel.py +7 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_syslog_relay.py +5 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_tcp_forwarder.py +4 -4
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/common.py +2 -2
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/conftest.py +7 -8
- pymobiledevice3-7.3.0/tests/services/test_web_protocol/test_driver.py +38 -0
- pymobiledevice3-7.3.0/tests/services/test_web_protocol/test_element.py +9 -0
- pymobiledevice3-7.3.0/tests/services/test_webinspector.py +20 -0
- pymobiledevice3-4.20.21/.github/workflows/generate-executable.py +0 -63
- pymobiledevice3-4.20.21/.github/workflows/python-app.yml +0 -122
- pymobiledevice3-4.20.21/.github/workflows/python-publish.yml +0 -29
- pymobiledevice3-4.20.21/.pre-commit-config.yaml +0 -15
- pymobiledevice3-4.20.21/pymobiledevice3/__main__.py +0 -287
- pymobiledevice3-4.20.21/pymobiledevice3/bonjour.py +0 -135
- pymobiledevice3-4.20.21/pymobiledevice3/ca.py +0 -53
- pymobiledevice3-4.20.21/pymobiledevice3/cli/activation.py +0 -38
- pymobiledevice3-4.20.21/pymobiledevice3/cli/afc.py +0 -56
- pymobiledevice3-4.20.21/pymobiledevice3/cli/amfi.py +0 -38
- pymobiledevice3-4.20.21/pymobiledevice3/cli/apps.py +0 -59
- pymobiledevice3-4.20.21/pymobiledevice3/cli/backup.py +0 -174
- pymobiledevice3-4.20.21/pymobiledevice3/cli/bonjour.py +0 -83
- pymobiledevice3-4.20.21/pymobiledevice3/cli/cli_common.py +0 -308
- pymobiledevice3-4.20.21/pymobiledevice3/cli/companion_proxy.py +0 -22
- pymobiledevice3-4.20.21/pymobiledevice3/cli/completions.py +0 -50
- pymobiledevice3-4.20.21/pymobiledevice3/cli/crash.py +0 -82
- pymobiledevice3-4.20.21/pymobiledevice3/cli/developer.py +0 -1280
- pymobiledevice3-4.20.21/pymobiledevice3/cli/diagnostics.py +0 -99
- pymobiledevice3-4.20.21/pymobiledevice3/cli/lockdown.py +0 -185
- pymobiledevice3-4.20.21/pymobiledevice3/cli/mounter.py +0 -182
- pymobiledevice3-4.20.21/pymobiledevice3/cli/notification.py +0 -56
- pymobiledevice3-4.20.21/pymobiledevice3/cli/pcap.py +0 -57
- pymobiledevice3-4.20.21/pymobiledevice3/cli/power_assertion.py +0 -25
- pymobiledevice3-4.20.21/pymobiledevice3/cli/processes.py +0 -37
- pymobiledevice3-4.20.21/pymobiledevice3/cli/profile.py +0 -180
- pymobiledevice3-4.20.21/pymobiledevice3/cli/provision.py +0 -58
- pymobiledevice3-4.20.21/pymobiledevice3/cli/remote.py +0 -262
- pymobiledevice3-4.20.21/pymobiledevice3/cli/restore.py +0 -240
- pymobiledevice3-4.20.21/pymobiledevice3/cli/springboard.py +0 -88
- pymobiledevice3-4.20.21/pymobiledevice3/cli/syslog.py +0 -187
- pymobiledevice3-4.20.21/pymobiledevice3/cli/usbmux.py +0 -68
- pymobiledevice3-4.20.21/pymobiledevice3/cli/version.py +0 -16
- pymobiledevice3-4.20.21/pymobiledevice3/cli/webinspector.py +0 -431
- pymobiledevice3-4.20.21/pymobiledevice3/irecv_devices.py +0 -480
- pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/app_service.py +0 -127
- pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/core_device_service.py +0 -34
- pymobiledevice3-4.20.21/pymobiledevice3/remote/core_device/file_service.py +0 -88
- pymobiledevice3-4.20.21/pymobiledevice3/remote/xpc_message.py +0 -326
- pymobiledevice3-4.20.21/pymobiledevice3/restore/base_restore.py +0 -119
- pymobiledevice3-4.20.21/pymobiledevice3/restore/consts.py +0 -70
- pymobiledevice3-4.20.21/pymobiledevice3/restore/img4.py +0 -161
- pymobiledevice3-4.20.21/pymobiledevice3/restore/restore.py +0 -1376
- pymobiledevice3-4.20.21/pymobiledevice3/restore/restore_options.py +0 -215
- pymobiledevice3-4.20.21/pymobiledevice3/restore/tss.py +0 -798
- pymobiledevice3-4.20.21/pymobiledevice3/services/afc.py +0 -970
- pymobiledevice3-4.20.21/pymobiledevice3/services/device_link.py +0 -207
- pymobiledevice3-4.20.21/pymobiledevice3/services/diagnostics.py +0 -1035
- pymobiledevice3-4.20.21/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -687
- pymobiledevice3-4.20.21/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -102
- pymobiledevice3-4.20.21/pymobiledevice3/services/misagent.py +0 -55
- pymobiledevice3-4.20.21/pymobiledevice3/services/mobile_activation.py +0 -156
- pymobiledevice3-4.20.21/pymobiledevice3/services/mobile_config.py +0 -400
- pymobiledevice3-4.20.21/pymobiledevice3/services/mobilebackup2.py +0 -384
- pymobiledevice3-4.20.21/pymobiledevice3/services/os_trace.py +0 -182
- pymobiledevice3-4.20.21/pymobiledevice3/services/pcapd.py +0 -412
- pymobiledevice3-4.20.21/pymobiledevice3/services/remote_fetch_symbols.py +0 -46
- pymobiledevice3-4.20.21/pymobiledevice3/services/restore_service.py +0 -45
- pymobiledevice3-4.20.21/pymobiledevice3/services/screenshot.py +0 -29
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/alert.py +0 -26
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/automation_session.py +0 -399
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/cdp_target.py +0 -680
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/driver.py +0 -195
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/element.py +0 -195
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/inspector_session.py +0 -264
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/selenium_api.py +0 -91
- pymobiledevice3-4.20.21/pymobiledevice3/services/web_protocol/switch_to.py +0 -67
- pymobiledevice3-4.20.21/pymobiledevice3/services/webinspector.py +0 -379
- pymobiledevice3-4.20.21/pymobiledevice3/tunneld/server.py +0 -476
- pymobiledevice3-4.20.21/tests/cli/test_cli.py +0 -44
- pymobiledevice3-4.20.21/tests/services/instruments/test_core_profile_session.py +0 -14
- pymobiledevice3-4.20.21/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -107
- pymobiledevice3-4.20.21/tests/services/test_accessibility.py +0 -22
- pymobiledevice3-4.20.21/tests/services/test_afc.py +0 -339
- pymobiledevice3-4.20.21/tests/services/test_bonjour.py +0 -24
- pymobiledevice3-4.20.21/tests/services/test_list_devices.py +0 -5
- pymobiledevice3-4.20.21/tests/services/test_web_protocol/test_driver.py +0 -38
- pymobiledevice3-4.20.21/tests/services/test_web_protocol/test_element.py +0 -8
- pymobiledevice3-4.20.21/tests/services/test_webinspector.py +0 -20
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.gitattributes +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/pull_request_template.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/workflows/codeql.yml +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.github/workflows/markdown-lint.yml +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/.gitignore +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/CODE_OF_CONDUCT.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/CONTRIBUTING.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/LICENSE +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/example.gif +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/markdownlint-config.json +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/DTServices-14.2.txt +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/DTServices-14.5.txt +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/RemoteXPC.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/pyinstaller.md +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/usbmux_sniff.sh +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/cli/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/osu/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/core_device/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/module_imports.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/remote/remote_service.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/focus.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/restore/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3/tunneld/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/entry_points.txt +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/pymobiledevice3.egg-info/top_level.txt +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/setup.cfg +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/cli/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/instruments/__init__.py +0 -0
- {pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/tests/services/test_web_protocol/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# These are supported funding model platforms
|
|
2
2
|
|
|
3
|
-
github:
|
|
3
|
+
github: doronz88
|
|
4
4
|
patreon: # Replace with a single Patreon username
|
|
5
5
|
open_collective: # Replace with a single Open Collective username
|
|
6
6
|
ko_fi: doronz
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import os
|
|
3
|
+
import site
|
|
4
|
+
import sys
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
import coloredlogs
|
|
8
|
+
import PyInstaller.__main__
|
|
9
|
+
|
|
10
|
+
import pymobiledevice3.__main__
|
|
11
|
+
import pymobiledevice3.cli
|
|
12
|
+
import pymobiledevice3.resources
|
|
13
|
+
|
|
14
|
+
coloredlogs.install(level=logging.DEBUG)
|
|
15
|
+
|
|
16
|
+
ROOT = Path(__file__).parent.parent.parent
|
|
17
|
+
DEFAULT_OUTPUT = ROOT / Path("dist/__main__").with_suffix(".exe" if sys.platform == "win32" else "")
|
|
18
|
+
OUTPUT = (ROOT / "dist/pymobiledevice3").with_suffix(".exe" if sys.platform == "win32" else "")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def main() -> None:
|
|
22
|
+
site_packages_path = site.getsitepackages()[0]
|
|
23
|
+
resources_dir = Path(pymobiledevice3.resources.__file__).parent
|
|
24
|
+
pymobiledevice3_cli_path = Path(pymobiledevice3.cli.__file__).parent
|
|
25
|
+
|
|
26
|
+
hidden_imports = []
|
|
27
|
+
|
|
28
|
+
for module in pymobiledevice3_cli_path.iterdir():
|
|
29
|
+
if module.name.endswith(".py") and module.name != "__init__.py": # Avoid including the __init__.py
|
|
30
|
+
# Create the module name to be added to hidden imports
|
|
31
|
+
module_name = "pymobiledevice3.cli." + os.path.splitext(module.name)[0]
|
|
32
|
+
hidden_imports.append("--hidden-import=" + module_name)
|
|
33
|
+
|
|
34
|
+
pyinstaller_args = [
|
|
35
|
+
pymobiledevice3.__main__.__file__,
|
|
36
|
+
"--hidden-import=ipsw_parser",
|
|
37
|
+
"--hidden-import=zeroconf",
|
|
38
|
+
"--hidden-import=pyimg4",
|
|
39
|
+
"--hidden-import=zeroconf._utils.ipaddress",
|
|
40
|
+
"--hidden-import=zeroconf._handlers.answers",
|
|
41
|
+
"--hidden-import=readchar",
|
|
42
|
+
"--copy-metadata=pyimg4",
|
|
43
|
+
"--copy-metadata=readchar",
|
|
44
|
+
"--copy-metadata=apple_compress",
|
|
45
|
+
"--onefile",
|
|
46
|
+
]
|
|
47
|
+
if sys.platform == "win32":
|
|
48
|
+
pyinstaller_args.extend([
|
|
49
|
+
"--add-binary",
|
|
50
|
+
f"{site_packages_path}/Lib/site-packages/pytun_pmd3/wintun/*;pytun_pmd3/wintun/bin",
|
|
51
|
+
"--add-binary",
|
|
52
|
+
f"{resources_dir}/webinspector;pymobiledevice3/resources/webinspector",
|
|
53
|
+
])
|
|
54
|
+
else:
|
|
55
|
+
pyinstaller_args.extend([
|
|
56
|
+
"--add-binary",
|
|
57
|
+
f"{site_packages_path}/pytun_pmd3:pytun_pmd3",
|
|
58
|
+
"--add-binary",
|
|
59
|
+
f"{resources_dir}/webinspector:pymobiledevice3/resources/webinspector",
|
|
60
|
+
])
|
|
61
|
+
pyinstaller_args.extend(hidden_imports)
|
|
62
|
+
PyInstaller.__main__.run(pyinstaller_args)
|
|
63
|
+
DEFAULT_OUTPUT.rename(OUTPUT)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
if __name__ == "__main__":
|
|
67
|
+
main()
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
name: Python application
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [ "master" ]
|
|
6
|
+
paths:
|
|
7
|
+
- '.github/workflows/python-app.yml'
|
|
8
|
+
- 'pymobiledevice3/**'
|
|
9
|
+
- 'requirements.txt'
|
|
10
|
+
- 'pyproject.toml'
|
|
11
|
+
release:
|
|
12
|
+
types: [ created ]
|
|
13
|
+
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
test:
|
|
20
|
+
if: '! github.event.pull_request.draft'
|
|
21
|
+
runs-on: ${{ matrix.os }}
|
|
22
|
+
|
|
23
|
+
strategy:
|
|
24
|
+
matrix:
|
|
25
|
+
python-version: [ "3.9", "3.10", "3.11", "3.12", "3.13", "3.14" ]
|
|
26
|
+
os: [ ubuntu-latest, macos-latest, windows-latest ]
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
31
|
+
uses: actions/setup-python@v4
|
|
32
|
+
with:
|
|
33
|
+
python-version: ${{ matrix.python-version }}
|
|
34
|
+
- name: Install dependencies
|
|
35
|
+
run: |
|
|
36
|
+
python3 -m pip install --upgrade pip
|
|
37
|
+
python3 -m pip install pre-commit
|
|
38
|
+
- name: Run pre-commit hooks
|
|
39
|
+
run: |
|
|
40
|
+
pre-commit run --all-files
|
|
41
|
+
- name: Test install
|
|
42
|
+
run: |
|
|
43
|
+
python -m pip install -U '.[test]'
|
|
44
|
+
- name: Test show usage
|
|
45
|
+
run: pytest -m cli
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# This workflow builds and uploads the Python package to PyPI when a release is created
|
|
2
|
+
|
|
3
|
+
name: Upload Python Package
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
release:
|
|
7
|
+
types: [ created ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
deploy:
|
|
11
|
+
permissions:
|
|
12
|
+
id-token: write
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- name: Set up Python
|
|
17
|
+
uses: actions/setup-python@v5
|
|
18
|
+
with:
|
|
19
|
+
python-version: '3.12'
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@v3
|
|
22
|
+
- name: Build distributions
|
|
23
|
+
run: uv build
|
|
24
|
+
- name: Publish to PyPI
|
|
25
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
26
|
+
with:
|
|
27
|
+
packages-dir: dist
|
|
@@ -1,37 +1,36 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pymobiledevice3
|
|
3
|
-
Version:
|
|
3
|
+
Version: 7.3.0
|
|
4
4
|
Summary: Pure python3 implementation for working with iDevices (iPhone, etc...)
|
|
5
5
|
Author-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
6
6
|
Maintainer-email: doronz88 <doron88@gmail.com>, matan <matan1008@gmail.com>
|
|
7
|
-
License:
|
|
7
|
+
License-Expression: GPL-3.0-or-later
|
|
8
8
|
Project-URL: Homepage, https://github.com/doronz88/pymobiledevice3
|
|
9
9
|
Project-URL: Bug Reports, https://github.com/doronz88/pymobiledevice3/issues
|
|
10
10
|
Keywords: ios,protocol,lockdownd,instruments,automation,cli,afc
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
-
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
13
12
|
Classifier: Programming Language :: Python :: 3
|
|
14
13
|
Classifier: Programming Language :: Python :: 3.9
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.10
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
19
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
20
|
Requires-Python: >=3.9
|
|
21
21
|
Description-Content-Type: text/markdown
|
|
22
22
|
License-File: LICENSE
|
|
23
23
|
Requires-Dist: construct>=2.9.29
|
|
24
|
+
Requires-Dist: construct-typing>=0.7.0
|
|
24
25
|
Requires-Dist: asn1
|
|
25
|
-
Requires-Dist: click
|
|
26
26
|
Requires-Dist: coloredlogs
|
|
27
27
|
Requires-Dist: IPython
|
|
28
28
|
Requires-Dist: bpylist2>=4.0.1
|
|
29
29
|
Requires-Dist: pygments
|
|
30
30
|
Requires-Dist: hexdump
|
|
31
|
-
Requires-Dist: arrow
|
|
32
31
|
Requires-Dist: daemonize
|
|
33
|
-
Requires-Dist: gpxpy
|
|
34
|
-
Requires-Dist: pykdebugparser>=1.2.
|
|
32
|
+
Requires-Dist: gpxpy!=1.6.0,<1.7.0
|
|
33
|
+
Requires-Dist: pykdebugparser>=1.2.7
|
|
35
34
|
Requires-Dist: pyusb>=1.2.1
|
|
36
35
|
Requires-Dist: tqdm
|
|
37
36
|
Requires-Dist: requests
|
|
@@ -40,17 +39,14 @@ Requires-Dist: parameter_decorators
|
|
|
40
39
|
Requires-Dist: packaging
|
|
41
40
|
Requires-Dist: pygnuutils>=0.0.7
|
|
42
41
|
Requires-Dist: cryptography>=41.0.1
|
|
43
|
-
Requires-Dist: pycrashreport>=1.2.
|
|
42
|
+
Requires-Dist: pycrashreport>=1.2.7
|
|
44
43
|
Requires-Dist: fastapi[all]>=0.93.0
|
|
45
44
|
Requires-Dist: uvicorn>=0.15.0
|
|
46
|
-
Requires-Dist: starlette
|
|
47
45
|
Requires-Dist: wsproto
|
|
48
46
|
Requires-Dist: nest_asyncio>=1.5.5
|
|
49
47
|
Requires-Dist: Pillow
|
|
50
48
|
Requires-Dist: inquirer3>=0.6.0
|
|
51
|
-
Requires-Dist: ipsw_parser>=1.
|
|
52
|
-
Requires-Dist: remotezip2
|
|
53
|
-
Requires-Dist: zeroconf>=0.132.2
|
|
49
|
+
Requires-Dist: ipsw_parser>=1.5.0
|
|
54
50
|
Requires-Dist: ifaddr
|
|
55
51
|
Requires-Dist: hyperframe
|
|
56
52
|
Requires-Dist: srptools
|
|
@@ -58,13 +54,14 @@ Requires-Dist: qh3<2,>=1.0.0
|
|
|
58
54
|
Requires-Dist: developer_disk_image>=0.0.2
|
|
59
55
|
Requires-Dist: opack2
|
|
60
56
|
Requires-Dist: psutil
|
|
61
|
-
Requires-Dist: pytun-pmd3>=
|
|
62
|
-
Requires-Dist: aiofiles
|
|
57
|
+
Requires-Dist: pytun-pmd3>=3.0.2
|
|
63
58
|
Requires-Dist: prompt_toolkit
|
|
64
59
|
Requires-Dist: sslpsk-pmd3>=1.0.3; python_version < "3.13"
|
|
65
60
|
Requires-Dist: python-pcapng>=2.1.1
|
|
66
61
|
Requires-Dist: plumbum
|
|
67
|
-
Requires-Dist: pyimg4>=0.8.
|
|
62
|
+
Requires-Dist: pyimg4>=0.8.8
|
|
63
|
+
Requires-Dist: typer>=0.20.0
|
|
64
|
+
Requires-Dist: typer-injector>=0.2.0
|
|
68
65
|
Provides-Extra: test
|
|
69
66
|
Requires-Dist: pytest; extra == "test"
|
|
70
67
|
Requires-Dist: pytest-asyncio; extra == "test"
|
|
@@ -77,6 +74,7 @@ Dynamic: license-file
|
|
|
77
74
|
[](https://pypi.org/project/pymobiledevice3/ "PyPi package")
|
|
78
75
|
[](https://pepy.tech/project/pymobiledevice3)
|
|
79
76
|
[](https://discord.gg/52mZGC3JXJ)
|
|
77
|
+
[](https://deepwiki.com/doronz88/pymobiledevice3)
|
|
80
78
|
<!-- markdownlint-enable MD013 -->
|
|
81
79
|
|
|
82
80
|
- [PyMobileDevice3](#pymobiledevice3)
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
[](https://pypi.org/project/pymobiledevice3/ "PyPi package")
|
|
6
6
|
[](https://pepy.tech/project/pymobiledevice3)
|
|
7
7
|
[](https://discord.gg/52mZGC3JXJ)
|
|
8
|
+
[](https://deepwiki.com/doronz88/pymobiledevice3)
|
|
8
9
|
<!-- markdownlint-enable MD013 -->
|
|
9
10
|
|
|
10
11
|
- [PyMobileDevice3](#pymobiledevice3)
|
|
@@ -7,8 +7,8 @@ import click
|
|
|
7
7
|
from scapy.packet import Packet, Raw
|
|
8
8
|
from scapy.sendrecv import sniff
|
|
9
9
|
|
|
10
|
-
BPLIST_MAGIC = b
|
|
11
|
-
PLIST_MAGIC = b
|
|
10
|
+
BPLIST_MAGIC = b"bplist"
|
|
11
|
+
PLIST_MAGIC = b"<plist"
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class PcapSniffer:
|
|
@@ -20,13 +20,13 @@ class PcapSniffer:
|
|
|
20
20
|
|
|
21
21
|
if BPLIST_MAGIC in packet:
|
|
22
22
|
try:
|
|
23
|
-
plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC):])
|
|
23
|
+
plist = plistlib.loads(packet[packet.find(BPLIST_MAGIC) :])
|
|
24
24
|
self.report(plist)
|
|
25
25
|
except plistlib.InvalidFileException:
|
|
26
26
|
pass
|
|
27
27
|
if PLIST_MAGIC in packet:
|
|
28
28
|
try:
|
|
29
|
-
plist = plistlib.loads(packet[packet.find(PLIST_MAGIC):])
|
|
29
|
+
plist = plistlib.loads(packet[packet.find(PLIST_MAGIC) :])
|
|
30
30
|
self.report(plist)
|
|
31
31
|
except xml.parsers.expat.ExpatError:
|
|
32
32
|
pass
|
|
@@ -35,37 +35,37 @@ class PcapSniffer:
|
|
|
35
35
|
try:
|
|
36
36
|
print(plist)
|
|
37
37
|
if self.file is not None:
|
|
38
|
-
self.file.write(
|
|
38
|
+
self.file.write("---\n")
|
|
39
39
|
self.file.write(pprint.pformat(plist))
|
|
40
|
-
self.file.write(
|
|
40
|
+
self.file.write("\n---\n")
|
|
41
41
|
except ValueError:
|
|
42
|
-
print(
|
|
42
|
+
print("failed to print plist")
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
@click.group()
|
|
46
46
|
def cli():
|
|
47
|
-
"""
|
|
47
|
+
"""Parse RemoteXPC traffic"""
|
|
48
48
|
pass
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
@cli.command()
|
|
52
|
-
@click.argument(
|
|
53
|
-
@click.option(
|
|
52
|
+
@click.argument("pcap", type=click.Path(exists=True, file_okay=True, dir_okay=False))
|
|
53
|
+
@click.option("-o", "--out", type=click.File("wt"))
|
|
54
54
|
def offline(pcap: str, out: IO):
|
|
55
|
-
"""
|
|
55
|
+
"""Parse plists traffic from a .pcap file"""
|
|
56
56
|
sniffer = PcapSniffer(out)
|
|
57
57
|
for p in sniff(offline=pcap):
|
|
58
58
|
sniffer.process_packet(p)
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
@cli.command()
|
|
62
|
-
@click.argument(
|
|
63
|
-
@click.option(
|
|
62
|
+
@click.argument("iface")
|
|
63
|
+
@click.option("-o", "--out", type=click.File("wt"))
|
|
64
64
|
def live(iface: str, out: IO):
|
|
65
|
-
"""
|
|
65
|
+
"""Parse plists live from a given network interface"""
|
|
66
66
|
sniffer = PcapSniffer(out)
|
|
67
67
|
sniff(iface=iface, prn=sniffer.process_packet)
|
|
68
68
|
|
|
69
69
|
|
|
70
|
-
if __name__ ==
|
|
70
|
+
if __name__ == "__main__":
|
|
71
71
|
cli()
|
|
@@ -22,7 +22,7 @@ FRAME_HEADER_SIZE = 9
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
def create_stream_key(src: str, sport: int, dst: str, dport: int) -> str:
|
|
25
|
-
return f
|
|
25
|
+
return f"{src}/{sport}//{dst}/{dport}"
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class TCPStream:
|
|
@@ -37,7 +37,7 @@ class TCPStream:
|
|
|
37
37
|
self.segments = {} # data segments to add later
|
|
38
38
|
|
|
39
39
|
def __repr__(self) -> str:
|
|
40
|
-
return f
|
|
40
|
+
return f"Stream<{self.key}>"
|
|
41
41
|
|
|
42
42
|
def __len__(self) -> int:
|
|
43
43
|
return len(self.data)
|
|
@@ -58,12 +58,12 @@ class TCPStream:
|
|
|
58
58
|
return False
|
|
59
59
|
else:
|
|
60
60
|
# if this data is in order (has a place to be inserted)
|
|
61
|
-
self.data[seq_offset:seq_offset + data_len] = data
|
|
61
|
+
self.data[seq_offset : seq_offset + data_len] = data
|
|
62
62
|
# check if there are any waiting data segments to add
|
|
63
63
|
for seq_offset in sorted(self.segments.keys()):
|
|
64
64
|
if seq_offset <= len(self.data): # if we can add this segment to the stream
|
|
65
65
|
segment_payload = self.segments[seq_offset]
|
|
66
|
-
self.data[seq_offset:seq_offset + len(segment_payload)] = segment_payload
|
|
66
|
+
self.data[seq_offset : seq_offset + len(segment_payload)] = segment_payload
|
|
67
67
|
self.segments.pop(seq_offset)
|
|
68
68
|
else:
|
|
69
69
|
break # short circuit because list is sorted
|
|
@@ -72,12 +72,12 @@ class TCPStream:
|
|
|
72
72
|
|
|
73
73
|
class H2Stream(TCPStream):
|
|
74
74
|
def pop_frames(self) -> list[Frame]:
|
|
75
|
-
"""
|
|
75
|
+
"""Pop all available H2Frames"""
|
|
76
76
|
|
|
77
77
|
# If self.data starts with the http/2 magic bytes, pop them off
|
|
78
78
|
if self.data.startswith(HTTP2_MAGIC):
|
|
79
|
-
logger.debug(
|
|
80
|
-
self.data = self.data[len(HTTP2_MAGIC):]
|
|
79
|
+
logger.debug("HTTP/2 magic bytes")
|
|
80
|
+
self.data = self.data[len(HTTP2_MAGIC) :]
|
|
81
81
|
self.seq += len(HTTP2_MAGIC)
|
|
82
82
|
|
|
83
83
|
frames = []
|
|
@@ -120,13 +120,14 @@ class RemoteXPCSniffer:
|
|
|
120
120
|
tcp_pkt = pkt[TCP]
|
|
121
121
|
stream_key = create_stream_key(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
|
|
122
122
|
stream = self._h2_streams.setdefault(
|
|
123
|
-
stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
|
|
123
|
+
stream_key, H2Stream(net_pkt.src, tcp_pkt.sport, net_pkt.dst, tcp_pkt.dport)
|
|
124
|
+
)
|
|
124
125
|
stream_finished_assembling = stream.add(tcp_pkt)
|
|
125
126
|
if stream_finished_assembling: # if we just added something in order
|
|
126
127
|
self._process_stream(stream)
|
|
127
128
|
|
|
128
129
|
def _handle_data_frame(self, stream: H2Stream, frame: DataFrame) -> None:
|
|
129
|
-
previous_frame_data = self._previous_frame_data.get(stream.key, b
|
|
130
|
+
previous_frame_data = self._previous_frame_data.get(stream.key, b"")
|
|
130
131
|
try:
|
|
131
132
|
payload = XpcWrapper.parse(previous_frame_data + frame.data).message.payload
|
|
132
133
|
if payload is None:
|
|
@@ -134,10 +135,11 @@ class RemoteXPCSniffer:
|
|
|
134
135
|
xpc_message = decode_xpc_object(payload.obj)
|
|
135
136
|
except ConstError: # if we don't know what this payload is
|
|
136
137
|
logger.debug(
|
|
137
|
-
f
|
|
138
|
+
f"New Data frame {stream.src}->{stream.dst} on HTTP/2 stream {frame.stream_id} TCP port {stream.dport}"
|
|
139
|
+
)
|
|
138
140
|
hexdump(frame.data[:64])
|
|
139
141
|
if len(frame.data) > 64:
|
|
140
|
-
logger.debug(f
|
|
142
|
+
logger.debug(f"... {len(frame.data)} bytes")
|
|
141
143
|
return
|
|
142
144
|
except StreamError:
|
|
143
145
|
self._previous_frame_data[stream.key] = previous_frame_data + frame.data
|
|
@@ -149,27 +151,26 @@ class RemoteXPCSniffer:
|
|
|
149
151
|
if xpc_message is None:
|
|
150
152
|
return
|
|
151
153
|
|
|
152
|
-
logger.info(f
|
|
154
|
+
logger.info(f"As Python Object (#{frame.stream_id}): {pformat(xpc_message)}")
|
|
153
155
|
|
|
154
156
|
# print `pairingData` if exists, since it contains an inner struct
|
|
155
|
-
if
|
|
157
|
+
if "value" not in xpc_message:
|
|
156
158
|
return
|
|
157
|
-
message = xpc_message[
|
|
158
|
-
if
|
|
159
|
+
message = xpc_message["value"]["message"]
|
|
160
|
+
if "plain" not in message:
|
|
159
161
|
return
|
|
160
|
-
plain = message[
|
|
161
|
-
if
|
|
162
|
+
plain = message["plain"]["_0"]
|
|
163
|
+
if "event" not in plain:
|
|
162
164
|
return
|
|
163
|
-
pairing_data = plain[
|
|
165
|
+
pairing_data = plain["event"]["_0"]["pairingData"]["_0"]["data"]
|
|
164
166
|
logger.info(PairingDataComponentTLVBuf.parse(pairing_data))
|
|
165
167
|
|
|
166
168
|
def _handle_single_frame(self, stream: H2Stream, frame: Frame) -> None:
|
|
167
|
-
logger.debug(f
|
|
169
|
+
logger.debug(f"New HTTP/2 frame: {stream.key} ({frame})")
|
|
168
170
|
if isinstance(frame, HeadersFrame):
|
|
169
|
-
logger.debug(
|
|
170
|
-
f'{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}')
|
|
171
|
+
logger.debug(f"{stream.src} opening stream {frame.stream_id} for communication on port {stream.dport}")
|
|
171
172
|
elif isinstance(frame, GoAwayFrame):
|
|
172
|
-
logger.debug(f
|
|
173
|
+
logger.debug(f"{stream.src} closing stream {frame.stream_id} on port {stream.sport}")
|
|
173
174
|
elif isinstance(frame, DataFrame):
|
|
174
175
|
self._handle_data_frame(stream, frame)
|
|
175
176
|
|
|
@@ -180,27 +181,27 @@ class RemoteXPCSniffer:
|
|
|
180
181
|
|
|
181
182
|
@click.group()
|
|
182
183
|
def cli():
|
|
183
|
-
"""
|
|
184
|
+
"""Parse RemoteXPC traffic"""
|
|
184
185
|
pass
|
|
185
186
|
|
|
186
187
|
|
|
187
188
|
@cli.command()
|
|
188
|
-
@click.argument(
|
|
189
|
+
@click.argument("file", type=click.Path(exists=True, file_okay=True, dir_okay=False))
|
|
189
190
|
def offline(file: str):
|
|
190
|
-
"""
|
|
191
|
+
"""Parse RemoteXPC traffic from a .pcap file"""
|
|
191
192
|
sniffer = RemoteXPCSniffer()
|
|
192
193
|
for p in sniff(offline=file):
|
|
193
194
|
sniffer.process_packet(p)
|
|
194
195
|
|
|
195
196
|
|
|
196
197
|
@cli.command()
|
|
197
|
-
@click.argument(
|
|
198
|
+
@click.argument("iface")
|
|
198
199
|
def live(iface: str):
|
|
199
|
-
"""
|
|
200
|
+
"""Parse RemoteXPC live from a given network interface"""
|
|
200
201
|
sniffer = RemoteXPCSniffer()
|
|
201
202
|
sniff(iface=iface, prn=sniffer.process_packet)
|
|
202
203
|
|
|
203
204
|
|
|
204
|
-
if __name__ ==
|
|
205
|
+
if __name__ == "__main__":
|
|
205
206
|
coloredlogs.install(level=logging.DEBUG)
|
|
206
207
|
cli()
|
{pymobiledevice3-4.20.21 → pymobiledevice3-7.3.0}/misc/understanding_idevice_protocol_layers.md
RENAMED
|
@@ -287,14 +287,14 @@ pymobiledevice3 developer dvt launch com.apple.mobilesafari
|
|
|
287
287
|
|
|
288
288
|
## DVT
|
|
289
289
|
|
|
290
|
-
One of the more interesting developer services
|
|
290
|
+
One of the more interesting developer services is the one exposed by `DTServiceHub`. It is using DTX protocol messages,
|
|
291
291
|
but since it mainly wraps and allows access to stuff in `DVTFoundation.framework` we called it DVT in our
|
|
292
292
|
implementation (probably standing for DeveloperTools).
|
|
293
293
|
|
|
294
294
|
We don't delve too much into this protocol, but we'll say in general it allows us to invoke a whitelist of ObjC methods
|
|
295
295
|
in different ObjC objects. The terminology used by DVT to each such ObjC object is called "channels".
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
To access this different object use the following APIs:
|
|
298
298
|
|
|
299
299
|
```python
|
|
300
300
|
from pymobiledevice3.lockdown import create_using_usbmux
|
|
@@ -313,17 +313,22 @@ dvt_channel = Screenshot(dvt)
|
|
|
313
313
|
open('/tmp/screen.png', 'wb').write(dvt_channel.get_screenshot())
|
|
314
314
|
```
|
|
315
315
|
|
|
316
|
-
Looking for an unimplemented feature/channel? Feel free to play with it (and submit a PR
|
|
316
|
+
Looking for an unimplemented feature/channel? Feel free to play with it (and submit a PR afterward 🙏) using the
|
|
317
317
|
following shell:
|
|
318
318
|
|
|
319
319
|
```shell
|
|
320
320
|
pymobiledevice3 developer dvt shell
|
|
321
321
|
```
|
|
322
322
|
|
|
323
|
+
> **NOTE:** The full list of the methods that can be invoked on a DVT channel can be found by looking at all ObjC
|
|
324
|
+
> classes in `DVTInstrumentsFoundation.framework` implementing the `DTXAllowedRPC` protocol.
|
|
325
|
+
> There is an existing [Anubis rule](https://github.com/netanelc305/anubis/blob/9da337178ebd7e9f168e9df2d82b192eba4f1b30/example_rules.yaml#L14-L17)
|
|
326
|
+
> I use to diff new methods against the existing ones.
|
|
327
|
+
|
|
323
328
|
## RemoteXPC
|
|
324
329
|
|
|
325
330
|
Starting at iOS 17.0, Apple made a large refactor in the manner we all interact with the developer services. There can
|
|
326
|
-
be multiple reasons for that decision, but in general
|
|
331
|
+
be multiple reasons for that decision, but in general these refactor main key points are:
|
|
327
332
|
|
|
328
333
|
- Create a single standard for interacting with the new lockdown services (XPC Messages, Apple's proprietary IPC)
|
|
329
334
|
- Optimize the protocol for large file transfers (such as the dyld_shared_cache)
|
|
@@ -347,10 +352,10 @@ Since all this communication is IP-based, but without any additional exported TC
|
|
|
347
352
|
help us here. Instead, starting at iOS 16.0, when connecting an iDevice, it exports another non-standard USB-Ethernet
|
|
348
353
|
adapter (with IPv6 link-local address), placing us in a subnet with the device's `remoted`.
|
|
349
354
|
|
|
350
|
-
As we've said this communication is non-standard
|
|
355
|
+
As we've said, this communication is non-standard and requires either:
|
|
351
356
|
|
|
352
357
|
- macOS Monterey or higher
|
|
353
|
-
- Special driver on your linux/
|
|
358
|
+
- Special driver on your linux/Windows machine
|
|
354
359
|
|
|
355
360
|
> **Spoiler Alert:** Apple may have regretted this, since starting at iOS 17.4, they added the `CodeDeviceProxy` - a new
|
|
356
361
|
> lockdown service, allowing us skip all the steps this special driver is required for.
|