plooshInit support

This commit is contained in:
Nick Chan committed 2023-12-21 01:53:39 +08:00
1 parent 6f30ad8314
commit 65707046dd
28 files changed
+324 -464

No files matched your search

+75 -55
View File
@@ -1,57 +1,57 @@
all: palera1n
OBJECTS = main.o dfuhelper.o devhelper.o lockdown_helper.o
OBJECTS += optparse.o override_file.o log.o lock_vars.o credits.o
OBJECTS += fake_embedded.o exec_checkra1n.o pongo_helper.o
OBJECTS += boyermoore_memmem.o
OBJDIR = obj
GENDIR = gen
RESOURCES_DIR = resources
C_SRC = $(wildcard *.c)
OBJS = $(patsubst %,$(OBJDIR)/%,$(C_SRC:.c=.c.o))
ifeq (,$(findstring macosx, $(CFLAGS)))
ifneq (,$(findstring version-min=, $(CFLAGS)))
OBJECTS += xxd-libcheckra1nhelper.dylib.o
C_SRC += $(GENDIR)/gen-libcheckra1nhelper.dylib.c
endif
endif
ifeq ($(FORCE_HELPER),1)
OBJECTS += xxd-libcheckra1nhelper.dylib.o
C_SRC += $(GENDIR)/gen-libcheckra1nhelper.dylib.c
CFLAGS += -DFORCE_HELPER
BUILD_OPTIONS += FORCE_HELPER
endif
ifneq ($(NO_RAMDISK),1)
OBJECTS += xxd-ramdisk.dmg.lzma.o
C_SRC += $(GENDIR)/gen-ramdisk.dmg.lzma.c
else
CFLAGS += -DNO_RAMDISK -DRAMDISK_COMPRESSED_SIZE=\"0\"
BUILD_OPTIONS += NO_RAMDISK
endif
ifneq ($(NO_KPF),1)
OBJECTS += xxd-checkra1n-kpf-pongo.o
C_SRC += $(GENDIR)/gen-checkra1n-kpf-pongo.lzma.c
else
CFLAGS += -DNO_KPF
BUILD_OPTIONS += NO_KPF
endif
ifneq ($(NO_OVERLAY),1)
OBJECTS += xxd-binpack.dmg.o
C_SRC += $(GENDIR)/gen-binpack.dmg.c
else
CFLAGS += -DNO_OVERLAY
BUILD_OPTIONS += NO_OVERLAY
endif
ifneq ($(NO_CHECKRAIN),1)
OBJECTS += xxd-checkra1n.o
C_SRC += $(GENDIR)/gen-checkra1n.c
else
CFLAGS += -DNO_CHECKRAIN
BUILD_OPTIONS += NO_CHECKRAIN
endif
ifneq ($(NO_CUSTOM_PONGO),1)
OBJECTS += xxd-Pongo.bin.o
C_SRC += $(GENDIR)/gen-Pongo.bin.c
else
CFLAGS += -DNO_CUSTOM_PONGO
BUILD_OPTIONS += NO_CUSTOM_PONGO
endif
ifeq ($(TUI),1)
OBJECTS += tui_screen_enter_recovery.o tui_screen_enter_dfu.o tui_main.o
OBJECTS += tui_screen_jailbreak.o tui_screen_main.o tui_screen_options.o
BUILD_OPTIONS += TUI
CFLAGS += -DTUI
endif
@@ -62,20 +62,18 @@ LDID = ldid
ifeq ($(TARGET_OS),Darwin)
ifneq ($(USE_LIBUSB),1)
OBJECTS += usb_iokit.o
else
LIBS += -framework SystemConfiguration -framework Security
BUILD_OPTIONS += USE_LIBUSB
endif
# add lto and debug symbols for lto
CFLAGS += -flto=full -g
LDFLAGS += -Wl,-object_path_lto,lto.o
LDFLAGS += -Wl,-object_path_lto,obj/lto.o
else
USE_LIBUSB = 1
endif
ifeq ($(USE_LIBUSB),1)
OBJECTS += usb_libusb.o
CFLAGS += -DUSE_LIBUSB=1
LIBS += $(DEP)/lib/libusb-1.0.a
endif
@@ -91,75 +89,97 @@ endif
CFLAGS += -DBUILD_OPTIONS=\""$(BUILD_OPTIONS)"\"
checkra1n-%:
curl -LO https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$@
ifeq ($(TARGET_OS),Linux)
ifeq ($(UNAME),Linux)
ifeq ($(CHECKRA1N_NAME),)
ifeq ($(shell arch),x86_64)
CHECKRA1N_NAME := linux-x86_64
else ifeq ($(shell arch | grep -q 'i[3-7]86' && echo 1),1)
CHECKRA1N_NAME := linux-x86
else ifeq ($(shell arch | grep -v '\(arm\|aarch\)[a-z]\?\+64' | grep -q arm && echo 1),1)
CHECKRA1N_NAME := linux-armel
else ifeq ($(shell arch | grep -q '\(arm\|aarch\)[a-z]\?\+64' && echo 1),1)
CHECKRA1N_NAME := linux-arm64
endif
endif
endif
endif
$(RESOURCES_DIR)/checkra1n-%:
curl -Lfo $@ https://assets.checkra.in/downloads/preview/$(CHECKRA1N_VERSION)/$$(echo $@ | cut -d/ -f2)
chmod 755 $@
checkra1n: checkra1n-macos usb.xml
$(RESOURCES_DIR)/checkra1n: $(RESOURCES_DIR)/checkra1n-macos usb.xml
ifeq ($(TARGET_OS),Darwin)
ifneq (,$(findstring arm64, $(CFLAGS)))
$(LIPO) -thin arm64 -output checkra1n checkra1n-macos
$(LIPO) -thin arm64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos
else ifneq (,$(findstring x86_64, $(CFLAGS)))
$(LIPO) -thin x86_64 -output checkra1n checkra1n-macos
$(LIPO) -thin x86_64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos
else ifeq ($(shell arch),i386)
$(LIPO) -thin x86_64 -output checkra1n checkra1n-macos
$(LIPO) -thin x86_64 -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos
else
$(LIPO) -thin $(shell arch) -output checkra1n checkra1n-macos
$(LIPO) -thin $(shell arch) -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n-macos
endif
ifeq (,$(findstring macosx, $(CFLAGS)))
ifneq (,$(findstring version-min=, $(CFLAGS)))
vtool -remove-build-version 1 -replace -output checkra1n checkra1n
vtool -set-build-version $(FAKE_PLATFORM) $(FAKE_MINOS) $(FAKE_SDK) -replace -output checkra1n checkra1n
install_name_tool -change /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit /System/Library/Frameworks/IOKit.framework/IOKit checkra1n
install_name_tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation checkra1n
$(LDID) -Susb.xml checkra1n
vtool -remove-build-version 1 -replace -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n
vtool -set-build-version $(FAKE_PLATFORM) $(FAKE_MINOS) $(FAKE_SDK) -replace -output $(RESOURCES_DIR)/checkra1n $(RESOURCES_DIR)/checkra1n
install_name_tool -change /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit /System/Library/Frameworks/IOKit.framework/IOKit $(RESOURCES_DIR)/checkra1n
install_name_tool -change /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation $(RESOURCES_DIR)/checkra1n
$(LDID) -Susb.xml $(RESOURCES_DIR)/checkra1n
endif
endif
else
cp checkra1n-$(CHECKRA1N_NAME) checkra1n
cp $(RESOURCES_DIR)/checkra1n-$(CHECKRA1N_NAME) $(RESOURCES_DIR)/checkra1n
endif
xxd-%.c: %
xxd -iC $< > $@
$(GENDIR)/gen-%.c: $(RESOURCES_DIR)/%
echo '#include <stdint.h>' > $(RESOURCES_DIR)/../$@
cd $(RESOURCES_DIR) && xxd -iC $$(echo $< | cut -d/ -f2) | sed -e 's/unsigned int/uint32_t/' -e 's/unsigned char/uint8_t/' >> ../$@
ifneq ($(NO_RAMDISK),1)
pongo_helper.o: pongo_helper.c $(wildcard ../include/*.h) ramdisk.dmg
$(CC) -c $(CFLAGS) -DRAMDISK_UNCOMPRESSED_SIZE="\"$$(wc -c < ramdisk.dmg | tr -d ' ')\"" $<
else
pongo_helper.o: pongo_helper.c $(wildcard ../include/*.h)
$(CC) -c $(CFLAGS) $<
endif
%.o: %.c $(wildcard ../include/*.h)
$(CC) -c $(CFLAGS) $<
$(OBJDIR)/pongo_helper.c.o: pongo_helper.c $(wildcard ../include/*.h) $(RESOURCES_DIR)/ramdisk.dmg $(RESOURCES_DIR)/checkra1n-kpf-pongo
$(CC) -c -o $@ $(CFLAGS) -DRAMDISK_UNCOMPRESSED_SIZE="\"$$(wc -c < $(RESOURCES_DIR)/ramdisk.dmg | tr -d ' ')\"" -DKPF_UNCOMPRESSED_SIZE="\"$$(wc -c < $(RESOURCES_DIR)/checkra1n-kpf-pongo | tr -d ' ')\"" $<
palera1n: $(OBJECTS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJECTS) $(LIBS) -o palera1n
$(OBJDIR)/%.c.o: $(GENDIR)/gen-%.c $(wildcard ../include/*.h)
$(CC) $(CFLAGS) -c -o $<
$(OBJDIR)/%.c.o: %.c $(wildcard ../include/*.h)
$(CC) $(CFLAGS) -c -o $@ $<
palera1n: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o palera1n
ifeq (,$(findstring macosx, $(CFLAGS)))
ifneq (,$(findstring version-min=, $(CFLAGS)))
$(LDID) -Susb.xml palera1n
endif
endif
libcheckra1nhelper.dylib: chkstk.S
$(CC) $(CFLAGS) $(LDFLAGS) -shared chkstk.S -o libcheckra1nhelper.dylib
$(RESOURCES_DIR)/libcheckra1nhelper.dylib: chkstk.S
$(CC) $(CFLAGS) $(LDFLAGS) -shared chkstk.S -o $@
checkra1n-kpf-pongo:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/checkra1n-kpf-pongo
$(RESOURCES_DIR)/checkra1n-kpf-pongo:
curl -Lfo $@ https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/checkra1n-kpf-pongo
ramdisk.dmg.lzma: ramdisk.dmg
xz --format=lzma -vf6ekT 0 ramdisk.dmg
$(RESOURCES_DIR)/ramdisk.dmg.lzma: $(RESOURCES_DIR)/ramdisk.dmg
xz --format=lzma -vfc6ekT 0 $< > $@
ramdisk.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg
$(RESOURCES_DIR)/checkra1n-kpf-pongo.lzma: $(RESOURCES_DIR)/checkra1n-kpf-pongo
xz --format=lzma -vfc6ekT 0 $< > $@
binpack.dmg:
curl -LO https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg
$(RESOURCES_DIR)/ramdisk.dmg:
curl -Lfo $@ https://cdn.nickchan.lol/palera1n/c-rewrite/deps/ramdisk.dmg
Pongo.bin:
curl -LO https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/Pongo.bin
$(RESOURCES_DIR)/binpack.dmg:
curl -Lfo $@ https://cdn.nickchan.lol/palera1n/c-rewrite/deps/binpack.dmg
$(RESOURCES_DIR)/Pongo.bin:
curl -Lfo $@ https://cdn.nickchan.lol/palera1n/artifacts/kpf/iOS15/Pongo.bin
clean:
rm -rf *.o palera1n checkra1n checkra1n.c palera1n.dSYM ramdisk.dmg.lzma libcheckra1nhelper.dylib
rm -rf $(OBJDIR)/*.o $(GENDIR)/*.c $(GENDIR)/*.o palera1n palera1n.dSYM libcheckra1nhelper.dylib
distclean: clean
rm -rf $(RESOURCES_DIR)/*
.PHONY: all clean
+15 -16
View File
@@ -28,8 +28,6 @@
#include <libimobiledevice/diagnostics_relay.h>
#include <plist/plist.h>
#include "lockdown_helper.h"
#ifdef HAVE_LIB_TV_CONTROL
#include <libtvcontrol.h>
#endif
@@ -104,6 +102,7 @@ int unsubscribe_cmd(void)
int devinfo_cmd(devinfo_t *dev, const char *udid)
{
int ret;
uint64_t this_ecid = 0;
char *productType = NULL;
char *productVersion = NULL;
@@ -112,67 +111,67 @@ int devinfo_cmd(devinfo_t *dev, const char *udid)
char *CPUArchitecture = NULL;
idevice_t device = NULL;
lockdownd_client_t lockdown = NULL;
if (idevice_new(&device, udid) != IDEVICE_E_SUCCESS)
if ((ret = idevice_new_with_options(&device, udid, IDEVICE_LOOKUP_USBMUX)) != IDEVICE_E_SUCCESS)
{
LOG(LOG_ERROR, "Error connecting to device.");
LOG(LOG_ERROR, "Error connecting to device: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
if (lockdownd_client_new(device, &lockdown, "palera1n") != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_client_new_with_handshake(device, &lockdown, "palera1n")) != LOCKDOWN_E_SUCCESS)
{
(void)idevice_free(device);
LOG(LOG_ERROR, "Device is not in normal mode.");
LOG(LOG_ERROR, "Device is not in normal mode: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_t node = NULL;
if (lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node) != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_get_value(lockdown, NULL, "UniqueChipID", &node)) != LOCKDOWN_E_SUCCESS)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
LOG(LOG_ERROR, "Error getting ECID");
LOG(LOG_ERROR, "Error getting ECID: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_get_uint_val(node, &this_ecid);
plist_free(node);
node = NULL;
if (lockdownd_get_value(lockdown, NULL, "ProductType", &node) != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_get_value(lockdown, NULL, "ProductType", &node)) != LOCKDOWN_E_SUCCESS)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
LOG(LOG_ERROR, "Error getting product type");
LOG(LOG_ERROR, "Error getting product type: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_get_string_val(node, &productType);
plist_free(node);
node = NULL;
if (lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node) != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_get_value(lockdown, NULL, "CPUArchitecture", &node)) != LOCKDOWN_E_SUCCESS)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
LOG(LOG_ERROR, "Error getting CPU type");
LOG(LOG_ERROR, "Error getting CPU type: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_get_string_val(node, &CPUArchitecture);
plist_free(node);
node = NULL;
if (lockdownd_get_value(lockdown, NULL, "ProductVersion", &node) != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_get_value(lockdown, NULL, "ProductVersion", &node)) != LOCKDOWN_E_SUCCESS)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
LOG(LOG_ERROR, "Error getting product version");
LOG(LOG_ERROR, "Error getting product version: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_get_string_val(node, &productVersion);
plist_free(node);
node = NULL;
if (lockdownd_get_value(lockdown, NULL, "BuildVersion", &node) != LOCKDOWN_E_SUCCESS)
if ((ret = lockdownd_get_value(lockdown, NULL, "BuildVersion", &node)) != LOCKDOWN_E_SUCCESS)
{
(void)lockdownd_client_free(lockdown);
(void)idevice_free(device);
LOG(LOG_ERROR, "Error getting build version");
LOG(LOG_ERROR, "Error getting build version: %d (%s)", ret, lockdownd_strerror(ret));
return -1;
}
plist_get_string_val(node, &buildVersion);
+2 -2
View File
@@ -218,7 +218,7 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
event->mode == IRECV_K_RECOVERY_MODE_3 ||
event->mode == IRECV_K_RECOVERY_MODE_4) {
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE, "Recovery mode device %ld connected", event->device_info->ecid);
LOG(LOG_VERBOSE, "Recovery mode device %" PRIu64 " connected", event->device_info->ecid);
if ((palerain_flags & palerain_option_exit_recovery)) {
ret = exitrecv_cmd(event->device_info->ecid);
if (!ret) {
@@ -258,7 +258,7 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void* userdata) {
pthread_create(&recovery_thread, NULL, (pthread_start_t)connected_recovery_mode, event->device_info);
} else if (event->mode == IRECV_K_DFU_MODE) {
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_VERBOSE, "DFU mode device %ld connected", event->device_info->ecid);
LOG(LOG_VERBOSE, "DFU mode device %" PRIu64 " connected", event->device_info->ecid);
if ((palerain_flags & palerain_option_device_info)) {
recvinfo_t info;
+16 -3
View File
@@ -15,6 +15,7 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <inttypes.h>
#include <sys/utsname.h>
#if defined(__APPLE__)
@@ -42,6 +43,10 @@ int exec_checkra1n(void) {
#ifndef NO_CUSTOM_PONGO
if (pongo_path == NULL) {
pongo_path = malloc(strlen(tmpdir) + 20);
if (pongo_path == NULL) {
LOG(LOG_FATAL, "memory allocation failed\n");
return -1;
}
snprintf(pongo_path, strlen(tmpdir) + 20, "%s/Pongo.bin.XXXXXX", tmpdir);
fd_pongo = mkstemp(pongo_path);
if (fd_pongo == -1) {
@@ -51,7 +56,7 @@ int exec_checkra1n(void) {
}
ssize_t didWrite_Pongo_bin = write(fd_pongo, Pongo_bin, Pongo_bin_len);
if (didWrite_Pongo_bin != (ssize_t)Pongo_bin_len) {
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", pongo_path, didWrite_Pongo_bin, Pongo_bin_len, errno, strerror(errno));
LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", pongo_path, didWrite_Pongo_bin, Pongo_bin_len, errno, strerror(errno));
close(fd_pongo);
unlink(pongo_path);
free(pongo_path);
@@ -61,6 +66,10 @@ int exec_checkra1n(void) {
} else external_pongo = true;
#endif
checkra1n_path = malloc(strlen(tmpdir) + 20);
if (checkra1n_path == NULL) {
LOG(LOG_FATAL, "memory allocation failed\n");
return -1;
}
snprintf(checkra1n_path, strlen(tmpdir) + 20, "%s/checkra1n.XXXXXX", tmpdir);
fd_checkra1n = mkstemp(checkra1n_path);
if (fd_checkra1n == -1) {
@@ -71,7 +80,7 @@ int exec_checkra1n(void) {
}
ssize_t didWrite_checkra1n = write(fd_checkra1n, checkra1n, checkra1n_len);
if (didWrite_checkra1n != (ssize_t)checkra1n_len) {
LOG(LOG_FATAL, "Size written to %s does not match expected: %lld != %d: %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno));
LOG(LOG_FATAL, "Size written to %s does not match expected: %zd != %" PRIu32 ": %d (%s)", checkra1n_path, didWrite_checkra1n, checkra1n_len, errno, strerror(errno));
close(fd_checkra1n);
unlink(checkra1n_path);
free(checkra1n_path);
@@ -98,6 +107,10 @@ int exec_checkra1n(void) {
if (darwinMajor < 20) {
#endif
libcheckra1nhelper_dylib_path = malloc(strlen(tmpdir) + 40);
if (libcheckra1nhelper_dylib_path == NULL) {
LOG(LOG_FATAL, "memory allocation failed\n");
return -1;
}
snprintf(libcheckra1nhelper_dylib_path, strlen(tmpdir) + 40, "%s/libcheckra1nhelper.dylib.XXXXXX", tmpdir);
int helper_fd = mkstemp(libcheckra1nhelper_dylib_path);
if (helper_fd == -1) {
@@ -106,7 +119,7 @@ int exec_checkra1n(void) {
}
ssize_t didWrite_libcheckra1nhelper = write(helper_fd, libcheckra1nhelper_dylib, libcheckra1nhelper_dylib_len);
if ((unsigned int)didWrite_libcheckra1nhelper != libcheckra1nhelper_dylib_len) {
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno));
LOG(LOG_FATAL, "Size written does not match expected: %zd != %" PRIu32 ": %d (%s)", didWrite_libcheckra1nhelper, libcheckra1nhelper_dylib_len, errno, strerror(errno));
close(helper_fd);
unlink(libcheckra1nhelper_dylib_path);
return -1;
+2 -2
View File
@@ -1,8 +1,8 @@
#include <stdlib.h>
#ifdef NO_KPF
unsigned char* checkra1n_kpf_pongo = NULL;
unsigned int checkra1n_kpf_pongo_len = 0;
unsigned char* checkra1n_kpf_pongo_lzma = NULL;
unsigned int checkra1n_kpf_pongo_lzma_len = 0;
#endif
#ifdef NO_RAMDISK
+1
View File
@@ -0,0 +1 @@
*.o
+1
View File
@@ -0,0 +1 @@
.
-245
View File
@@ -1,245 +0,0 @@
#ifndef HAVE_LIBIMOBILEDEVICE
#include "lockdown_helper.h"
#include <usbmuxd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#ifdef DEBUG
#define log_debug(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
#else
#define log_debug(...) do {} while (0)
#endif
#define log_error(...) fprintf(stderr, __VA_ARGS__); fputc('\n', stderr)
int lockdown_connect_handle(uint32_t handle) {
int fd = usbmuxd_connect(handle, 62078);
if (fd < 0) {
log_debug("Can't connect to lockownd on device #%u", handle);
}
return fd;
}
int lockdown_connect_udid(const char* udid) {
usbmuxd_device_info_t device;
if (usbmuxd_get_device_by_udid(udid, &device) < 0) {
log_debug("Can't find device %s", udid);
return -ENOENT;
}
return lockdown_connect_handle(device.handle);
}
void lockdown_disconnect(int fd) {
usbmuxd_disconnect(fd);
}
int lockdown_check_type(int fd, const char* type_match);
static const char QUERY_TYPE_REQUEST[] = "____<plist version=\"1.0\"><dict><key>Label</key><string>palera1n</string><key>Request</key><string>QueryType</string></dict></plist>";
static const char GET_VALUE_DOMAIN_REQUEST_FMT[] = "____<plist version=\"1.0\"><dict><key>Label</key><string>palera1n</string><key>Domain</key><string>%s</string><key>Key</key><string>%s</string><key>Request</key><string>GetValue</string></dict></plist>";
static const char GET_VALUE_REQUEST_FMT[] = "____<plist version=\"1.0\"><dict><key>Label</key><string>palera1n</string><key>Key</key><string>%s</string><key>Request</key><string>GetValue</string></dict></plist>";
static const char VALUE_KEY_NODE[] = "<key>Value</key>";
static const char INTEGER_NODE[] = "<integer>";
static const char STRING_NODE[] = "<string>";
static const char ENTER_RECOVERY_REQUEST[] = "____<plist version=\"1.0\"><dict><key>Label</key><string>palera1n</string><key>Request</key><string>EnterRecovery</string></dict></plist>";
static const char ERROR_KEY_NODE[] = "<key>Error</key>";
static const char ENTER_RECOVERY_STRING_NODE[] = "<string>EnterRecovery</string>";
static const int VALUE_KEY_NODE_SIZE = sizeof(VALUE_KEY_NODE)-1;
static const int INTEGER_NODE_SIZE = sizeof(INTEGER_NODE)-1;
static const int STRING_NODE_SIZE = sizeof(STRING_NODE)-1;
static const int ERROR_KEY_NODE_SIZE = sizeof(ERROR_KEY_NODE)-1;
static void skip_ws(char** cur, char* end) {
char* p = *cur;
while (p < end && ((*p == ' ') || (*p == '\t') || (*p == '\r') || (*p == '\n'))) {
p++;
}
*cur = p;
}
static char* _send_request_and_get_reply(int fd, const char* request, uint32_t len, uint32_t* received) {
uint32_t sent_bytes = 0;
usbmuxd_send(fd, request, len, &sent_bytes);
if (sent_bytes != len) {
usbmuxd_disconnect(fd);
log_error("Failed to send data payload");
return NULL;
}
uint32_t recv_bytes = 0;
uint32_t besize = 0;
int r = usbmuxd_recv(fd, (char*)&besize, sizeof(besize), &recv_bytes);
if (recv_bytes != sizeof(besize)) {
usbmuxd_disconnect(fd);
log_error("Failed to get size of packet (%d)", r);
return NULL;
}
uint32_t resp_size = ntohl(besize);
char* resp = (char*)malloc(resp_size+1);
recv_bytes = 0;
usbmuxd_recv(fd, resp, resp_size, &recv_bytes);
if (recv_bytes != resp_size) {
usbmuxd_disconnect(fd);
free(resp);
log_error("Failed to receive payload");
return NULL;
}
resp[resp_size] = '\0';
*received = resp_size;
return resp;
}
int lockdown_check_type(int fd, const char* type_match) {
unsigned char tmp[512];
uint32_t len = (uint32_t)snprintf((char*)tmp, 512, QUERY_TYPE_REQUEST);
uint32_t belen = htonl(len-4);
*(uint32_t*)tmp = belen;
uint32_t resp_size = 0;
char* resp = _send_request_and_get_reply(fd, (char*)tmp, len, &resp_size);
if (!resp) {
log_error("Failed to get lockdown type");
return -1;
}
int result = (strstr(resp, type_match) == NULL) ? -1 : 0;
free(resp);
return result;
}
int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value) {
char tmp[1024];
uint32_t len;
if (domain) {
len = snprintf(tmp, 1024, GET_VALUE_DOMAIN_REQUEST_FMT, domain, key);
} else {
len = snprintf(tmp, 1024, GET_VALUE_REQUEST_FMT, key);
}
*(uint32_t*)&tmp = htonl(len-4);
uint32_t resp_size = 0;
char* resp = _send_request_and_get_reply(fd, tmp, len, &resp_size);
if (!resp) {
log_error("Failed to get value for key %s", key);
return -1;
}
char* p = strstr(resp, VALUE_KEY_NODE);
if (!p) {
log_debug("Failed to get Value key node?!");
return -1;
}
p += VALUE_KEY_NODE_SIZE;
skip_ws(&p, resp+resp_size);
if (p >= resp+resp_size) {
log_debug("Failed to get value node");
return -1;
}
if (strncmp(p, INTEGER_NODE, INTEGER_NODE_SIZE) != 0) {
log_debug("Failed to parse value node");
return -1;
}
p += INTEGER_NODE_SIZE;
*value = (uint64_t)strtoll(p, NULL, 10);
free(resp);
return 0;
}
int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value) {
char tmp[1024];
uint32_t len;
if (domain) {
len = snprintf(tmp, 1024, GET_VALUE_DOMAIN_REQUEST_FMT, domain, key);
} else {
len = snprintf(tmp, 1024, GET_VALUE_REQUEST_FMT, key);
}
*(uint32_t*)&tmp = htonl(len-4);
uint32_t resp_size = 0;
char* resp = _send_request_and_get_reply(fd, tmp, len, &resp_size);
if (!resp) {
log_error("Failed to get value for key %s", key);
return -1;
}
char* p = strstr(resp, VALUE_KEY_NODE);
if (!p) {
log_debug("Failed to get Value key node?!");
free(resp);
return -1;
}
p += VALUE_KEY_NODE_SIZE;
skip_ws(&p, resp+resp_size);
if (p >= resp+resp_size) {
log_debug("Failed to get value node");
free(resp);
return -1;
}
if (strncmp(p, STRING_NODE, STRING_NODE_SIZE) != 0) {
log_debug("Failed to parse value node");
free(resp);
return -1;
}
p += STRING_NODE_SIZE;
char* str_start = p;
while (*p != '<' && *p != '\0') p++;
if (*p == '\0') {
log_debug("Failed to parse string value node");
free(resp);
return -1;
}
size_t str_len = p - str_start;
*value = (char*)malloc(str_len + 1);
snprintf(*value, str_len, "%s", str_start);
(*value)[str_len] = '\0';
free(resp);
return 0;
}
int lockdown_enter_recovery(int fd) {
char tmp[512];
uint32_t len = (uint32_t)snprintf(tmp, 512, ENTER_RECOVERY_REQUEST);
*(uint32_t*)&tmp = htonl(len-4);
uint32_t resp_size = 0;
char* resp = _send_request_and_get_reply(fd, tmp, len, &resp_size);
if (!resp) {
log_error("Failed to enter recover?");
return -1;
}
int result = -1;
char* p = strstr(resp, ERROR_KEY_NODE);
if (p) {
char* str_start = NULL;
size_t str_len = 0;
p += ERROR_KEY_NODE_SIZE;
skip_ws(&p, resp+resp_size);
if (*p && !strncmp(p, STRING_NODE, STRING_NODE_SIZE)) {
p += STRING_NODE_SIZE;
str_start = p;
while (*p != '<' && *p != '\0') p++;
if (*p == '<') {
str_len = p - str_start;
}
}
if (str_start && str_len > 0) {
log_error("ERROR: Failed to make device enter recovery mode: %.*s", (int)str_len, str_start);
} else {
log_error("ERROR: Failed to make device enter recovery mode: (unknown error)");
}
result = -2;
} else {
result = (strstr(resp, ENTER_RECOVERY_STRING_NODE) == NULL) ? -1 : 0;
}
free(resp);
return result;
}
#endif
-30
View File
@@ -1,30 +0,0 @@
#ifndef __LOCKDOWN_HELPER_H
#define __LOCKDOWN_HELPER_H
#ifndef HAVE_LIBIMOBILEDEVICE
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
int lockdown_connect_udid(const char* udid);
int lockdown_connect_handle(uint32_t handle);
void lockdown_disconnect(int fd);
int lockdown_check_type(int fd, const char* type_match);
int lockdown_get_uint_value(int fd, const char* domain, const char* key, uint64_t* value);
int lockdown_get_string_value(int fd, const char* domain, const char* key, char** value);
int lockdown_enter_recovery(int fd);
#ifdef __cplusplus
}
#endif
#endif
#endif
+5 -16
View File
@@ -33,10 +33,12 @@
#define OVERRIDE_MAGIC 0xd803b376
unsigned int verbose = 0;
char xargs_cmd[0x270] = "xargs ", palerain_flags_cmd[0x30] = "deadbeef";
/* we want to write to them so don't use string literals */
char xargs_cmd[0x270] = { 'x', 'a', 'r', 'g', 's', '\0' },
palerain_flags_cmd[0x30] = { 'd', 'e', 'a', 'd', 'b', 'e', 'e', 'f', '\0' };
extern char** environ;
niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo;
niarelap_file_t* kpf_to_upload_1 = &checkra1n_kpf_pongo_lzma;
niarelap_file_t* ramdisk_to_upload_1 = &ramdisk_dmg_lzma;
niarelap_file_t* overlay_to_upload_1 = &binpack_dmg;
@@ -74,19 +76,6 @@ int build_checks(void) {
if (boyermoore_horspool_memmem(&checkra1n[0], checkra1n_len, (const unsigned char *)"[ra1npoc15-part] thanks to", strlen("[ra1npoc15-part] thanks to")) != NULL) {
palerain_flags |= palerain_option_checkrain_is_clone;
}
#endif
#ifndef NO_KPF
struct mach_header_64 *kpf_hdr = (struct mach_header_64 *)checkra1n_kpf_pongo;
if (kpf_hdr->magic != MH_MAGIC_64 && kpf_hdr->magic != MH_CIGAM_64) {
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not thin 64-bit Mach-O");
return -1;
} else if (kpf_hdr->filetype != MH_KEXT_BUNDLE) {
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: Not a kext bundle");
return -1;
} else if (kpf_hdr->cputype != CPU_TYPE_ARM64) {
LOG(LOG_FATAL, "Broken build: Invalid kernel patchfinder: CPU type is not arm64");
return -1;
}
#endif
return 0;
}
@@ -135,7 +124,7 @@ int palera1n(int argc, char *argv[]) {
if (!(palerain_flags & palerain_option_device_info))
LOG(LOG_INFO, "Waiting for devices");
if (access("/var/run/usbmuxd", F_OK) != 0)
if (getenv("USBMUXD_SOCKET_ADDRESS") == NULL && access("/var/run/usbmuxd", F_OK) != 0)
LOG(LOG_WARNING, "/var/run/usbmuxd not found, normal mode device detection will not work.");
pthread_create(&pongo_thread, NULL, pongo_helper, NULL);
+1
View File
@@ -0,0 +1 @@
*.o
+1
View File
@@ -0,0 +1 @@
.
+15 -6
View File
@@ -200,7 +200,11 @@ int optparse(int argc, char* argv[]) {
return -1;
}
pongo_path = malloc(strlen(optarg) + 1);
strcpy(pongo_path, optarg);
if (pongo_path == NULL) {
LOG(LOG_FATAL, "memory allocation failed");
return -1;
}
snprintf(pongo_path, strlen(optarg) + 1, "%s", optarg);
break;
case 'o':
if (override_file(&override_overlay, overlay_to_upload, &binpack_dmg_len, optarg))
@@ -211,7 +215,7 @@ int optparse(int argc, char* argv[]) {
return 1;
break;
case 'K':
if (override_file(&override_kpf, kpf_to_upload, &checkra1n_kpf_pongo_len, optarg))
if (override_file(&override_kpf, kpf_to_upload, &checkra1n_kpf_pongo_lzma_len, optarg))
return 1;
struct mach_header_64* hdr = (struct mach_header_64*)override_kpf.ptr;
if (hdr->magic != MH_MAGIC_64 && hdr->magic != MH_CIGAM_64) {
@@ -323,19 +327,24 @@ int optparse(int argc, char* argv[]) {
if ((strstr(xargs_cmd, "serial=") != NULL) && !force_use_verbose_boot && (palerain_flags & palerain_option_setup_rootful)) {
palerain_flags &= ~palerain_option_verbose_boot;
}
if ((palerain_flags & (palerain_option_rootless | palerain_option_rootful)) == 0) {
LOG(LOG_FATAL, "must specify -l option");
return -1;
}
snprintf(palerain_flags_cmd, 0x30, "palera1n_flags 0x%" PRIx64, palerain_flags);
LOG(LOG_VERBOSE3, "palerain_flags: %s", palerain_flags_cmd);
if (override_kpf.magic == OVERRIDE_MAGIC) {
LOG(LOG_VERBOSE4, "kpf override length %u -> %u", override_kpf.orig_len, checkra1n_kpf_pongo_len);
LOG(LOG_VERBOSE4, "kpf override length %" PRIu32 " -> %" PRIu32, override_kpf.orig_len, checkra1n_kpf_pongo_lzma_len);
LOG(LOG_VERBOSE4, "kpf override ptr %p -> %p", override_kpf.orig_ptr, **kpf_to_upload);
}
if (override_ramdisk.magic == OVERRIDE_MAGIC) {
LOG(LOG_VERBOSE4, "ramdisk override length %u -> %u", override_ramdisk.orig_len, ramdisk_dmg_lzma_len);
LOG(LOG_VERBOSE4, "ramdisk override length %" PRIu32 " -> %" PRIu32, override_ramdisk.orig_len, ramdisk_dmg_lzma_len);
LOG(LOG_VERBOSE4, "ramdisk override ptr %p -> %p", override_ramdisk.orig_ptr, **ramdisk_to_upload);
}
if (override_overlay.magic == OVERRIDE_MAGIC) {
LOG(LOG_VERBOSE4, "overlay override length %u -> %u", override_overlay.orig_len, binpack_dmg_len);
LOG(LOG_VERBOSE4, "overlay override length %" PRIu32 " -> %" PRIu32, override_overlay.orig_len, binpack_dmg_len);
LOG(LOG_VERBOSE4, "overlay override ptr %p -> %p", override_overlay.orig_ptr, **overlay_to_upload);
}
@@ -360,7 +369,7 @@ int optparse(int argc, char* argv[]) {
if (!((palerain_flags & palerain_option_pongo_exit) || (palerain_flags & palerain_option_pongo_exit)))
{
#ifdef NO_KPF
if (checkra1n_kpf_pongo_len == 0)
if (checkra1n_kpf_pongo_lzma_len == 0)
{
LOG(LOG_FATAL, "kernel patchfinder omitted in build but no override specified");
return -1;
+8 -8
View File
@@ -41,20 +41,20 @@ void *pongo_usb_callback(stuff_t *arg) {
issue_pongo_command(handle, NULL);
issue_pongo_command(handle, "fuse lock");
issue_pongo_command(handle, "sep auto");
upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_len);
issue_pongo_command(handle, "modload");
issue_pongo_command(handle, palerain_flags_cmd);
if ((palerain_flags & palerain_option_rootful))
{
issue_pongo_command(handle, "rootfs");
upload_pongo_file(handle, **kpf_to_upload, checkra1n_kpf_pongo_lzma_len);
if (*kpf_to_upload == &checkra1n_kpf_pongo_lzma) {
issue_pongo_command(handle, "modload " KPF_UNCOMPRESSED_SIZE);
} else {
issue_pongo_command(handle, "modload");
}
issue_pongo_command(handle, palerain_flags_cmd);
#ifdef NO_RAMDISK
if (ramdisk_dmg_lzma_len != 0)
#endif
{
strncat(xargs_cmd, " rootdev=md0", 0x270 - strlen(xargs_cmd) - 1);
// strncat(xargs_cmd, " rootdev=md0", 0x270 - strlen(xargs_cmd) - 1);
upload_pongo_file(handle, **ramdisk_to_upload, ramdisk_dmg_lzma_len);
if (&(**ramdisk_to_upload) == &ramdisk_dmg_lzma)
if ((*ramdisk_to_upload) == &ramdisk_dmg_lzma)
issue_pongo_command(handle, "ramdisk " RAMDISK_UNCOMPRESSED_SIZE);
else {
issue_pongo_command(handle, "ramdisk");
+2
View File
@@ -0,0 +1,2 @@
*
!.gitignore
+5
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -99,3 +100,7 @@ out:
tui_started = false;
return 0;
}
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+6
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -13,3 +14,8 @@
#include <tui.h>
tui_screen_t tui_screen_enter_dfu(void) { return JAILBREAKING_SCREEN; }
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+6
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -13,3 +14,8 @@
#include <tui.h>
tui_screen_t tui_screen_enter_recovery(void) { return ENTER_DFU_SCREEN; }
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+6
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -13,3 +14,8 @@
#include <tui.h>
tui_screen_t tui_screen_jailbreak(void) { return EXIT_SCREEN; }
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+6
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -45,3 +46,8 @@ tui_screen_t tui_screen_main(void) {
newtFormDestroy(form);
return ret;
}
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+6
View File
@@ -1,3 +1,4 @@
#ifdef TUI
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
@@ -73,3 +74,8 @@ tui_screen_t tui_screen_options(void) {
newtFormDestroy(form);
return ret;
}
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+5
View File
@@ -24,6 +24,7 @@
* SOFTWARE.
*
*/
#ifndef USE_LIBUSB
#include <errno.h>
#include <fcntl.h> // open
#include <pthread.h>
@@ -250,3 +251,7 @@ int wait_for_pongo(void) {
CFRelease(cfdict);
return 0;
}
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif
+3
View File
@@ -264,4 +264,7 @@ int wait_for_pongo(void)
libusb_exit(ctx);
return 0;
}
#else
/* ISO C forbids an empty translation unit */
extern char** environ;
#endif