From 8964aa089c709fbf370be623d75a204480b26b3c Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Fri, 3 Jan 2014 21:37:04 -0800 Subject: [PATCH] Copy libdyld error messages back from injection. --- Baton.hpp | 1 + Mach/Inject.cpp | 6 ++++++ Mach/Memory.hpp | 12 ++++++++++++ Trampoline.t.cpp | 16 ++++++++++++++-- 4 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Baton.hpp b/Baton.hpp index 3d29893..696a94d 100644 --- a/Baton.hpp +++ b/Baton.hpp @@ -28,5 +28,6 @@ struct Baton { uint64_t dyld; pid_t pid; + char error[1024]; char library[]; } _packed; diff --git a/Mach/Inject.cpp b/Mach/Inject.cpp index 50ad0f8..982ffe4 100644 --- a/Mach/Inject.cpp +++ b/Mach/Inject.cpp @@ -288,6 +288,12 @@ void InjectLibrary(pid_t pid) { _krncall(mach_port_deallocate(self, thread)); + mach_vm_size_t error(sizeof(baton->error)); + _krncall(mach_vm_read_overwrite(task, data + offsetof(Baton, error), sizeof(baton->error), reinterpret_cast(&baton->error), &error)); + _assert(error == sizeof(baton->error)); + if (baton->error[0] != '\0') + CYThrow("%s", baton->error); + _krncall(mach_vm_deallocate(task, code, trampoline->size_)); _krncall(mach_vm_deallocate(task, stack, size)); diff --git a/Mach/Memory.hpp b/Mach/Memory.hpp index ed31a8d..47e376d 100644 --- a/Mach/Memory.hpp +++ b/Mach/Memory.hpp @@ -31,6 +31,18 @@ static kern_return_t cy_vm_protect(bool broken, vm_map_t target_task, mach_vm_ad #define mach_vm_protect(a, b, c, d, e) \ cy_vm_protect(broken, a, b, c, d, e) +static kern_return_t cy_vm_read_overwrite(bool broken, vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, mach_vm_address_t data, mach_vm_size_t *outsize) { + if (!broken) + return mach_vm_read_overwrite(target_task, address, size, data, outsize); + vm_size_t outsize32(*outsize); + kern_return_t value(vm_read_overwrite(target_task, address, data, size, &outsize32)); + *outsize = outsize32; + return value; +} + +#define mach_vm_read_overwrite(a, b, c, d, e) \ + cy_vm_read_overwrite(broken, a, b, c, d, e) + static kern_return_t cy_vm_write(bool broken, vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt) { if (!broken) return mach_vm_write(target_task, address, data, dataCnt); diff --git a/Trampoline.t.cpp b/Trampoline.t.cpp index 1bcbb18..0ae088d 100644 --- a/Trampoline.t.cpp +++ b/Trampoline.t.cpp @@ -52,6 +52,18 @@ static int $strcmp(const char *lhs, const char *rhs) { } return *lhs < *rhs ? -1 : 1; } +static void $strlcpy(char *dst, const char *src, size_t size) { + if (size == 0) + return; + size_t i(0); + while (i != size - 1) { + char value(src[i]); + if (value == '\0') + break; + dst[i++] = value; + } dst[i] = '\0'; +} + #ifdef __LP64__ typedef struct mach_header_64 mach_header_xx; typedef struct nlist_64 nlist_xx; @@ -177,7 +189,7 @@ void *Routine(void *arg) { void *handle($dlopen(baton->library, RTLD_LAZY | RTLD_LOCAL)); if (handle == NULL) { - $dlerror(); + $strlcpy(baton->error, $dlerror(), sizeof(baton->error)); return NULL; } @@ -187,7 +199,7 @@ void *Routine(void *arg) { void (*CYHandleServer)(pid_t); CYHandleServer = reinterpret_cast($dlsym(handle, "CYHandleServer")); if (CYHandleServer == NULL) { - $dlerror(); + $strlcpy(baton->error, $dlerror(), sizeof(baton->error)); return NULL; } -- 2.47.2