Remove Hardcoded Pairing File

This commit is contained in:
Stossy11 2025-03-28 06:22:56 +11:00
parent 1e3dcb4e16
commit ea4e77d1c5
8 changed files with 484 additions and 576 deletions

View file

@ -23,19 +23,16 @@ struct HeartbeatApp: App {
}
}
startProxy()
startHeartbeatInBackground()
if FileManager.default.fileExists(atPath: URL.documentsDirectory.appendingPathComponent("pairingFile.plist").path) {
startHeartbeatInBackground()
}
}
} else {
MainTabView()
}
}
}
func startHeartbeatInBackground() {
DispatchQueue.global(qos: .background).async {
startHeartbeat()
}
}
func startProxy() {
let port = 51820
@ -55,6 +52,18 @@ struct HeartbeatApp: App {
}
}
func startHeartbeatInBackground() {
let heartBeat = Thread {
startHeartbeat()
}
heartBeat.qualityOfService = .background
heartBeat.name = "HeartBeat"
heartBeat.start()
}
struct LoadingView: View {
@State private var animate = false

View file

@ -15,10 +15,11 @@ struct HomeView: View {
@AppStorage("bundleID") private var bundleID: String = ""
@State private var isProcessing = false
@State private var isShowingInstalledApps = false
@State private var isShowingPairingFilePicker = false
var body: some View {
ZStack {
selectedBackgroundColor .edgesIgnoringSafeArea(.all)
selectedBackgroundColor.edgesIgnoringSafeArea(.all)
VStack(spacing: 25) {
Spacer()
@ -35,7 +36,11 @@ struct HomeView: View {
.padding(.top, 40)
Button(action: {
isShowingInstalledApps = true
if !FileManager.default.fileExists(atPath: URL.documentsDirectory.appendingPathComponent("pairingFile.plist").path) {
isShowingPairingFilePicker = true
} else {
isShowingInstalledApps = true
}
}) {
Label("Enable JIT", systemImage: "list.bullet")
.font(.system(.title3, design: .rounded))
@ -56,6 +61,38 @@ struct HomeView: View {
.onReceive(timer) { _ in
refreshBackground()
}
.fileImporter(isPresented: $isShowingPairingFilePicker, allowedContentTypes: [.item]) {result in
switch result {
case .success(let url):
let fileManager = FileManager.default
let accessing = url.startAccessingSecurityScopedResource()
if fileManager.fileExists(atPath: url.path) {
do {
if fileManager.fileExists(atPath: URL.documentsDirectory.appendingPathComponent("pairingFile.plist").path) {
try fileManager.removeItem(at: URL.documentsDirectory.appendingPathComponent("pairingFile.plist"))
}
try fileManager.copyItem(at: url, to: URL.documentsDirectory.appendingPathComponent("pairingFile.plist"))
print("File copied successfully!")
startHeartbeatInBackground()
Thread.sleep(forTimeInterval: 5)
} catch {
print("Error copying file: \(error)")
}
} else {
print("Source file does not exist.")
}
if accessing {
url.stopAccessingSecurityScopedResource()
}
case .failure(_):
print("Failed")
}
}
.sheet(isPresented: $isShowingInstalledApps) {
InstalledAppsListView { selectedBundle in
bundleID = selectedBundle
@ -78,12 +115,7 @@ struct HomeView: View {
return
}
var args: [UnsafeMutablePointer<Int8>?] = [cBundleID]
let argc = Int32(args.count)
args.withUnsafeMutableBufferPointer { buffer in
_ = jitMain(argc, buffer.baseAddress)
}
_ = debug_app(cBundleID)
free(cBundleID)
DispatchQueue.main.async {

View file

@ -11,6 +11,7 @@ struct SettingsView: View {
@AppStorage("username") private var username = "User"
@AppStorage("customBackgroundColor") private var customBackgroundColorHex: String = Color.primaryBackground.toHex() ?? "#000000"
@AppStorage("selectedAppIcon") private var selectedAppIcon: String = "AppIcon"
@State private var isShowingPairingFilePicker = false
@State private var selectedBackgroundColor: Color = Color.primaryBackground
@State private var showIconPopover = false
@ -47,6 +48,18 @@ struct SettingsView: View {
.listRowBackground(Color.cardBackground)
.foregroundColor(.primaryText)
}
Section(header: Text("Pairing File").font(.headline).foregroundColor(.primaryText)) {
HStack {
Button {
isShowingPairingFilePicker = true
} label: {
Text("Import New Pairing File")
}
Spacer()
}
.listRowBackground(Color.cardBackground)
}
Section(header: Text("About").font(.headline).foregroundColor(.primaryText)) {
HStack {
@ -98,6 +111,38 @@ struct SettingsView: View {
.font(.bodyFont)
.accentColor(.accentColor)
}
.fileImporter(isPresented: $isShowingPairingFilePicker, allowedContentTypes: [.item]) {result in
switch result {
case .success(let url):
let fileManager = FileManager.default
let accessing = url.startAccessingSecurityScopedResource()
if fileManager.fileExists(atPath: url.path) {
do {
if fileManager.fileExists(atPath: URL.documentsDirectory.appendingPathComponent("pairingFile.plist").path) {
try fileManager.removeItem(at: URL.documentsDirectory.appendingPathComponent("pairingFile.plist"))
}
try fileManager.copyItem(at: url, to: URL.documentsDirectory.appendingPathComponent("pairingFile.plist"))
print("File copied successfully!")
startHeartbeatInBackground()
Thread.sleep(forTimeInterval: 5)
} catch {
print("Error copying file: \(error)")
}
} else {
print("Source file does not exist.")
}
if accessing {
url.stopAccessingSecurityScopedResource()
}
case .failure(_):
print("Failed")
}
}
.onAppear {
loadCustomBackgroundColor()
}

View file

@ -22,21 +22,18 @@ char *list_installed_apps() {
return strdup("Error: Invalid IP address");
}
CFURLRef pairingFileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
CFSTR("pairing_file"),
CFSTR("plist"),
NULL);
if (pairingFileURL == NULL) {
return strdup("Error: Pairing file not found");
char pairingFilePath[1024];
CFURLRef url = CFCopyHomeDirectoryURL();
if (url) {
CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
if (path) {
CFStringGetCString(path, pairingFilePath, sizeof(pairingFilePath), kCFStringEncodingUTF8);
strncat(pairingFilePath, "/Documents/pairingFile.plist", sizeof(pairingFilePath) - strlen(pairingFilePath) - 1);
CFRelease(path);
}
CFRelease(url);
}
char pairingFilePath[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(pairingFileURL, TRUE, (UInt8 *)pairingFilePath, PATH_MAX)) {
CFRelease(pairingFileURL);
return strdup("Error: Pairing file path conversion failed");
}
CFRelease(pairingFileURL);
IdevicePairingFile *pairing_file = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing_file);
if (err != IdeviceSuccess) {

View file

@ -8,92 +8,86 @@
#include <string.h>
#include <sys/_types/_u_int64_t.h>
#include <CoreFoundation/CoreFoundation.h>
#include <limits.h>
#include <limits.h>
void startHeartbeat() {
printf("DEBUG: Initializing logger...\n");
idevice_init_logger(Debug, Disabled, NULL);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
if (inet_pton(AF_INET, "10.7.0.1", &addr.sin_addr) <= 0) {
fprintf(stderr, "DEBUG: Error converting IP address.\n");
return;
}
printf("DEBUG: Socket address created for IP 10.7.0.1 on port %d.\n", LOCKDOWN_PORT);
printf("DEBUG: Searching the app bundle for pairing_file.plist...\n");
CFURLRef pairingFileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
CFSTR("pairing_file"),
CFSTR("plist"),
NULL);
if (pairingFileURL == NULL) {
fprintf(stderr, "DEBUG: Pairing file not found in the app bundle.\n");
return;
}
char pairingFilePath[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(pairingFileURL, TRUE, (UInt8 *)pairingFilePath, PATH_MAX)) {
fprintf(stderr, "DEBUG: Error converting pairing file URL to file system representation.\n");
CFRelease(pairingFileURL);
return;
}
CFRelease(pairingFileURL);
printf("DEBUG: Pairing file found at path: %s\n", pairingFilePath);
printf("DEBUG: Reading pairing file...\n");
IdevicePairingFile *pairing_file = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing_file);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to read pairing file: %d\n", err);
return;
}
printf("DEBUG: Pairing file read successfully.\n");
printf("DEBUG: Creating TCP provider...\n");
TcpProviderHandle *provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing_file,
"ExampleProvider", &provider);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to create TCP provider: %d\n", err);
idevice_pairing_file_free(pairing_file);
return;
}
printf("DEBUG: TCP provider created successfully.\n");
printf("DEBUG: Connecting to installation proxy...\n");
HeartbeatClientHandle *client = NULL;
err = heartbeat_connect_tcp(provider, &client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to connect to installation proxy: %d\n", err);
printf("DEBUG: Initializing logger...\n");
idevice_init_logger(Debug, Disabled, NULL);
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
if (inet_pton(AF_INET, "10.7.0.1", &addr.sin_addr) <= 0) {
fprintf(stderr, "DEBUG: Error converting IP address.\n");
return;
}
printf("DEBUG: Socket address created for IP 10.7.0.1 on port %d.\n", LOCKDOWN_PORT);
printf("DEBUG: Searching the app bundle for pairing_file.plist...\n");
char pairingFilePath[1024];
CFURLRef url = CFCopyHomeDirectoryURL();
if (url) {
CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
if (path) {
CFStringGetCString(path, pairingFilePath, sizeof(pairingFilePath), kCFStringEncodingUTF8);
strncat(pairingFilePath, "/Documents/pairingFile.plist", sizeof(pairingFilePath) - strlen(pairingFilePath) - 1);
CFRelease(path);
}
CFRelease(url);
}
printf("Pairing file found at path: %s\n", pairingFilePath);
printf("DEBUG: Reading pairing file...\n");
IdevicePairingFile *pairing_file = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing_file);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to read pairing file: %d\n", err);
return;
}
printf("DEBUG: Pairing file read successfully.\n");
printf("DEBUG: Creating TCP provider...\n");
TcpProviderHandle *provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing_file,
"ExampleProvider", &provider);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to create TCP provider: %d\n", err);
idevice_pairing_file_free(pairing_file);
return;
}
printf("DEBUG: TCP provider created successfully.\n");
printf("DEBUG: Connecting to installation proxy...\n");
HeartbeatClientHandle *client = NULL;
err = heartbeat_connect_tcp(provider, &client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to connect to installation proxy: %d\n", err);
return;
}
tcp_provider_free(provider);
return;
}
tcp_provider_free(provider);
printf("DEBUG: Connected to installation proxy successfully.\n");
u_int64_t current_interval = 15;
while (1) {
u_int64_t new_interval = 0;
printf("DEBUG: Sending heartbeat with current interval: %llu seconds...\n", current_interval);
err = heartbeat_get_marco(client, current_interval, &new_interval);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to get marco: %d\n", err);
heartbeat_client_free(client);
return;
printf("DEBUG: Connected to installation proxy successfully.\n");
u_int64_t current_interval = 15;
while (1) {
u_int64_t new_interval = 0;
printf("DEBUG: Sending heartbeat with current interval: %llu seconds...\n", current_interval);
err = heartbeat_get_marco(client, current_interval, &new_interval);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to get marco: %d\n", err);
heartbeat_client_free(client);
return;
}
printf("DEBUG: Received new interval: %llu seconds.\n", new_interval);
current_interval = new_interval + 5;
printf("DEBUG: Sending polo reply...\n");
err = heartbeat_send_polo(client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to send polo: %d\n", err);
heartbeat_client_free(client);
return;
}
printf("DEBUG: Polo reply sent successfully.\n");
}
printf("DEBUG: Received new interval: %llu seconds.\n", new_interval);
current_interval = new_interval + 5;
printf("DEBUG: Sending polo reply...\n");
err = heartbeat_send_polo(client);
if (err != IdeviceSuccess) {
fprintf(stderr, "DEBUG: Failed to send polo: %d\n", err);
heartbeat_client_free(client);
return;
}
printf("DEBUG: Polo reply sent successfully.\n");
}
}

View file

@ -17,309 +17,299 @@
#include <CoreFoundation/CoreFoundation.h>
#include <limits.h>
int jitMain(int argc, char **argv) {
// Initialize logger
idevice_init_logger(Debug, Disabled, NULL);
if (argc < 1) {
fprintf(stderr, "Usage: <bundle_id>\n");
return 1;
}
const char *bundle_id = argv[0];
// Hardcode device IP
const char *device_ip = "10.7.0.1";
/*****************************************************************
* Locate pairing file in app bundle
*****************************************************************/
printf("=== Searching for pairing_file.plist in app bundle ===\n");
CFURLRef pairingFileURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(),
CFSTR("pairing_file"),
CFSTR("plist"),
NULL);
if (pairingFileURL == NULL) {
fprintf(stderr, "Pairing file not found in the app bundle.\n");
return 1;
}
char pairingFilePath[PATH_MAX];
if (!CFURLGetFileSystemRepresentation(pairingFileURL, TRUE, (UInt8 *)pairingFilePath, PATH_MAX)) {
fprintf(stderr, "Error converting pairing file URL to file system representation.\n");
CFRelease(pairingFileURL);
return 1;
}
CFRelease(pairingFileURL);
printf("Pairing file found at path: %s\n", pairingFilePath);
/*****************************************************************
* CoreDeviceProxy Setup
*****************************************************************/
printf("=== Setting up CoreDeviceProxy ===\n");
// Create socket address
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
if (inet_pton(AF_INET, device_ip, &addr.sin_addr) != 1) {
fprintf(stderr, "Invalid IP address\n");
return 1;
}
// Read pairing file from the bundle
IdevicePairingFile *pairing = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to read pairing file: %d\n", err);
return 1;
}
// Create TCP provider
TcpProviderHandle *tcp_provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing,
"ProcessDebugTest", &tcp_provider);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create TCP provider: %d\n", err);
idevice_pairing_file_free(pairing);
return 1;
}
// Connect to CoreDeviceProxy
CoreDeviceProxyHandle *core_device = NULL;
err = core_device_proxy_connect_tcp(tcp_provider, &core_device);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to CoreDeviceProxy: %d\n", err);
tcp_provider_free(tcp_provider);
return 1;
}
tcp_provider_free(tcp_provider);
// Get server RSD port
uint16_t rsd_port;
err = core_device_proxy_get_server_rsd_port(core_device, &rsd_port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get server RSD port: %d\n", err);
core_device_proxy_free(core_device);
return 1;
}
printf("Server RSD Port: %d\n", rsd_port);
/*****************************************************************
* Create TCP Tunnel Adapter
*****************************************************************/
printf("\n=== Creating TCP Tunnel Adapter ===\n");
AdapterHandle *adapter = NULL;
err = core_device_proxy_create_tcp_adapter(core_device, &adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create TCP adapter: %d\n", err);
core_device_proxy_free(core_device);
return 1;
}
// Connect to RSD port
err = adapter_connect(adapter, rsd_port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to RSD port: %d\n", err);
adapter_free(adapter);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to RSD port\n");
/*****************************************************************
* XPC Device Setup
*****************************************************************/
printf("\n=== Setting up XPC Device ===\n");
XPCDeviceAdapterHandle *xpc_device = NULL;
err = xpc_device_new(adapter, &xpc_device);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create XPC device: %d\n", err);
adapter_free(adapter);
core_device_proxy_free(core_device);
return 1;
}
// Get DebugProxy service
XPCServiceHandle *debug_service = NULL;
err = xpc_device_get_service(xpc_device, "com.apple.internal.dt.remote.debugproxy", &debug_service);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get debug proxy service: %d\n", err);
return 1;
}
// Get ProcessControl service
XPCServiceHandle *pc_service = NULL;
err = xpc_device_get_service(xpc_device, "com.apple.instruments.dtservicehub", &pc_service);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get process control service: %d\n", err);
xpc_device_free(xpc_device);
core_device_proxy_free(core_device);
return 1;
}
/*****************************************************************
* Process Control - Launch App
*****************************************************************/
printf("\n=== Launching App ===\n");
// Get the adapter back from the XPC device
AdapterHandle *pc_adapter = NULL;
err = xpc_device_adapter_into_inner(xpc_device, &pc_adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to extract adapter: %d\n", err);
xpc_device_free(xpc_device);
core_device_proxy_free(core_device);
return 1;
}
// Connect to process control port
err = adapter_connect(pc_adapter, pc_service->port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to process control port: %d\n", err);
adapter_free(pc_adapter);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to process control port\n");
// Create RemoteServerClient
RemoteServerAdapterHandle *remote_server = NULL;
err = remote_server_adapter_new(pc_adapter, &remote_server);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create remote server: %d\n", err);
adapter_free(pc_adapter);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Create ProcessControlClient
ProcessControlAdapterHandle *process_control = NULL;
err = process_control_new(remote_server, &process_control);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create process control client: %d\n", err);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Launch application
uint64_t pid;
err = process_control_launch_app(process_control, bundle_id, NULL, 0, NULL, 0,
true, false, &pid);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to launch app: %d\n", err);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully launched app with PID: %" PRIu64 "\n", pid);
/*****************************************************************
* Debug Proxy - Attach to Process
*****************************************************************/
printf("\n=== Attaching Debugger ===\n");
// Get the adapter back from the remote server
AdapterHandle *debug_adapter = NULL;
err = remote_server_adapter_into_inner(remote_server, &debug_adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to extract adapter: %d\n", err);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Connect to debug proxy port
err = adapter_connect(debug_adapter, debug_service->port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to debug proxy port: %d\n", err);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to debug proxy port\n");
// Create DebugProxyClient
DebugProxyAdapterHandle *debug_proxy = NULL;
err = debug_proxy_adapter_new(debug_adapter, &debug_proxy);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create debug proxy client: %d\n", err);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Send vAttach command with PID in hex
char attach_command[64];
snprintf(attach_command, sizeof(attach_command), "vAttach;%" PRIx64, pid);
DebugserverCommandHandle *attach_cmd = debugserver_command_new(attach_command, NULL, 0);
if (attach_cmd == NULL) {
fprintf(stderr, "Failed to create attach command\n");
debug_proxy_free(debug_proxy);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
char *attach_response = NULL;
err = debug_proxy_send_command(debug_proxy, attach_cmd, &attach_response);
debugserver_command_free(attach_cmd);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to attach to process: %d\n", err);
} else if (attach_response != NULL) {
printf("Attach response: %s\n", attach_response);
idevice_string_free(attach_response);
}
// Send detach command
DebugserverCommandHandle *detach_cmd = debugserver_command_new("D", NULL, 0);
if (detach_cmd == NULL) {
fprintf(stderr, "Failed to create detach command\n");
} else {
char *detach_response = NULL;
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
debugserver_command_free(detach_cmd);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to detach from process: %d\n", err);
} else if (detach_response != NULL) {
printf("Detach response: %s\n", detach_response);
idevice_string_free(detach_response);
int debug_app(const char *bundle_id) {
// Initialize logger
idevice_init_logger(Debug, Disabled, NULL);
// Hardcode device IP
const char *device_ip = "10.7.0.1";
/*****************************************************************
* Locate pairing file in app bundle
*****************************************************************/
char pairingFilePath[1024];
CFURLRef url = CFCopyHomeDirectoryURL();
if (url) {
CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
if (path) {
CFStringGetCString(path, pairingFilePath, sizeof(pairingFilePath), kCFStringEncodingUTF8);
strncat(pairingFilePath, "/Documents/pairingFile.plist", sizeof(pairingFilePath) - strlen(pairingFilePath) - 1);
CFRelease(path);
}
CFRelease(url);
}
}
/*****************************************************************
* Cleanup
*****************************************************************/
debug_proxy_free(debug_proxy);
xpc_service_free(debug_service);
printf("\nDebug session completed\n");
return 0;
printf("Pairing file found at path: %s\n", pairingFilePath);
/*****************************************************************
* CoreDeviceProxy Setup
*****************************************************************/
printf("=== Setting up CoreDeviceProxy ===\n");
// Create socket address
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
if (inet_pton(AF_INET, device_ip, &addr.sin_addr) != 1) {
fprintf(stderr, "Invalid IP address\n");
return 1;
}
// Read pairing file from the bundle
IdevicePairingFile *pairing = NULL;
IdeviceErrorCode err = idevice_pairing_file_read(pairingFilePath, &pairing);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to read pairing file: %d\n", err);
return 1;
}
// Create TCP provider
TcpProviderHandle *tcp_provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing,
"ProcessDebugTest", &tcp_provider);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create TCP provider: %d\n", err);
idevice_pairing_file_free(pairing);
return 1;
}
// Connect to CoreDeviceProxy
CoreDeviceProxyHandle *core_device = NULL;
err = core_device_proxy_connect_tcp(tcp_provider, &core_device);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to CoreDeviceProxy: %d\n", err);
tcp_provider_free(tcp_provider);
return 1;
}
tcp_provider_free(tcp_provider);
// Get server RSD port
uint16_t rsd_port;
err = core_device_proxy_get_server_rsd_port(core_device, &rsd_port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get server RSD port: %d\n", err);
core_device_proxy_free(core_device);
return 1;
}
printf("Server RSD Port: %d\n", rsd_port);
/*****************************************************************
* Create TCP Tunnel Adapter
*****************************************************************/
printf("\n=== Creating TCP Tunnel Adapter ===\n");
AdapterHandle *adapter = NULL;
err = core_device_proxy_create_tcp_adapter(core_device, &adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create TCP adapter: %d\n", err);
core_device_proxy_free(core_device);
return 1;
}
// Connect to RSD port
err = adapter_connect(adapter, rsd_port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to RSD port: %d\n", err);
adapter_free(adapter);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to RSD port\n");
/*****************************************************************
* XPC Device Setup
*****************************************************************/
printf("\n=== Setting up XPC Device ===\n");
XPCDeviceAdapterHandle *xpc_device = NULL;
err = xpc_device_new(adapter, &xpc_device);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create XPC device: %d\n", err);
adapter_free(adapter);
core_device_proxy_free(core_device);
return 1;
}
// Get DebugProxy service
XPCServiceHandle *debug_service = NULL;
err = xpc_device_get_service(xpc_device, "com.apple.internal.dt.remote.debugproxy", &debug_service);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get debug proxy service: %d\n", err);
return 1;
}
// Get ProcessControl service
XPCServiceHandle *pc_service = NULL;
err = xpc_device_get_service(xpc_device, "com.apple.instruments.dtservicehub", &pc_service);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to get process control service: %d\n", err);
xpc_device_free(xpc_device);
core_device_proxy_free(core_device);
return 1;
}
/*****************************************************************
* Process Control - Launch App
*****************************************************************/
printf("\n=== Launching App ===\n");
// Get the adapter back from the XPC device
AdapterHandle *pc_adapter = NULL;
err = xpc_device_adapter_into_inner(xpc_device, &pc_adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to extract adapter: %d\n", err);
xpc_device_free(xpc_device);
core_device_proxy_free(core_device);
return 1;
}
// Connect to process control port
err = adapter_connect(pc_adapter, pc_service->port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to process control port: %d\n", err);
adapter_free(pc_adapter);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to process control port\n");
// Create RemoteServerClient
RemoteServerAdapterHandle *remote_server = NULL;
err = remote_server_adapter_new(pc_adapter, &remote_server);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create remote server: %d\n", err);
adapter_free(pc_adapter);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Create ProcessControlClient
ProcessControlAdapterHandle *process_control = NULL;
err = process_control_new(remote_server, &process_control);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create process control client: %d\n", err);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Launch application
uint64_t pid;
err = process_control_launch_app(process_control, bundle_id, NULL, 0, NULL, 0,
true, false, &pid);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to launch app: %d\n", err);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully launched app with PID: %" PRIu64 "\n", pid);
/*****************************************************************
* Debug Proxy - Attach to Process
*****************************************************************/
printf("\n=== Attaching Debugger ===\n");
// Get the adapter back from the remote server
AdapterHandle *debug_adapter = NULL;
err = remote_server_adapter_into_inner(remote_server, &debug_adapter);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to extract adapter: %d\n", err);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Connect to debug proxy port
err = adapter_connect(debug_adapter, debug_service->port);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to connect to debug proxy port: %d\n", err);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
printf("Successfully connected to debug proxy port\n");
// Create DebugProxyClient
DebugProxyAdapterHandle *debug_proxy = NULL;
err = debug_proxy_adapter_new(debug_adapter, &debug_proxy);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to create debug proxy client: %d\n", err);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
// Send vAttach command with PID in hex
char attach_command[64];
snprintf(attach_command, sizeof(attach_command), "vAttach;%" PRIx64, pid);
DebugserverCommandHandle *attach_cmd = debugserver_command_new(attach_command, NULL, 0);
if (attach_cmd == NULL) {
fprintf(stderr, "Failed to create attach command\n");
debug_proxy_free(debug_proxy);
adapter_free(debug_adapter);
xpc_service_free(debug_service);
process_control_free(process_control);
remote_server_free(remote_server);
xpc_service_free(pc_service);
core_device_proxy_free(core_device);
return 1;
}
char *attach_response = NULL;
err = debug_proxy_send_command(debug_proxy, attach_cmd, &attach_response);
debugserver_command_free(attach_cmd);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to attach to process: %d\n", err);
} else if (attach_response != NULL) {
printf("Attach response: %s\n", attach_response);
idevice_string_free(attach_response);
}
// Send detach command
DebugserverCommandHandle *detach_cmd = debugserver_command_new("D", NULL, 0);
if (detach_cmd == NULL) {
fprintf(stderr, "Failed to create detach command\n");
} else {
char *detach_response = NULL;
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
err = debug_proxy_send_command(debug_proxy, detach_cmd, &detach_response);
debugserver_command_free(detach_cmd);
if (err != IdeviceSuccess) {
fprintf(stderr, "Failed to detach from process: %d\n", err);
} else if (detach_response != NULL) {
printf("Detach response: %s\n", detach_response);
idevice_string_free(detach_response);
}
}
/*****************************************************************
* Cleanup
*****************************************************************/
debug_proxy_free(debug_proxy);
xpc_service_free(debug_service);
printf("\nDebug session completed\n");
return 0;
}

