Example #1
0
File: load2.cpp Project: IRebo/utek
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;
}