fix passstat_cmd

This commit is contained in:
Nick Chan committed 2023-01-27 22:06:43 +08:00
1 parent e196349b2f
commit 2f306e6fcf
3 files changed
+17 -13

No files matched your search

+1 -1
View File
@@ -133,7 +133,7 @@ int unsubscribe_cmd();
int devinfo_cmd(devinfo_t *dev, const char *udid); int devinfo_cmd(devinfo_t *dev, const char *udid);
int enter_recovery_cmd(const char* udid); int enter_recovery_cmd(const char* udid);
int reboot_cmd(const char* udid); int reboot_cmd(const char* udid);
int passstat_cmd(char* status, const char* udid); int passstat_cmd(unsigned char* status, const char* udid);
int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid); int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid);
int autoboot_cmd(const uint64_t ecid); int autoboot_cmd(const uint64_t ecid);
int exitrecv_cmd(const uint64_t ecid); int exitrecv_cmd(const uint64_t ecid);
+12 -10
View File
@@ -251,7 +251,7 @@ int reboot_cmd(const char* udid) {
return 0; return 0;
} }
int passstat_cmd(char* status, const char* udid) { int passstat_cmd(unsigned char* status, const char* udid) {
lockdownd_error_t lerr = LOCKDOWN_E_SUCCESS; lockdownd_error_t lerr = LOCKDOWN_E_SUCCESS;
diagnostics_relay_error_t derr = DIAGNOSTICS_RELAY_E_SUCCESS; diagnostics_relay_error_t derr = DIAGNOSTICS_RELAY_E_SUCCESS;
@@ -273,7 +273,7 @@ int passstat_cmd(char* status, const char* udid) {
if ((lerr != LOCKDOWN_E_SUCCESS) || !lockdown) if ((lerr != LOCKDOWN_E_SUCCESS) || !lockdown)
{ {
idevice_free(dev); idevice_free(dev);
LOG(LOG_ERROR, "Error connecting to lockdownd (lockdownd error %d)", lerr); LOG(LOG_ERROR, "Error connecting to lockdownd (lockdownd error %d: (%s))", lerr, lockdownd_strerror(lerr));
return -1; return -1;
} }
lerr = lockdownd_start_service(lockdown, "com.apple.mobile.diagnostics_relay", &service); lerr = lockdownd_start_service(lockdown, "com.apple.mobile.diagnostics_relay", &service);
@@ -284,7 +284,7 @@ int passstat_cmd(char* status, const char* udid) {
if ((lerr != LOCKDOWN_E_SUCCESS) || !service) if ((lerr != LOCKDOWN_E_SUCCESS) || !service)
{ {
idevice_free(dev); idevice_free(dev);
LOG(LOG_ERROR, "Error starting diagnostics service (lockdownd error %d)\nUnlock the device and try again.", lerr); LOG(LOG_ERROR, "Error starting diagnostics service (lockdownd error %d: (%s))\nUnlock the device and try again.", lerr, lockdownd_strerror(lerr));
return -1; return -1;
} }
derr = diagnostics_relay_client_new(dev, service, &diagnostics_client); derr = diagnostics_relay_client_new(dev, service, &diagnostics_client);
@@ -292,7 +292,7 @@ int passstat_cmd(char* status, const char* udid) {
{ {
lockdownd_service_descriptor_free(service); lockdownd_service_descriptor_free(service);
idevice_free(dev); idevice_free(dev);
LOG(LOG_ERROR, "Error starting diagnostics client (lockdownd error %d)", derr); LOG(LOG_ERROR, "Error starting diagnostics client (diagnostics error %d)", derr);
return -1; return -1;
} }
keys = plist_new_array(); keys = plist_new_array();
@@ -306,7 +306,7 @@ int passstat_cmd(char* status, const char* udid) {
if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node) if (derr != DIAGNOSTICS_RELAY_E_SUCCESS || !node)
{ {
LOG(LOG_ERROR, "Error getting passcode state (lockdownd error %d)", lerr); LOG(LOG_ERROR, "Error getting passcode state (lockdownd error %d: (%s))", lerr, lockdownd_strerror(lerr));
return -1; return -1;
} }
status_node = plist_access_path(node, 2, "MobileGestalt", "Status"); status_node = plist_access_path(node, 2, "MobileGestalt", "Status");
@@ -316,18 +316,19 @@ int passstat_cmd(char* status, const char* udid) {
LOG(LOG_ERROR, "Error getting passcode state (invalid status node)"); LOG(LOG_ERROR, "Error getting passcode state (invalid status node)");
return -1; return -1;
} }
plist_get_string_val(status_node, &status); char* passstat_status;
if (!status || strncmp(status, "Succ", 4)) plist_get_string_val(status_node, &passstat_status);
if (!status || strncmp(passstat_status, "Succ", 4))
{ {
if (status) if (passstat_status)
free(status); free(passstat_status);
plist_free(node); plist_free(node);
LOG(LOG_ERROR, "Error getting passcode state (invalid status)"); LOG(LOG_ERROR, "Error getting passcode state (invalid status)");
return -1; return -1;
} }
free(status); free(passstat_status);
value_node = plist_access_path(node, 2, "MobileGestalt", "xsaMbRQ5rQ+eyKMKG+ZSSg"); value_node = plist_access_path(node, 2, "MobileGestalt", "xsaMbRQ5rQ+eyKMKG+ZSSg");
if (!value_node) if (!value_node)
{ {
@@ -339,6 +340,7 @@ int passstat_cmd(char* status, const char* udid) {
plist_get_bool_val(value_node, &passcode_state); plist_get_bool_val(value_node, &passcode_state);
plist_free(node); plist_free(node);
*status = passcode_state; *status = passcode_state;
LOG(LOG_VERBOSE4, "Passcode state: %hhu", *status);
return 0; return 0;
} }
+4 -2
View File
@@ -59,16 +59,18 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
LOG(LOG_WARNING, "Ignoring non-arm64 device..."); LOG(LOG_WARNING, "Ignoring non-arm64 device...");
return -1; return -1;
} }
if (strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) { if (!strncmp(dev.productType, "iPhone10,", strlen("iPhone10,"))) {
char passcode_state = 0; unsigned char passcode_state = 0;
ret = passstat_cmd(&passcode_state, usbmuxd_device->udid); ret = passstat_cmd(&passcode_state, usbmuxd_device->udid);
if (ret != 0) { if (ret != 0) {
LOG(LOG_ERROR, "Failed to get passcode state"); LOG(LOG_ERROR, "Failed to get passcode state");
devinfo_free(&dev); devinfo_free(&dev);
return -1; return -1;
} }
LOG(LOG_VERBOSE2, "Product %s requires passcode to be disabled\n", dev.productType);
if (passcode_state) { if (passcode_state) {
LOG(LOG_ERROR, "Passcode must be disabled on this device"); LOG(LOG_ERROR, "Passcode must be disabled on this device");
LOG(LOG_ERROR, "Additionally, passcode must never be set since restore on iOS 16+");
devinfo_free(&dev); devinfo_free(&dev);
return -1; return -1;
} }