]> git.saurik.com Git - cycript.git/commitdiff
Copy libdyld error messages back from injection.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 4 Jan 2014 05:37:04 +0000 (21:37 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 4 Jan 2014 05:37:04 +0000 (21:37 -0800)
Baton.hpp
Mach/Inject.cpp
Mach/Memory.hpp
Trampoline.t.cpp

index 3d2989357e6bace9d14cc3eab8974bd79d16d9ba..696a94dee8f714319bce4c7da259a78b1246a953 100644 (file)
--- a/Baton.hpp
+++ b/Baton.hpp
@@ -28,5 +28,6 @@
 struct Baton {
     uint64_t dyld;
     pid_t pid;
+    char error[1024];
     char library[];
 } _packed;
index 50ad0f8c368a5582ff60cc4fb4305f8d268d988a..982ffe405964be894db3f19bffb327ce56fbbdef 100644 (file)
@@ -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<mach_vm_address_t>(&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));
 
index ed31a8d8bd2607d7989eff067629cfd893af5b38..47e376d48c5a60c19a401f0399fab414196e80e4 100644 (file)
@@ -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);
index 1bcbb18c9afcf1de9181d05b5f52528111b99b0f..0ae088d3c0d77c90e549e56a153b6e559e5b1875 100644 (file)
@@ -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<void (*)(pid_t)>($dlsym(handle, "CYHandleServer"));
     if (CYHandleServer == NULL) {
-        $dlerror();
+        $strlcpy(baton->error, $dlerror(), sizeof(baton->error));
         return NULL;
     }