forked from jkcoxson/idevice
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlockdownd.c
More file actions
184 lines (169 loc) · 5.55 KB
/
lockdownd.c
File metadata and controls
184 lines (169 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
// Jackson Coxson
#include "idevice.h"
#include <arpa/inet.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// Initialize logger
idevice_init_logger(Debug, Disabled, NULL);
// Create the socket address (replace with your device's IP)
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(LOCKDOWN_PORT);
inet_pton(AF_INET, "10.7.0.2", &addr.sin_addr);
// Read pairing file (replace with your pairing file path)
IdevicePairingFile *pairing_file = NULL;
IdeviceFfiError *err =
idevice_pairing_file_read("pairing_file.plist", &pairing_file);
if (err != NULL) {
fprintf(stderr, "Failed to read pairing file: [%d] %s", err->code,
err->message);
idevice_error_free(err);
return 1;
}
// Create TCP provider
IdeviceProviderHandle *provider = NULL;
err = idevice_tcp_provider_new((struct sockaddr *)&addr, pairing_file,
"LockdowndTest", &provider);
if (err != NULL) {
fprintf(stderr, "Failed to create TCP provider: [%d] %s", err->code,
err->message);
idevice_error_free(err);
idevice_pairing_file_free(pairing_file);
return 1;
}
// Connect to lockdownd
LockdowndClientHandle *client = NULL;
err = lockdownd_connect(provider, &client);
if (err != NULL) {
fprintf(stderr, "Failed to connect to lockdownd: [%d] %s", err->code,
err->message);
idevice_error_free(err);
idevice_provider_free(provider);
return 1;
}
// Read pairing file (replace with your pairing file path)
IdevicePairingFile *pairing_file_2 = NULL;
err = idevice_pairing_file_read("pairing_file.plist", &pairing_file_2);
if (err != NULL) {
fprintf(stderr, "Failed to read pairing file: [%d] %s", err->code,
err->message);
idevice_error_free(err);
return 1;
}
// Start session
err = lockdownd_start_session(client, pairing_file_2);
if (err != NULL) {
fprintf(stderr, "Failed to start session: [%d] %s", err->code,
err->message);
idevice_error_free(err);
lockdownd_client_free(client);
idevice_provider_free(provider);
return 1;
}
// Get device name
plist_t name_plist = NULL;
err = lockdownd_get_value(client, "DeviceName", NULL, &name_plist);
if (err != NULL) {
fprintf(stderr, "Failed to get device name: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
char *name = NULL;
plist_get_string_val(name_plist, &name);
printf("Device name: %s\n", name);
free(name);
plist_free(name_plist);
}
// Get product version
plist_t version_plist = NULL;
err = lockdownd_get_value(client, "ProductVersion", NULL, &version_plist);
if (err != NULL) {
fprintf(stderr, "Failed to get product version: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
char *version = NULL;
plist_get_string_val(version_plist, &version);
printf("iOS version: %s\n", version);
free(version);
plist_free(version_plist);
}
// Get product version
plist_t developer_mode_plist = NULL;
err =
lockdownd_get_value(client, "DeveloperModeStatus",
"com.apple.security.mac.amfi", &developer_mode_plist);
if (err != NULL) {
fprintf(stderr, "Failed to get product version: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
uint8_t enabled = 0;
plist_get_bool_val(developer_mode_plist, &enabled);
printf("Developer mode enabled: %s\n", enabled ? "true" : "false");
plist_free(developer_mode_plist);
}
// Get all values
plist_t all_values = NULL;
err = lockdownd_get_value(client, NULL, NULL, &all_values);
if (err != NULL) {
fprintf(stderr, "Failed to get all values: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
printf("\nAll device values:\n");
// Iterate through dictionary (simplified example)
plist_dict_iter it = NULL;
plist_dict_new_iter(all_values, &it);
if (it) {
char *key = NULL;
plist_t val = NULL;
do {
plist_dict_next_item(all_values, it, &key, &val);
if (key) {
printf("- %s: ", key);
// Print value based on type (simplified)
if (plist_get_node_type(val) == PLIST_STRING) {
char *str_val = NULL;
plist_get_string_val(val, &str_val);
printf("%s", str_val);
free(str_val);
} else if (plist_get_node_type(val) == PLIST_BOOLEAN) {
uint8_t bool_val = 0;
plist_get_bool_val(val, &bool_val);
printf("%s", bool_val ? "true" : "false");
} else if (plist_get_node_type(val) == PLIST_UINT) {
uint64_t int_val = 0;
plist_get_uint_val(val, &int_val);
printf("%llu", int_val);
}
printf("\n");
free(key);
}
} while (key);
free(it);
}
plist_free(all_values);
}
// Test starting a service (heartbeat in this example)
uint16_t port = 0;
bool ssl = false;
err = lockdownd_start_service(client, "com.apple.mobile.heartbeat", &port,
&ssl);
if (err != NULL) {
fprintf(stderr, "Failed to start heartbeat service: [%d] %s", err->code,
err->message);
idevice_error_free(err);
} else {
printf("\nStarted heartbeat service on port %d (SSL: %s)\n", port,
ssl ? "true" : "false");
}
// Cleanup
lockdownd_client_free(client);
idevice_provider_free(provider);
return 0;
}