void ANativeActivity_onCreate(ANativeActivity * app, void * ud, size_t udsize) { //int main() { crazy_context_t* context = crazy_context_create(); crazy_library_t* library; crazy_library_t* library2; crazy_context_add_search_path_for_address(context, reinterpret_cast<void*>(&ANativeActivity_onCreate)); LOGI("Loaded boostrap"); // DEBUG //crazy_context_set_load_address(context, 0x20000000); if (!crazy_library_open(&library2, "libbass.so", context)) { LOGE("Could not open library: %s", crazy_context_get_error(context)); exit(1); // Panic("Could not open library: %s\n", crazy_context_get_error(context)); } LOGI("Loaded boostrap bass in"); // Load libfoo.so if (!crazy_library_open(&library, "libutekxp-armeabi.so", context)) { LOGE("Could not open library: %s", crazy_context_get_error(context)); exit(1); // Panic("Could not open library: %s\n", crazy_context_get_error(context)); } LOGI("Loaded boostrap 2"); // Find the "Foo" symbol. FunctionPtr foo_func; if (!crazy_library_find_symbol( library, "ANativeActivity_onCreate", reinterpret_cast<void**>(&foo_func))) { LOGE("Could not find 'Foo' in libfoo.so"); exit(1); //Panic("Could not find 'Foo' in libfoo.so\n"); } LOGI("Loaded boostrap3"); // Call it. (*foo_func)(app, ud, udsize); LOGI("Loaded boostrap4"); // Close the library. /* printf("Closing libfoo.so\n"); crazy_library_close(library); crazy_context_destroy(context);*/ }
int main() { crazy_context_t* context = crazy_context_create(); crazy_library_t* library; // DEBUG crazy_context_set_load_address(context, 0x20000000); // Load libbar.so if (!crazy_library_open(&library, "libbar.so", context)) { Panic("Could not open library: %s\n", crazy_context_get_error(context)); } // Find the "Bar" symbol. FunctionPtr bar_func; if (!crazy_library_find_symbol( library, "Bar", reinterpret_cast<void**>(&bar_func))) { Panic("Could not find 'Bar' in libbar.so\n"); } // Call it. (*bar_func)(); // Find the "Foo" symbol from libbar.so FunctionPtr foo_func; if (!crazy_library_find_symbol( library, "Foo", reinterpret_cast<void**>(&foo_func))) { Panic("Could not find 'Foo' from libbar.so\n"); } // Close the library. printf("Closing libbar.so\n"); crazy_library_close(library); crazy_context_destroy(context); return 0; }
int main() { crazy_context_t* context = crazy_context_create(); crazy_library_t* library; putenv("TEST_VAR=INIT"); // DEBUG crazy_context_set_load_address(context, 0x20000000); // Load libfoo.so if (!crazy_library_open( &library, "libfoo_with_static_constructor.so", context)) { Panic("Could not open library: %s\n", crazy_context_get_error(context)); } const char* env = getenv("TEST_VAR"); if (!env || strcmp(env, "LOADED")) Panic( "Constructors not run when loading libfoo_with_static_constructor.so"); // Find the "Foo" symbol. FunctionPtr foo_func; if (!crazy_library_find_symbol( library, "Foo", reinterpret_cast<void**>(&foo_func))) { Panic("Could not find 'Foo' in libfoo.so\n"); } // Call it. (*foo_func)(); // Close the library. printf("Closing libfoo_with_static_constructor.so\n"); crazy_library_close(library); env = getenv("TEST_VAR"); if (!env || strcmp(env, "UNLOADED")) Panic( "Destructors not run when unloading libfoo_with_static_constructor.so"); crazy_context_destroy(context); return 0; }
int main() { crazy_context_t* context = crazy_context_create(); RelroLibrary foo; int pipes[2]; if (socketpair(AF_UNIX, SOCK_STREAM, 0, pipes) < 0) Panic("Could not create socket pair: %s", strerror(errno)); pid_t child = fork(); if (child < 0) Panic("Could not fork test program!"); if (child == 0) { // In the child. crazy_context_set_load_address(context, CHILD_ADDRESS); foo.Init("libfoo_with_relro.so", context); printf("Child waiting for foo relro fd\n"); foo.ReceiveRelroInfo(pipes[0]); foo.UseSharedRelro(context); printf("RELRO used in child process\n"); CheckRelroMaps(1); FunctionPtr foo_func; if (!crazy_library_find_symbol( foo.library, "Foo", reinterpret_cast<void**>(&foo_func))) Panic("Could not find 'Foo' in library"); printf("Calling Foo()\n"); (*foo_func)(); printf("Foo called, exiting\n"); exit(0); } else { // In the parent. // Load at fixed address to simplify testing. crazy_context_set_load_address(context, PARENT_ADDRESS); foo.Init("libfoo_with_relro.so", context); printf("Library loaded\n"); printf("Parent enabling foo RELRO sharing\n"); foo.CreateSharedRelro(context, CHILD_ADDRESS); foo.SendRelroInfo(pipes[1]); printf("Relocated RELRO sent to child\n"); CheckRelroMaps(0); printf("Parent waiting for child\n"); // Wait for child to complete. int status; waitpid(child, &status, 0); if (WIFSIGNALED(status)) Panic("Child terminated by signal!!\n"); else if (WIFEXITED(status)) { int child_status = WEXITSTATUS(status); if (child_status != 0) Panic("Child terminated with status=%d\n", child_status); } else Panic("Child exited for unknown reason!!\n"); } crazy_context_destroy(context); return 0; }