mirror of
https://github.com/palera1n/palera1n.git
synced 2026-10-21 09:47:01 +02:00
Execute checkra1n
This commit is contained in:
1 parent
752d32600c
commit
3ea3ea0ce9
8 files changed
+79
-13
No files matched your search
@@ -6,3 +6,5 @@ contrib/
|
||||
*.o
|
||||
.vscode
|
||||
checkra1n*
|
||||
payload.c
|
||||
src/palera1n
|
||||
@@ -1,7 +1,7 @@
|
||||
SRC = $(shell pwd)
|
||||
DEP = $(SRC)/dep_root
|
||||
CC = cc
|
||||
CFLAGS = -mmacosx-version-min=12.0 -I$(DEP)/include -I/opt/procursus/include -I$(SRC)/include -g -O0 -Wall -Wextra
|
||||
CFLAGS = -mmacosx-version-min=12.0 -I$(DEP)/include -I/opt/procursus/include -I$(SRC)/include -I$(SRC) -g -O0 -Wall -Wextra
|
||||
LIBS = $(DEP)/lib/libimobiledevice-1.0.a $(DEP)/lib/libirecovery-1.0.a $(DEP)/lib/libusbmuxd-2.0.a $(DEP)/lib/libplist-2.0.a $(DEP)/lib/libimobiledevice-glue-1.0.a -pthread
|
||||
LIBS += $(DEP)/lib/libcrypto.35.tbd $(DEP)/lib/libssl.35.tbd
|
||||
LIBS += -framework CoreFoundation -framework SystemConfiguration -framework IOKit
|
||||
|
||||
+4
-1
@@ -1,10 +1,13 @@
|
||||
all: palera1n
|
||||
|
||||
OBJECTS = main.o dfuhelper.o lockdown_helper.o devhelper.o
|
||||
OBJECTS = main.o dfuhelper.o lockdown_helper.o devhelper.o exec_checkra1n.o checkra1n.o
|
||||
|
||||
%.o: %.c
|
||||
$(CC) -c $(CFLAGS) $<
|
||||
|
||||
checkra1n.c: checkra1n
|
||||
xxd -iC checkra1n > checkra1n.c
|
||||
|
||||
palera1n: $(OBJECTS)
|
||||
$(CC) $(OBJECTS) $(CFLAGS) $(LDFLAGS) -o palera1n
|
||||
|
||||
|
||||
@@ -57,4 +57,5 @@ int recvinfo_cmd(recvinfo_t* info, const uint64_t ecid);
|
||||
int autoboot_cmd(const uint64_t ecid);
|
||||
int exitrecv_cmd(const uint64_t ecid);
|
||||
|
||||
void exec_checkra1n();
|
||||
#endif
|
||||
+14
-11
@@ -40,7 +40,7 @@ void step(int time, int time2, char *text, bool (*cond)(uint64_t), uint64_t cond
|
||||
printf(CYN "\r\e[K%s (%d)" CRESET, text, time - i + time2);
|
||||
fflush(stdout);
|
||||
sleep(1);
|
||||
if (cond != NULL && cond(cond_arg)) return;
|
||||
if (cond != NULL && cond(cond_arg)) pthread_exit(NULL);
|
||||
}
|
||||
printf(CYN "\r%s (%d)" CRESET, text, time2);
|
||||
if (time2 == 0) puts("");
|
||||
@@ -80,11 +80,12 @@ int connected_normal_mode(const usbmuxd_device_info_t *usbmuxd_device) {
|
||||
}
|
||||
|
||||
static bool conditional(uint64_t ecid) {
|
||||
return ecid_wait_for_dfu == ecid;
|
||||
return ecid_wait_for_dfu != ecid;
|
||||
}
|
||||
|
||||
void* connected_recovery_mode(struct irecv_device_info* info) {
|
||||
int ret;
|
||||
uint64_t ecid;
|
||||
if (!cpid_is_arm64(info->cpid)) {
|
||||
LOG(LOG_WARNING, "Ignoring non-arm64 device...");
|
||||
return NULL;
|
||||
@@ -109,17 +110,18 @@ void* connected_recovery_mode(struct irecv_device_info* info) {
|
||||
}
|
||||
printf("\r\e[K");
|
||||
ecid_wait_for_dfu = info->ecid;
|
||||
ecid = info->ecid;
|
||||
bool nohome = NOHOME;
|
||||
if (nohome)
|
||||
step(2, 0, "Hold Volume Down + Side button", NULL, 0);
|
||||
else
|
||||
step(2, 0, "Hold Home + Power Button", NULL, 0);
|
||||
if (nohome)
|
||||
step(10, 0, "Hold Volume Down button", conditional, info->ecid);
|
||||
step(10, 0, "Hold Volume Down button", conditional, ecid);
|
||||
else
|
||||
step(10, 0, "Hold Home button", conditional, info->ecid);
|
||||
step(10, 0, "Hold Home button", conditional, ecid);
|
||||
ecid_wait_for_dfu = 0;
|
||||
if (ecid_wait_for_dfu != info->ecid) {
|
||||
LOG(LOG_INFO, "Device entered DFU mode successfully");
|
||||
} else {
|
||||
LOG(LOG_WARNING, "Whoops, device did not enter DFU mode");
|
||||
LOG(LOG_INFO, "Waiting for device to reconnect...");
|
||||
@@ -129,9 +131,11 @@ void* connected_recovery_mode(struct irecv_device_info* info) {
|
||||
}
|
||||
|
||||
void* connected_dfu_mode(struct irecv_device_info* info) {
|
||||
|
||||
if (ecid_wait_for_dfu == info->ecid) {
|
||||
ecid_wait_for_dfu = 0;
|
||||
LOG(LOG_INFO, "Device entered DFU mode successfully");
|
||||
}
|
||||
unsubscribe_cmd();
|
||||
if (ecid_wait_for_dfu == info->ecid) ecid_wait_for_dfu = 0;
|
||||
spin = 0;
|
||||
return NULL;
|
||||
}
|
||||
@@ -150,6 +154,7 @@ void device_event_cb(const usbmuxd_event_t *event, void *userdata) {
|
||||
|
||||
void irecv_device_event_cb(const irecv_device_event_t *event, void *userdata) {
|
||||
pthread_t recovery_thread, dfu_thread;
|
||||
|
||||
switch(event->type) {
|
||||
case IRECV_DEVICE_ADD:
|
||||
if (event->mode == IRECV_K_RECOVERY_MODE_1 || event->mode == IRECV_K_RECOVERY_MODE_2 || event->mode == IRECV_K_RECOVERY_MODE_3 || event->mode == IRECV_K_RECOVERY_MODE_4) {
|
||||
@@ -161,10 +166,8 @@ void irecv_device_event_cb(const irecv_device_event_t *event, void *userdata) {
|
||||
}
|
||||
break;
|
||||
case IRECV_DEVICE_REMOVE:
|
||||
if (event->mode == IRECV_K_RECOVERY_MODE_1 || event->mode == IRECV_K_RECOVERY_MODE_2 || event->mode == IRECV_K_RECOVERY_MODE_3 || event->mode == IRECV_K_RECOVERY_MODE_4) {
|
||||
LOG(LOG_VERBOSE, "Recovery mode device %ld disconnected", event->device_info->serial_string);
|
||||
} else if (event->mode == IRECV_K_DFU_MODE) {
|
||||
LOG(LOG_VERBOSE, "DFU mode device %ld disconnected", event->device_info->ecid);
|
||||
if (event->device_info->ecid == ecid_wait_for_dfu) {
|
||||
LOG(LOG_VERBOSE, "Recovery mode device %ld disconnected", event->device_info->ecid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
#include <unistd.h>
|
||||
#include <spawn.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
extern char **environ;
|
||||
|
||||
#include "common.h"
|
||||
#include "checkra1n.h"
|
||||
|
||||
void exec_checkra1n() {
|
||||
LOG(LOG_INFO, "About to execute checkra1n");
|
||||
int fd, ret;
|
||||
char checkra1n_path[] = "/tmp/checkra1n.XXXXXX";
|
||||
fd = mkstemp(checkra1n_path);
|
||||
if (fd == -1) {
|
||||
LOG(LOG_FATAL, "Cannot open temporary file: %d (%s)", errno, strerror(errno));
|
||||
return;
|
||||
}
|
||||
ssize_t didWrite = write(fd, checkra1n, checkra1n_len);
|
||||
if (didWrite != checkra1n_len) {
|
||||
LOG(LOG_FATAL, "Size written does not match expected: %lld != %d: %d (%s)", didWrite, checkra1n_len, errno, strerror(errno));
|
||||
close(fd);
|
||||
unlink(checkra1n_path);
|
||||
return;
|
||||
}
|
||||
close(fd);
|
||||
ret = chmod(checkra1n_path, 0700);
|
||||
if (ret) {
|
||||
LOG(LOG_FATAL, "Cannot chmod %s: %d (%s)", checkra1n_path, errno, strerror(errno));
|
||||
unlink(checkra1n_path);
|
||||
}
|
||||
char* checkra1n_qrgv[] = {
|
||||
checkra1n_path,
|
||||
"-pVE",
|
||||
NULL
|
||||
};
|
||||
pid_t pid;
|
||||
ret = posix_spawn(&pid, checkra1n_path, NULL, NULL, checkra1n_qrgv, environ);
|
||||
if (ret) {
|
||||
LOG(LOG_FATAL, "Cannot posix spawn %s: %d (%s)", checkra1n_path, errno, strerror(errno));
|
||||
unlink(checkra1n_path);
|
||||
}
|
||||
unlink(checkra1n_path);
|
||||
waitpid(pid, NULL, 0);
|
||||
return;
|
||||
}
|
||||
@@ -57,5 +57,6 @@ int main(int argc, char* argv[]) {
|
||||
pthread_t dfuhelper_thread;
|
||||
pthread_create(&dfuhelper_thread, NULL, dfuhelper, NULL);
|
||||
pthread_join(dfuhelper_thread, NULL);
|
||||
exec_checkra1n();
|
||||
return 0;
|
||||
}
|
||||
Binary file not shown.
Reference in new issue
Block a user