From: Jay Freeman (saurik) Date: Mon, 4 Apr 2011 19:53:24 +0000 (+0000) Subject: Restructure Mach/Inject for iOS 4.3. X-Git-Tag: v0.9.432^0 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/b4b71b79d0712e76e649ad06eb76246071175fd1?hp=57a654311816f082f436e963fab03cd1edc31e2e Restructure Mach/Inject for iOS 4.3. --- diff --git a/Baton.hpp b/Baton.hpp index 3ce4e62..d930121 100644 --- a/Baton.hpp +++ b/Baton.hpp @@ -24,18 +24,11 @@ #include struct Baton { - void (*__pthread_set_self)(pthread_t); + void (*_pthread_start)(pthread_t, mach_port_t, void *(*)(void *), void *, size_t, unsigned int); - int (*pthread_create)(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *); - int (*pthread_join)(pthread_t, void **); - - void *(*dlopen)(const char *, int); char *(*dlerror)(); void *(*dlsym)(void *, const char *); - mach_port_t (*mach_thread_self)(); - kern_return_t (*thread_terminate)(thread_act_t); - pid_t pid; char library[]; }; diff --git a/Darwin-arm.mk b/Darwin-arm.mk index cc97077..6c24e6e 100644 --- a/Darwin-arm.mk +++ b/Darwin-arm.mk @@ -9,6 +9,7 @@ depends += apr-lib readline libffi mobilesubstrate library += -framework WebCore # XXX: all Darwin, maybe all device, should have this library += -lsubstrate +console += -lsubstrate ldid := ldid -S entitle := ldid -Scycript.xml diff --git a/Mach/Inject.cpp b/Mach/Inject.cpp index 45c33be..92a395e 100644 --- a/Mach/Inject.cpp +++ b/Mach/Inject.cpp @@ -33,7 +33,9 @@ #include "Pooling.hpp" #include "Trampoline.t.hpp" -extern "C" void __pthread_set_self(pthread_t); +#include + +extern "C" void _pthread_start(pthread_t, mach_port_t, void *(*)(void *), void *, size_t, unsigned int); void InjectLibrary(pid_t pid) { const char *library(CY_LIBRARY); @@ -46,18 +48,10 @@ void InjectLibrary(pid_t pid) { uint8_t *local(reinterpret_cast(apr_palloc(pool, depth))); Baton *baton(reinterpret_cast(local)); - baton->__pthread_set_self = &__pthread_set_self; - - baton->pthread_create = &pthread_create; - baton->pthread_join = &pthread_join; - - baton->dlopen = &dlopen; + baton->_pthread_start = reinterpret_cast(MSFindSymbol(NULL, "__pthread_start")); baton->dlerror = &dlerror; baton->dlsym = &dlsym; - baton->mach_thread_self = &mach_thread_self; - baton->thread_terminate = &thread_terminate; - baton->pid = getpid(); memcpy(baton->library, library, length); @@ -109,7 +103,8 @@ void InjectLibrary(pid_t pid) { _krncall(vm_protect(task, code, trampoline->size_, false, VM_PROT_READ | VM_PROT_EXECUTE)); /* - printf("_ptss:%p\n", baton->__pthread_set_self); + printf("_pts:%p\n", baton->_pthread_start); + printf("dlerror:%p\n", baton->dlerror); printf("dlsym:%p\n", baton->dlsym); printf("code:%zx\n", (size_t) code); */ diff --git a/Trampoline.t.cpp b/Trampoline.t.cpp index e52962a..7229c25 100644 --- a/Trampoline.t.cpp +++ b/Trampoline.t.cpp @@ -35,7 +35,7 @@ static _finline void dlset(Baton *baton, Type_ &function, const char *name, void #define Framework(framework) \ "/System/Library/Frameworks/" #framework ".framework/" #framework -void *Routine(void *arg) { +static void *Routine(void *arg) { Baton *baton(reinterpret_cast(arg)); void *(*dlopen)(const char *, int); @@ -64,37 +64,25 @@ void *Routine(void *arg) { return NULL; } -static void $bzero(void *data, size_t size) { - char *bytes(reinterpret_cast(data)); - for (size_t i(0); i != size; ++i) - bytes[i] = 0; -} - -extern "C" void Start(Baton *baton) { - struct _pthread self; - $bzero(&self, sizeof(self)); - - // this code comes from _pthread_set_self - self.tsd[0] = &self; - baton->__pthread_set_self(&self); +static void *Thread(void *arg) { + Baton *baton(reinterpret_cast(arg)); int (*pthread_create)(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *); dlset(baton, pthread_create, "pthread_create"); pthread_t thread; - baton->pthread_create(&thread, NULL, &Routine, baton); + pthread_create(&thread, NULL, &Routine, baton); int (*pthread_join)(pthread_t, void **); dlset(baton, pthread_join, "pthread_join"); void *result; - baton->pthread_join(thread, &result); + pthread_join(thread, &result); - mach_port_t (*mach_thread_self)(); - dlset(baton, mach_thread_self, "mach_thread_self"); - - kern_return_t (*thread_terminate)(thread_act_t); - dlset(baton, thread_terminate, "thread_terminate"); + return NULL; +} - baton->thread_terminate(baton->mach_thread_self()); +extern "C" void Start(Baton *baton) { + struct _pthread self; + baton->_pthread_start(&self, NULL, &Thread, baton, 8 * 1024, 0); }