X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/6342b70c4b8e5f41fc61d2b78ff0cbfe107be3cb..9968a2d6394d8d1c1724e78068a11490d790c20f:/Mach/Inject.cpp diff --git a/Mach/Inject.cpp b/Mach/Inject.cpp index 840dc63..feb2c3c 100644 --- a/Mach/Inject.cpp +++ b/Mach/Inject.cpp @@ -22,7 +22,20 @@ #include #include + +#ifdef __APPLE__ +#include "TargetConditionals.h" +#endif + +#ifdef TARGET_OS_IPHONE +#include +#define mach_vm_allocate vm_allocate +#define mach_vm_protect vm_protect +#define mach_vm_write vm_write +#define mach_vm_address_t vm_address_t +#else #include +#endif #include @@ -40,7 +53,13 @@ extern "C" void CYHandleServer(pid_t); void InjectLibrary(pid_t pid) { Dl_info addr; _assert(dladdr(reinterpret_cast(&CYHandleServer), &addr) != 0); - const char *library(addr.dli_fname); + + size_t flength(strlen(addr.dli_fname)); + char library[flength + 4 + 1]; + memcpy(library, addr.dli_fname, flength); + library[flength] = '\0'; + _assert(strcmp(library + flength - 6, ".dylib") == 0); + strcpy(library + flength - 6, "-any.dylib"); mach_port_t self(mach_task_self()), task; _krncall(task_for_pid(self, pid, &task)); @@ -56,23 +75,18 @@ void InjectLibrary(pid_t pid) { thread_act_t thread; _krncall(thread_create(task, &thread)); - thread_state_flavor_t flavor; #if defined (__i386__) || defined(__x86_64__) x86_thread_state_t state; - flavor = x86_THREAD_STATE; - count = x86_THREAD_STATE_COUNT; #elif defined(__arm__) arm_thread_state_t state; - flavor = ARM_THREAD_STATE; - count = ARM_THREAD_STATE_COUNT; #else #error XXX: implement #endif memset(&state, 0, sizeof(state)); - mach_msg_type_number_t read(count); - _krncall(thread_get_state(thread, flavor, reinterpret_cast(&state), &read)); - _assert(read == count); + mach_msg_type_number_t read(MACHINE_THREAD_STATE_COUNT); + _krncall(thread_get_state(thread, MACHINE_THREAD_STATE, reinterpret_cast(&state), &read)); + _assert(read == MACHINE_THREAD_STATE_COUNT); Trampoline *trampoline; size_t align; @@ -160,7 +174,7 @@ void InjectLibrary(pid_t pid) { if (sizeof(frame) != 0) _krncall(mach_vm_write(task, stack + Stack_ - sizeof(frame), reinterpret_cast(frame), sizeof(frame))); - _krncall(thread_set_state(thread, flavor, reinterpret_cast(&state), count)); + _krncall(thread_set_state(thread, MACHINE_THREAD_STATE, reinterpret_cast(&state), MACHINE_THREAD_STATE_COUNT)); _krncall(thread_resume(thread)); _krncall(mach_port_deallocate(self, task));