pymobiledevice3 6.1.5__tar.gz → 6.2.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-6.1.5 → pymobiledevice3-6.2.0}/PKG-INFO +2 -1
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/understanding_idevice_protocol_layers.md +10 -5
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/_version.py +3 -3
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/developer.py +86 -1
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/afc.py +239 -215
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/mobilebackup2.py +2 -2
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/PKG-INFO +2 -1
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/requires.txt +1 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pyproject.toml +3 -1
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/requirements.txt +1 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_afc.py +8 -8
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.gitattributes +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/FUNDING.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/pull_request_template.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/workflows/codeql.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/workflows/generate-executable.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/workflows/markdown-lint.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/workflows/python-app.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.github/workflows/python-publish.yml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.gitignore +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/.pre-commit-config.yaml +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/CODE_OF_CONDUCT.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/CONTRIBUTING.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/LICENSE +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/README.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/example.gif +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/markdownlint-config.json +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/DTServices-14.2.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/DTServices-14.5.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/RemoteXPC.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/plist_sniffer.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/pyinstaller.md +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/remotexpc_sniffer.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/misc/usbmux_sniff.sh +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/__main__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/bonjour.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/ca.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/activation.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/afc.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/amfi.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/apps.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/backup.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/bonjour.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/cli_common.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/companion_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/completions.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/crash.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/diagnostics.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/idam.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/lockdown.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/mounter.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/notification.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/pcap.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/power_assertion.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/processes.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/profile.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/provision.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/remote.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/restore.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/springboard.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/syslog.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/usbmux.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/version.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/cli/webinspector.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/common.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/exceptions.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/irecv.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/irecv_devices.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/lockdown.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/lockdown_service_provider.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/osu/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/osu/os_utils.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/osu/posix_util.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/osu/win_util.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/pair_records.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/common.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/app_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/core_device_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/device_info.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/diagnostics_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/core_device/file_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/module_imports.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/remote_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/remote_service_discovery.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/remotexpc.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/tunnel_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/utils.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/remote/xpc_message.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/dsc_uuid_map.json +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/dsc_uuid_map.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/firmware_notifications.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/notifications.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/element_attribute.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/element_clear.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/enter_fullscreen.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/find_nodes.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/focus.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/get_attribute.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/is_displayed.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/is_editable.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/resources/webinspector/is_enabled.js +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/asr.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/base_restore.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/consts.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/device.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/fdr.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/ftab.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/img4.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/mbn.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/recovery.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/restore.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/restore_options.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/restored_client.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/restore/tss.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/service_connection.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/accessibilityaudit.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/amfi.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/companion.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/crash_reports.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/debugserver_applist.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/device_arbitration.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/device_link.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/diagnostics.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dtfetchsymbols.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/dvt_secure_socket_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/dvt_testmanaged_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/activity_trace_tap.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/application_listing.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/condition_inducer.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/core_profile_session_tap.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/device_info.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/energy_monitor.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/graphics.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/location_simulation.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/location_simulation_base.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/network_monitor.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/notifications.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/process_control.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/screenshot.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/instruments/sysmontap.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/dvt/testmanaged/xcuitest.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/file_relay.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/heartbeat.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/house_arrest.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/idam.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/installation_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/lockdown_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/misagent.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/mobile_activation.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/mobile_config.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/mobile_image_mounter.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/notification_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/os_trace.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/pcapd.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/power_assertion.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/preboard.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/remote_fetch_symbols.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/remote_server.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/restore_service.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/screenshot.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/simulate_location.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/springboard.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/syslog.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/alert.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/automation_session.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/cdp_screencast.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/cdp_server.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/cdp_target.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/driver.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/element.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/inspector_session.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/selenium_api.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/session_protocol.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/web_protocol/switch_to.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/services/webinspector.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/tcp_forwarder.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/tunneld/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/tunneld/api.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/tunneld/server.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/usbmux.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3/utils.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/SOURCES.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/dependency_links.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/entry_points.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pymobiledevice3.egg-info/top_level.txt +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/pytest.ini +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/setup.cfg +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/cli/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/cli/test_cli.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/conftest.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/test_core_profile_session.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/test_dvt_secure_socket_proxy.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/test_fetch_symbols.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/test_location.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/instruments/test_screenshot.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_accessibility.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_apps.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_backup2.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_bonjour.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_crash_reports.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_house_arrest.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_list_devices.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_lockdown.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_pcapd.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_springboard_services_relay.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_start_tunnel.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_syslog_relay.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_tcp_forwarder.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_web_protocol/__init__.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_web_protocol/common.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_web_protocol/conftest.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_web_protocol/test_driver.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_web_protocol/test_element.py +0 -0
- {pymobiledevice3-6.1.5 → pymobiledevice3-6.2.0}/tests/services/test_webinspector.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pymobiledevice3
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.2.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>
|
|
@@ -21,6 +21,7 @@ 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
26
|
Requires-Dist: click
|
|
26
27
|
Requires-Dist: coloredlogs
|
{pymobiledevice3-6.1.5 → pymobiledevice3-6.2.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,7 +352,7 @@ 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
358
|
- Special driver on your linux/Windows machine
|
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '6.
|
|
32
|
-
__version_tuple__ = version_tuple = (6,
|
|
31
|
+
__version__ = version = '6.2.0'
|
|
32
|
+
__version_tuple__ = version_tuple = (6, 2, 0)
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g54f93648f'
|
|
@@ -13,7 +13,7 @@ import sys
|
|
|
13
13
|
import time
|
|
14
14
|
from collections import namedtuple
|
|
15
15
|
from dataclasses import asdict
|
|
16
|
-
from datetime import datetime
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import IO, Optional
|
|
19
19
|
|
|
@@ -419,6 +419,91 @@ def sysmon_process_single(service_provider: LockdownClient, attributes: list[str
|
|
|
419
419
|
print_json(result)
|
|
420
420
|
|
|
421
421
|
|
|
422
|
+
@sysmon_process.command("monitor-single", cls=Command)
|
|
423
|
+
@click.option(
|
|
424
|
+
"-a",
|
|
425
|
+
"--attributes",
|
|
426
|
+
multiple=True,
|
|
427
|
+
help="filter processes by attribute (key=value). Multiple filters on same attribute use OR logic, different attributes use AND.",
|
|
428
|
+
)
|
|
429
|
+
@click.option(
|
|
430
|
+
"-o",
|
|
431
|
+
"--output",
|
|
432
|
+
type=click.Path(),
|
|
433
|
+
default=None,
|
|
434
|
+
help="output file path for JSONL format (optional, defaults to stdout)",
|
|
435
|
+
)
|
|
436
|
+
@click.option(
|
|
437
|
+
"-i", "--interval", type=click.INT, default=None, help="minimum interval in milliseconds between outputs (optional)"
|
|
438
|
+
)
|
|
439
|
+
@click.option(
|
|
440
|
+
"-d",
|
|
441
|
+
"--duration",
|
|
442
|
+
type=click.INT,
|
|
443
|
+
default=None,
|
|
444
|
+
help="maximum duration in milliseconds to run monitoring (optional)",
|
|
445
|
+
)
|
|
446
|
+
def sysmon_process_monitor_single(
|
|
447
|
+
service_provider: LockdownClient,
|
|
448
|
+
attributes: list[str],
|
|
449
|
+
output: Optional[str],
|
|
450
|
+
interval: Optional[int],
|
|
451
|
+
duration: Optional[int],
|
|
452
|
+
):
|
|
453
|
+
"""Continuously monitor a single process with comprehensive metrics."""
|
|
454
|
+
count = 0
|
|
455
|
+
start_time = None
|
|
456
|
+
|
|
457
|
+
# Parse attributes into grouped filters: same attribute uses OR, different attributes use AND
|
|
458
|
+
parsed_filters: dict[str, list[str]] = {}
|
|
459
|
+
if attributes:
|
|
460
|
+
for raw in attributes:
|
|
461
|
+
key, value = raw.split("=", 1)
|
|
462
|
+
parsed_filters.setdefault(key, []).append(value)
|
|
463
|
+
|
|
464
|
+
def matches_filters(proc: dict) -> bool:
|
|
465
|
+
"""Check if process matches all filter criteria."""
|
|
466
|
+
if not parsed_filters:
|
|
467
|
+
return True
|
|
468
|
+
return all(str(proc.get(key)) in values for key, values in parsed_filters.items())
|
|
469
|
+
|
|
470
|
+
with contextlib.ExitStack() as stack:
|
|
471
|
+
output_file = stack.enter_context(open(output, "w")) if output else None
|
|
472
|
+
|
|
473
|
+
dvt = stack.enter_context(DvtSecureSocketProxyService(lockdown=service_provider))
|
|
474
|
+
sysmon = stack.enter_context(Sysmontap(dvt))
|
|
475
|
+
|
|
476
|
+
for process_snapshot in sysmon.iter_processes():
|
|
477
|
+
count += 1
|
|
478
|
+
|
|
479
|
+
if count < 2:
|
|
480
|
+
continue
|
|
481
|
+
|
|
482
|
+
if start_time is None:
|
|
483
|
+
start_time = time.time()
|
|
484
|
+
|
|
485
|
+
if duration is not None:
|
|
486
|
+
elapsed_ms = (time.time() - start_time) * 1000
|
|
487
|
+
if elapsed_ms >= duration:
|
|
488
|
+
break
|
|
489
|
+
|
|
490
|
+
for process in process_snapshot:
|
|
491
|
+
if not matches_filters(process):
|
|
492
|
+
continue
|
|
493
|
+
|
|
494
|
+
process["timestamp"] = datetime.now(timezone.utc).isoformat()
|
|
495
|
+
|
|
496
|
+
if output_file:
|
|
497
|
+
json_output = json.dumps(process, default=default_json_encoder)
|
|
498
|
+
output_file.write(json_output + "\n")
|
|
499
|
+
output_file.flush()
|
|
500
|
+
else:
|
|
501
|
+
print_json(process)
|
|
502
|
+
|
|
503
|
+
if interval:
|
|
504
|
+
time.sleep(interval / 1000.0)
|
|
505
|
+
|
|
506
|
+
|
|
422
507
|
@sysmon.command("system", cls=Command)
|
|
423
508
|
@click.option("-f", "--fields", help='field names splitted by ",".')
|
|
424
509
|
def sysmon_system(service_provider: LockdownClient, fields):
|