View file

@ -9,6 +9,6 @@
#ifndef JIT_H
#define JIT_H
int jitMain(int argc, char **argv);
int debug_app(const char *bundle_id);
#endif /* JIT_H */

View file

@ -1,159 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>DeviceCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN1akNDQWFLZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQUxpZjNCS2VWUHlZSC85LzNKL2ZJeUdNSUdWbHNvWGJtWmJLYml1OGJo
TFpnRkRjbEhtME1LODRNRk9iCkJFUW9NRkNlRFUwQWV1VHZzNlkrMERqQWlEbzJTTXZw
TnpkbVlGZWtRL1JzWUtSN3VJSGJRc1h0bWJSU0FLRlgKdUpsZUNyMjdKeFpUSXNGT3FE
bzRZNmdXWWptSVVXSm1qbXRtVXFoMTVYSFVTWFVOYnUwMVhRS0lqRFBScXRVaQpIakMr
N0J4ZXVvNzBySlgwTldTcXdnSjQxNWEyRnNITUQyRW9FM2NIalNXU0dSWFFUazVKZkFH
NHlJV1VLeVJOClZGNTVybDU5bjR3Q083SlR5U0sveHVCR09RWFNzVnFkUUY4NVE2ZFpi
aDZNNHpTaDB4T3BYanNKVURFZUlLaUMKNC9IUmIxOEE1ZXBrVnlibURPcmhJa09TWGJr
Q0F3RUFBYU0vTUQwd0RBWURWUjBUQVFIL0JBSXdBREFkQmdOVgpIUTRFRmdRVWFJNU9t
aHBaL2JpeVA1N3d0KzBhVE1rODhUWXdEZ1lEVlIwUEFRSC9CQVFEQWdXZ01BMEdDU3FH
ClNJYjNEUUVCQlFVQUE0SUJBUUEzV3NyTU93QWhDUDZkSVRGMG5YR09adUJnSnVrRkFs
TWR1Zm8wL2ZIT2tVdE0KY2xJYU1WK05naFVUMGZVQWY2YlpnQUFyNW1xU0dkVDlxUFlw
dFh3eU9FVFI5d2NMWTlZQWFCamtnbkJUWllTSwo2eGRZa3hZRHJOQ3lnZCtvR05CUXBT
ME1BQ0lpWm9sNUNZZmgzK2d6UFJjUUZKeXVkaTNTVlJUaWRUSDNGV2lxCmpYT25kekpM
RVBnZTZaUDJjZWZjMXI0anFaM3JHd1FabjlWWWxxTnFwUGk5aTNWSjNacTMrcnlsYWNT
LzRMdHIKUGxtZnljQ0xWakF2djZxU3NPc1l3dGp3YllVRG52UDM0V0xnK2tMbFBOemlU
cEV3NmxGdXdXRndXUVNSSUNHOApPV0QzeEliczB2RmtramdjaDhVTUVuUlZMRmNpWUV5
bzJoN1F4MXpzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
</data>
<key>HostPrivateKey</key>
<data>
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcw
QkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQys5dENJa3pDLzZ6VXgKZ29YUGxCb3NH
a1kzUThxbkVwSU1LczRIRU9aanM5RXAra1BoT3BxbWEzWGtmc2lvM1VFY2RVOUoybDM1
YXB4RApseC83MGRSN2lNMFFmSU5aSXFiSHBHT3JaeGxuVjBxcysvNkNGbTM5ME9keUpW
K2ptSnBZbFU3aXh0N3A0bWRyCjZLdGVLTGpDMW56VzFOVFdDL0dWNitZTk5PUDV5MThp
dE9sOGt0YnBacTFtSjNCQURyaWdqOW1hQVpmbXFreWUKcmR6RDl1REFqUVdad2ZoZVIx
U2piS0QwdGs5ZWpxZCtxdkdsMEd6OE56YUJDYXI0Qk9FTXcvSFl2eVhhS1Nwagp4L3Zo
T2pkM0Y4S2xIcXZodWFOcVhCc3UrSlkzdVRzVzdIV3RwRGo4QlFCT2dpTks3UytlMnJ5
ZytmR0FpZXV6ClVSbHJZSzhEQWdNQkFBRUNnZ0VBUSttczBkVmUwZklKRWRsMFV4VTls
WSttaHdMeDhDYlhqOEl0VVMvK2IxakUKdXlRSXZmSEVqQWpOZlh4bFNrQ2Raa3lGN1NM
ZXB0UDJUTWRURlpCUys3ZjBEYmZxVW1uVFhFNm5MNDdUNXYrUgpUQ0cyS25kbG1JMlJz
Zk4rcHNTZnAzODU5Y1o2QWoyRlFFZ1hvYjNqcjA3dVNNeWFBS0Z3d2p1SnJncXdST1lr
Ckw5ZTkxdnl2Rm9VWVlPWHpnRTE0dWxnK2NTSEdRTFh6bStDeEVEWWxUaEJ1Mi9HQUJ5
RWZwUEtXN0pWS1ZUQ1YKdm0xSnI1Z0s5eVhYL1hEKzN5ZlBnd0RvZ3VNV3NNRFRURSti
Q3BERVB2b3BxRVUxMEgrNldtRW1hbkZlVElLSwpIeElpaEoyOFhmWDBUNVd4QldTWFlK
NGRETTVpdWMwYkZ6dzVvQVFsS1FLQmdRRG9zamxBSUNmWmZOVU43OGg1CjJheFFyZlhw
MmpzL0xEc1pGUzlib0V0VjVjOW1yb0FWR1BpaXJIZ2VNUUMxWkNMaDRLek9ObC9wYXlq
TVhkUnAKS0p6OGhtNTNtc1JkbVZ3OFo4WUozckFUanh6blRKMWN5c01QRGN3UC9zK3NG
cFkybXk0b2hENFFvQ2FsMzc1QwpGelp5VHR5aUU3NjhwbG9wWHJQZmJpNE8xd0tCZ1FE
U0ZxNGFUNGMwNFJKL1NuUTVDVGhMTWF1MTcrZE9DU0dZCjJvLzl5T3RmN1dlMHhjeHdK
SEV2MXFqOHlDcWM4eFd1Yzcram84cVkzTGNKYVN6WEM3WGtlTXdXRDVhZFNVQ2MKVnhO
WEFScFR0ZWxBOXB1VTBYWnNBWDJCV0hrTFhpb3BPb0h6SnVuMnR4NWYvdHluRFg2UFRJ
YjgzOUJabDFSeQpQbVB5aVdBM3RRS0JnRHpNQy85QUo0bEFmMTREejBwZTRCRzRVZThH
c01JaHFWTTFZTWs4eVZJcEdCWkk4M2dQCnJTNjdoeXJFUE40bnlxRmZsV2JQZUNIQmVN
aGtuNUhXSmFZbzdZWGNidi9SaVBMVFhqL0g2aE5DS2hnWXdXaTAKSldDeWh5V0t1dkhJ
ZVBqTmRMTHJVbGYvci9sWXl4bnpmS3REQll4blFrZUI0ejY1MnA4KzUxUERBb0dCQUtH
UwpNNytrWGhWNjYyRGQvOWhGa1BlemNaMXdyWEZFY0lRL3d2R283ZXhPaHExdVdiWDlN
TmRidlliNjRscm1VRXhrClZJUWpXWktLWEhKdVlyL1lEOEZ3YlhTaDlIRnVmclE5KzIr
ME4yMGR3QS9vR09zdzFHUm9HUCs2N1F5akZNVzAKYTNCM0F3UnMvSDFUWXB0UE00QTlt
S3N0N2V5WkI2YjgrSnowcmZ6cEFvR0FkaGYyOFNuZVFzOEkzM0ZHRXdFcwpJellJWStI
Q2ZjU2UrU2k0UWZuSmtqWW96NS95ZlJpK3MrUE9tdWxXMXVxM0pMdGlSNGsydlpUWXl5
OUt5L1lXCjJwUHhJOURuY0VhUlBTYW5tb0FBck1uYlVER1hsT2JOakJEWldOSTVhenUr
ZzZ6bE91UkYzRE5wUC9CTm54WWgKdUpXenI1Y1VqMlI3bURMTFRCMFFCcjg9Ci0tLS0t
RU5EIFBSSVZBVEUgS0VZLS0tLS0K
</data>
<key>HostCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNtekNDQVlPZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQUw3MjBJaVRNTC9yTlRHQ2hjK1VHaXdhUmpkRHlxY1NrZ3dxemdjUTVt
T3owU242UStFNm1xWnJkZVIrCnlLamRRUngxVDBuYVhmbHFuRU9YSC92UjFIdUl6UkI4
ZzFraXBzZWtZNnRuR1dkWFNxejcvb0lXYmYzUTUzSWwKWDZPWW1saVZUdUxHM3VuaVoy
dm9xMTRvdU1MV2ZOYlUxTllMOFpYcjVnMDA0L25MWHlLMDZYeVMxdWxtcldZbgpjRUFP
dUtDUDJab0JsK2FxVEo2dDNNUDI0TUNOQlpuQitGNUhWS05zb1BTMlQxNk9wMzZxOGFY
UWJQdzNOb0VKCnF2Z0U0UXpEOGRpL0pkb3BLbVBIKytFNk4zY1h3cVVlcStHNW8ycGNH
eTc0bGplNU94YnNkYTJrT1B3RkFFNkMKSTBydEw1N2F2S0Q1OFlDSjY3TlJHV3RncndN
Q0F3RUFBYU1nTUI0d0RBWURWUjBUQVFIL0JBSXdBREFPQmdOVgpIUThCQWY4RUJBTUNC
YUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUZBbkEyUjFObGF2bVZGQm51ZnAyb0lM
CitOYXcrYXZpcmJBYVBnRHR4MXNTNzRsNFQ2eTdOWDFsdlFxY1Nqa01Salp6TmEvQUdX
VkNiaVovNUZCZjF4eWIKbmcrSjliL3VKWVpBRVBXaUEyanlVZlZ2UnI1aVVDdHdGZFBY
VmZuU2hOcXpxSjZuUEw5V1FoWm40dy9LdXJFRQovNU1kTnkxWnh1YytmczZHUzd1K3Ey
ZHpnQUJiYjN1NFIwRU1rL1pWV2pwKzRsaVZYd29UbVhyY2Z5OThqZWNsClY5RHF4V0ZJ
Q1BvTkdZbHcrT0R2TDdieFNERzhKaHBZOHJOVFNYYU1rUmJPNS91M0RnY0hWY2haNjVD
czlIRVEKem1IQXV5TGttdUE1Mzd1dVFvTHlYVUkrZmtHZGNmRjNwZ1VveUhzaFQ3ZlJx
QzhuTW9aWlNjdDVtc244a0RBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
</data>
<key>RootPrivateKey</key>
<data>
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2Z0lCQURBTkJna3Foa2lHOXcw
QkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRRE1kQmJTTkZtbURKUXMKb1U1ZVFQRFEy
NVhBN3RkUVdnaG9obUN0NU54UUUvR21rUjhNODNWUHg0WmMvSlZyUFJ0QUE5Rms0TzBE
VnFnYgpkNTJHZmVaa0xjWFlVVi9aWU9MQW5JbTM1bGJCNjVlRGIvb21sT2txOE95c21I
SS9SbmczWDZBQVVYWENsK3NQCkxjT3BYaFdHRzhBRzNONDk2cHN6c2hIN2R4dG1wTU9B
bHBVZHdaeVhXaVVDMFdsd3p0RXB5YXFvWWxOdS9GUVIKRkNEZ0l3Rlc4Ny8xSVZWYlEx
dVlOL1l1MXVENytrT2ZPRHNlUnkrc1JwQ2NGVWI2U1R5aFdmQnhic1ZUQ3puVwpwZ21Q
M284SFFaM2RGMzlHa1BIZTJJQnBXc1l2bEdoUFNqaVVibm03a1FXeGhrZ3ZNSE1yUmt5
a2U1TTY1U3EwCjJNWW5IdUFiQWdNQkFBRUNnZ0VCQUtTeGZ4Q2xDdkl2Zjh6VHc0VTVX
c05qbnlaalB4NkM1L01MRENZSURWQ1UKUUR5aytoWThwMnMwbG8raEI5dnl4Vml6dXFG
QWJxd1p5aUVXSWRhTTVHSWVYUmo3cy9JdmtYa0dvQWw3aXJkNwpSL21nNGlqaUcxRno4
YksydXBFdCt2amdGc3NxMDJtRlp0dzdTVG5OaUJrWGtYLzF1ekMxSTRCcEdRTXYxdXEr
CnErZnRRTktsQVd1TUJxclJCajNDd01nME5udzJtdnU4aUhhQXVCRU1mL1pKd1JyVVdV
UEhxMzFBQml1U0c3NXUKOWZ0SkIwaVZ3RVY0S21vQ0h3MVhGbTFUZjlPZ3h3Nnl5SUFN
YXNsdkdtN0NPM1lpYWdZUzFmYnJqWDVwUWJ4aQpjTWNnNHhKdUhicTQ5MWxTZCtNOVFt
dVRDdEtETkZyWVRGMHhMVVMwV0VFQ2dZRUEvcld5SkhXVWMwNDZGUFNJCktQSU1LRTFR
ZlV6SFlQeWRSV1BQUmxFeVg1MW9SbURGZnpsaDBUVSs5QlRJOFNKNmVGbFBMMktZTS9C
cjI0VTQKZUIwbHNHbS9EeWt6anBIZG1TVHZYbmN3Q1ZCTEQ4N1JUampiK015ZVV2TEln
QlVzYUJhODZJS2VpdXgxQUhWTgpFM0E0VEZmRzJ2dXFsYk85Mno3ajFnK3NyejhDZ1lF
QXpYMDR2RHBJdzBGZy9pT0NBSWUzaUdwUllaSjVSeWsxCmFVakprdm10b1VqWE5BbjBl
RlFUV3ZUdndqclZkTjdxemZwT1hOZlN5U3VBS2M4bVVTeTJ3SE4wVlRPK3lnNmEKQlhk
MTFJbmZiQ2owa003dkxTdjdOWGJ0c1pYT2NUYm1QOSsweTAwZlErc2Y5NlYyVE9NRng1
VmN6eFl2ZjFkZwpPWVFERmV6L2RDVUNnWUJzSVZxRkc5MXZyZS8rWVdsRWFLMDhsc1hx
eTZPQXl2MUJMZ1FhaC9Ib29YeFpGRkFECm1LcXNFL3lyeGY4Z1QxREtzcTlwSUdRWStL
SHhTWGNWbHRvZk1HVkozR1hreW92V3JkVm90eFNQZjZTK0MwRFUKQWxOd0pmMjRuUlQ5
T3YvbEdISU9DeFdmU0k3TEtRRVZsWGh4QUhxTkVIWDBvNStmNmV6elBTaEVKUUtCZ1FD
MgovR09oZW1XQk9wOGNzSkg3MXQ5ZzR3eEZUeUlnZEZuVHY3V0E1RVh4OGVOeHU4dXZ1
MjdnK0d6cEVXc3ovNjRvCmJsV0o1OGNVelYvNzJ6UEw1WDE0TTFmTTU1OW1YMHBZdytC
eHU3VHhwQ2JsTE9GZjRHSjdZY1NZOTBZM0d5USsKalA5NmF0c0VxRVIzU3lqbG51UnVy
bHRQTGZwdDgya0V6c0hRckpOdTRRS0JnSDIwNXMwaEpaMkk0YS9JWE5aawo3N1d5YXlu
R2Y0YTFMUkw1bmJHOWl1TkJlT3FGVGJRQ3hIbVFmQ0daZ01vajZta2RMeTRNZHhXN05C
U0JrRzdZCmQ3SVNPbUx4QzRsSU85Rnp6eEpheDZKR3FIcWFkSDBTVzcydjlQTUJOTXFi
UXdYeWc3RUNMVTlPaThWNVZQR20KcHh4cG8vMytWMVgrY003dDdHRVBSNDM3Ci0tLS0t
RU5EIFBSSVZBVEUgS0VZLS0tLS0K
</data>
<key>RootCertificate</key>
<data>
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqakNDQVhhZ0F3SUJBZ0lCQURB
TkJna3Foa2lHOXcwQkFRVUZBREFBTUI0WERUSTFNRE15TnpBM01UQXoKTWxvWERUTTFN
RE15TlRBM01UQXpNbG93QURDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBREND
QVFvQwpnZ0VCQU14MEZ0STBXYVlNbEN5aFRsNUE4TkRibGNEdTExQmFDR2lHWUszazNG
QVQ4YWFSSHd6emRVL0hobHo4CmxXczlHMEFEMFdUZzdRTldxQnQzbllaOTVtUXR4ZGhS
WDlsZzRzQ2NpYmZtVnNIcmw0TnYraWFVNlNydzdLeVkKY2o5R2VEZGZvQUJSZGNLWDZ3
OHR3NmxlRllZYndBYmMzajNxbXpPeUVmdDNHMmFrdzRDV2xSM0JuSmRhSlFMUgphWERP
MFNuSnFxaGlVMjc4VkJFVUlPQWpBVmJ6di9VaFZWdERXNWczOWk3VzRQdjZRNTg0T3g1
SEw2eEdrSndWClJ2cEpQS0ZaOEhGdXhWTUxPZGFtQ1kvZWp3ZEJuZDBYZjBhUThkN1ln
R2xheGkrVWFFOUtPSlJ1ZWJ1UkJiR0cKU0M4d2N5dEdUS1I3a3pybEtyVFl4aWNlNEJz
Q0F3RUFBYU1UTUJFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTgpCZ2txaGtpRzl3MEJB
UVVGQUFPQ0FRRUFDdTRUQi9vWnJHQStUS0M4a0YvWU9QcjVyTEpnQkRaaVVVNnNqQ0d6
Ckk5QzV5dXZnSHc0bXlISnNoVjFaNDQxeDl6RDN2OGZvVTRuRldtbkhGa3h4TG9zaDNi
Zk5mM09ObVB5dkV0amgKMEhWQU5ydUozVXg4YzZtNmdRQjlpMGk4UkVJcUs2RWFwOXJz
bDkwN3ZSTityTFZmWGFuSU9BQzU5RUV4WnpiMwplYWF4S0YwM1czcUJFZUlyUEUxT3hQ
eUFpSi9Ic29nRU1JYVo4SlJjaCtmSGJWeGFXcmxwSnlGNExGdWROYituCnEzdGx3QUVO
NkV3Wk02VFkwSUlXdzg4aElYdEtZdXlCWldLcHloWjkxcUJoUDZWKzhaMHFMallGbWtV
U29PQ2UKajBVeTBGNVMwMWQzbVJGR1YvZzBpakR2dmoyMm9acXM0dzQvei9vREN0YWtx
Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
</data>
<key>SystemBUID</key>
<string>A805572C-254B-4E89-8834-69AC330F8C0F</string>
<key>HostID</key>
<string>B8908445-96B8-A598-2E42-37EE5108C1FC</string>
<key>EscrowBag</key>
<data>
dBHuB7agDgAU1p2P7o2d/XQw2stjvTNo4Q2oXTHRVp8=
</data>
<key>WiFiMACAddress</key>
<string>c4:c1:7d:ab:e1:9b</string>
<key>UDID</key>
<string>00008130-0011356808A1401C</string>
</dict>
</plist>