From 49e976ae47b9d4bb43b102466140c4229a5ac0ca Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 20 May 2011 06:58:49 +0000 Subject: [PATCH] Revert "Restructure Mach/Inject for iOS 4.3." --- Baton.hpp | 9 ++++++++- Darwin-arm.mk | 1 - Mach/Inject.cpp | 17 +++++++++++------ Trampoline.t.cpp | 32 ++++++++++++++++++++++---------- 4 files changed, 41 insertions(+), 18 deletions(-) diff --git a/Baton.hpp b/Baton.hpp index d930121..3ce4e62 100644 --- a/Baton.hpp +++ b/Baton.hpp @@ -24,11 +24,18 @@ #include struct Baton { - void (*_pthread_start)(pthread_t, mach_port_t, void *(*)(void *), void *, size_t, unsigned int); + void (*__pthread_set_self)(pthread_t); + 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 6c24e6e..cc97077 100644 --- a/Darwin-arm.mk +++ b/Darwin-arm.mk @@ -9,7 +9,6 @@ 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 92a395e..45c33be 100644 --- a/Mach/Inject.cpp +++ b/Mach/Inject.cpp @@ -33,9 +33,7 @@ #include "Pooling.hpp" #include "Trampoline.t.hpp" -#include - -extern "C" void _pthread_start(pthread_t, mach_port_t, void *(*)(void *), void *, size_t, unsigned int); +extern "C" void __pthread_set_self(pthread_t); void InjectLibrary(pid_t pid) { const char *library(CY_LIBRARY); @@ -48,10 +46,18 @@ void InjectLibrary(pid_t pid) { uint8_t *local(reinterpret_cast(apr_palloc(pool, depth))); Baton *baton(reinterpret_cast(local)); - baton->_pthread_start = reinterpret_cast(MSFindSymbol(NULL, "__pthread_start")); + baton->__pthread_set_self = &__pthread_set_self; + + baton->pthread_create = &pthread_create; + baton->pthread_join = &pthread_join; + + baton->dlopen = &dlopen; 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); @@ -103,8 +109,7 @@ void InjectLibrary(pid_t pid) { _krncall(vm_protect(task, code, trampoline->size_, false, VM_PROT_READ | VM_PROT_EXECUTE)); /* - printf("_pts:%p\n", baton->_pthread_start); - printf("dlerror:%p\n", baton->dlerror); + printf("_ptss:%p\n", baton->__pthread_set_self); printf("dlsym:%p\n", baton->dlsym); printf("code:%zx\n", (size_t) code); */ diff --git a/Trampoline.t.cpp b/Trampoline.t.cpp index 7229c25..e52962a 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 -static void *Routine(void *arg) { +void *Routine(void *arg) { Baton *baton(reinterpret_cast(arg)); void *(*dlopen)(const char *, int); @@ -64,25 +64,37 @@ static void *Routine(void *arg) { return NULL; } -static void *Thread(void *arg) { - Baton *baton(reinterpret_cast(arg)); +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); int (*pthread_create)(pthread_t *, const pthread_attr_t *, void *(*)(void *), void *); dlset(baton, pthread_create, "pthread_create"); pthread_t thread; - pthread_create(&thread, NULL, &Routine, baton); + baton->pthread_create(&thread, NULL, &Routine, baton); int (*pthread_join)(pthread_t, void **); dlset(baton, pthread_join, "pthread_join"); void *result; - pthread_join(thread, &result); + baton->pthread_join(thread, &result); - return NULL; -} + mach_port_t (*mach_thread_self)(); + dlset(baton, mach_thread_self, "mach_thread_self"); -extern "C" void Start(Baton *baton) { - struct _pthread self; - baton->_pthread_start(&self, NULL, &Thread, baton, 8 * 1024, 0); + kern_return_t (*thread_terminate)(thread_act_t); + dlset(baton, thread_terminate, "thread_terminate"); + + baton->thread_terminate(baton->mach_thread_self()); } -- 2.49.0