]> git.saurik.com Git - cycript.git/blob - Select.cpp
fc49e7caa556250428fab54dc3b8105978ea7942
[cycript.git] / Select.cpp
1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2013 Jay Freeman (saurik)
3 */
4
5 /* GNU General Public License, Version 3 {{{ */
6 /*
7 * Cycript is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation, either version 3 of the License,
10 * or (at your option) any later version.
11 *
12 * Cycript is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
19 **/
20 /* }}} */
21
22 #include <cstring>
23
24 #include <stdint.h>
25
26 #include <dlfcn.h>
27 #include <syslog.h>
28 #include <unistd.h>
29
30 #include <mach-o/dyld.h>
31
32 extern "C" void CYHandleServer(pid_t pid, char *data, size_t size) {
33 Dl_info addr;
34 if (dladdr(reinterpret_cast<void *>(&CYHandleServer), &addr) == 0)
35 return;
36
37 const char *fname(addr.dli_fname);
38 size_t length(strlen(fname));
39
40 const char *target;
41 #ifdef __APPLE__
42 // XXX: THIS IS HORRIBLE OMG I NEED TO FIX THIS ASAP
43 bool simulator(false);
44 for (uint32_t i(0), e(_dyld_image_count()); i != e; ++i) {
45 if (strstr(_dyld_get_image_name(i), "/SDKs/iPhoneSimulator") != NULL)
46 simulator = true;
47 }
48 if (simulator)
49 target = "sim";
50 else
51 #endif
52 // someone threw a fit about dangling #endif + else
53 // the idea that this bothers someone gives me glee
54 target = "sys";
55
56 char library[length + 1];
57 memcpy(library, fname, length);
58 memcpy(library + length - 6 - 3, target, 3);
59 library[length] = '\0';
60
61 void *handle(dlopen(library, RTLD_LOCAL | RTLD_LAZY));
62 if (handle == NULL) {
63 strlcpy(data, dlerror(), size);
64 return;
65 }
66
67 void *symbol(dlsym(handle, "CYHandleServer"));
68 if (symbol == NULL) {
69 strlcpy(data, dlerror(), size);
70 return;
71 }
72
73 reinterpret_cast<void (*)(pid_t)>(symbol)(pid);
74 }