mirror of
https://github.com/tihmstar/futurerestore.git
synced 2025-07-06 15:40:33 +00:00
Add really bad apple code to fix mac stuff
This commit is contained in:
parent
494989e367
commit
cb39cc2dae
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -65,3 +65,7 @@ src/idevicerestore
|
||||||
stamp-h1
|
stamp-h1
|
||||||
swig/*
|
swig/*
|
||||||
xcuserdata
|
xcuserdata
|
||||||
|
*.tar
|
||||||
|
*.zst
|
||||||
|
*.shsh2
|
||||||
|
*.shsh
|
||||||
|
|
|
@ -8,7 +8,7 @@ set(SUBPROJECT_BUILD 1)
|
||||||
set(ASAN_FLAG "")
|
set(ASAN_FLAG "")
|
||||||
if(DEFINED ASAN OR "$ENV{ASAN}" MATCHES "1")
|
if(DEFINED ASAN OR "$ENV{ASAN}" MATCHES "1")
|
||||||
set(ASAN 1)
|
set(ASAN 1)
|
||||||
set(ASAN_FLAG -fsanitize=address)
|
set(ASAN_FLAG "-fsanitize=address -fsanitize-address-use-after-scope -fno-omit-frame-pointer")
|
||||||
set(CMAKE_C_LINK_LIBRARY_FLAG "${ASAN_FLAG}")
|
set(CMAKE_C_LINK_LIBRARY_FLAG "${ASAN_FLAG}")
|
||||||
endif()
|
endif()
|
||||||
if("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Darwin")
|
if("${CMAKE_HOST_SYSTEM_NAME}" MATCHES "Darwin")
|
||||||
|
|
|
@ -104,7 +104,7 @@ std::string sepTempPath = futurerestoreTempPath + "/sep.im4p";
|
||||||
std::string sepManifestTempPath = futurerestoreTempPath + "/sepManifest.plist";
|
std::string sepManifestTempPath = futurerestoreTempPath + "/sepManifest.plist";
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
|
#include <sys/sysctl.h>
|
||||||
# include <CommonCrypto/CommonDigest.h>
|
# include <CommonCrypto/CommonDigest.h>
|
||||||
|
|
||||||
# define SHA1(d, n, md) CC_SHA1(d, n, md)
|
# define SHA1(d, n, md) CC_SHA1(d, n, md)
|
||||||
|
@ -155,6 +155,9 @@ bool futurerestore::init() {
|
||||||
info("[INFO] 64-bit device detected\n");
|
info("[INFO] 64-bit device detected\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef __APPLE__
|
||||||
|
daemonManager(false);
|
||||||
|
#endif
|
||||||
return _didInit;
|
return _didInit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1386,6 +1389,128 @@ void futurerestore::doRestore(const char *ipsw) {
|
||||||
else retassure(!(result), "ERROR: Unable to restore device\n");
|
else retassure(!(result), "ERROR: Unable to restore device\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
// Borrowed from apple killall.c
|
||||||
|
int futurerestore::findProc(const char *procName) {
|
||||||
|
struct kinfo_proc *procs = nullptr, *procs2 = nullptr;
|
||||||
|
int mib[4];
|
||||||
|
size_t mibLen, size = 0;
|
||||||
|
mib[0] = CTL_KERN;
|
||||||
|
mib[1] = KERN_PROC;
|
||||||
|
mib[2] = KERN_PROC_ALL;
|
||||||
|
mib[3] = 0;
|
||||||
|
mibLen = 3;
|
||||||
|
int ctlRet = 0;
|
||||||
|
do {
|
||||||
|
ctlRet = sysctl(mib, mibLen, nullptr, &size, nullptr, 0);
|
||||||
|
if (ctlRet < 0) {
|
||||||
|
info("daemonManager: findProc: failed sysctl(KERN_PROC)!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!size) {
|
||||||
|
info("daemonManager: findProc: failed sysctl(KERN_PROC) size!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
size += size / 10;
|
||||||
|
procs2 = static_cast<kinfo_proc *>(realloc(procs, size));
|
||||||
|
if (!procs2) {
|
||||||
|
info("daemonManager: findProc: realloc failed!\n");
|
||||||
|
safeFree(procs);
|
||||||
|
safeFree(procs2);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
procs = procs2;
|
||||||
|
ctlRet = sysctl(mib, mibLen, procs, &size, nullptr, 0);
|
||||||
|
} while(ctlRet < 0 && errno == ENOMEM);
|
||||||
|
int nprocs = size / sizeof(struct kinfo_proc);
|
||||||
|
int pid = 0;
|
||||||
|
char *cmd;
|
||||||
|
for(int i = 0; i < nprocs; i++) {
|
||||||
|
if (procs[i].kp_proc.p_stat == SZOMB) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
pid = procs[i].kp_proc.p_pid;
|
||||||
|
char *procArgs = nullptr, *foundProc = nullptr;
|
||||||
|
int mib2[3], argMax;
|
||||||
|
size_t sysSize;
|
||||||
|
mib2[0] = CTL_KERN;
|
||||||
|
mib2[1] = KERN_ARGMAX;
|
||||||
|
sysSize = sizeof(argMax);
|
||||||
|
if (sysctl(mib2, 2, &argMax, &sysSize, nullptr, 0) == -1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
procArgs = static_cast<char *>(malloc(argMax));
|
||||||
|
if (procArgs == nullptr) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mib2[0] = CTL_KERN;
|
||||||
|
mib2[1] = KERN_PROCARGS2;
|
||||||
|
mib2[2] = pid;
|
||||||
|
sysSize = (size_t)argMax;
|
||||||
|
if (sysctl(mib2, 3, procArgs, &sysSize, nullptr, 0) == -1) {
|
||||||
|
safeFree(procArgs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (foundProc = procArgs; foundProc < &procArgs[sysSize]; foundProc++) {
|
||||||
|
if (*foundProc == '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundProc == &procArgs[sysSize]) {
|
||||||
|
free(procArgs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (; foundProc < &procArgs[sysSize]; foundProc++) {
|
||||||
|
if (*foundProc != '\0') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foundProc == &procArgs[sysSize]) {
|
||||||
|
free(procArgs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strip off any path that was specified */
|
||||||
|
for(cmd = foundProc; (foundProc < &procArgs[sysSize]) && (*foundProc != '\0'); foundProc++) {
|
||||||
|
if (*foundProc == '/') {
|
||||||
|
cmd = foundProc + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (strcmp(cmd, procName) == 0) {
|
||||||
|
info("daemonManager: findProc: found %s!\n", procName);
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void futurerestore::daemonManager(bool load) {
|
||||||
|
if(!load) {
|
||||||
|
info("daemonManager: suspending invasive macOS daemons...\n");
|
||||||
|
}
|
||||||
|
int pid = 0;
|
||||||
|
const char *procList[] = { "MobileDeviceUpdater", "AMPDevicesAgent", "AMPDeviceDiscoveryAgent", 0};
|
||||||
|
for(int i = 0; i < 3; i++) {
|
||||||
|
pid = findProc(procList[i]);
|
||||||
|
if (pid > 1) {
|
||||||
|
info("daemonManager: killing %s.\n", procList[i]);
|
||||||
|
if (load) {
|
||||||
|
int ret = kill(pid, SIGCONT);
|
||||||
|
} else {
|
||||||
|
int ret = kill(pid, SIGSTOP);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!load) {
|
||||||
|
info("daemonManager: done!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
futurerestore::~futurerestore() {
|
futurerestore::~futurerestore() {
|
||||||
recovery_client_free(_client);
|
recovery_client_free(_client);
|
||||||
idevicerestore_client_free(_client);
|
idevicerestore_client_free(_client);
|
||||||
|
@ -1404,6 +1529,9 @@ futurerestore::~futurerestore() {
|
||||||
}
|
}
|
||||||
safeFreeCustom(_sepbuildmanifest, plist_free);
|
safeFreeCustom(_sepbuildmanifest, plist_free);
|
||||||
safeFreeCustom(_basebandbuildmanifest, plist_free);
|
safeFreeCustom(_basebandbuildmanifest, plist_free);
|
||||||
|
#ifdef __APPLE__
|
||||||
|
daemonManager(true);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void futurerestore::loadFirmwareTokens() {
|
void futurerestore::loadFirmwareTokens() {
|
||||||
|
|
|
@ -158,6 +158,11 @@ public:
|
||||||
|
|
||||||
void doRestore(const char *ipsw);
|
void doRestore(const char *ipsw);
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
static int findProc(const char *procName);
|
||||||
|
void daemonManager(bool load);
|
||||||
|
#endif
|
||||||
|
|
||||||
~futurerestore();
|
~futurerestore();
|
||||||
|
|
||||||
static std::pair<const char *,size_t> getRamdiskHashFromSCAB(const char* scab, size_t scabSize);
|
static std::pair<const char *,size_t> getRamdiskHashFromSCAB(const char* scab, size_t scabSize);
|
||||||
|
|
Loading…
Reference in a new issue