mirror of
https://github.com/StikDebug/StikDebug.git
synced 2026-10-16 12:30:29 +00:00
Remove Hardcoded Pairing File
This commit is contained in:
parent
1e3dcb4e16
commit
ea4e77d1c5
8 changed files with 484 additions and 576 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
Loading…
Add table
Add a link
Reference in a new issue