Загрузка двоичного файла Mac в виде динамической библиотеки


Я делаю некоторые обратные разработки с двоичным исполняемым файлом без источников. На Windows, что я могу сделать, это загрузить исполняемый файл (EXE) с LoadLibrary, так же, как это был файл DLL. Если загруженный файл не перемещается, я могу просто переместить свой код загрузчика, чтобы "освободить место" для другого модуля. Когда я загружаю двоичный файл, я могу вызвать его функции (предполагая, что я знаю, где они находятся, конечно) и делать другие вещи.

Есть ли способ сделать то же самое или подобное на Mac? У меня есть Mach-O исполняемый файл, и я хотел бы загрузить его, поскольку это была динамическая библиотека (DYLIB). Или есть какой-то способ преобразовать исполняемый файл в DYLIB? Какие настоящей различия между исполняемым и dylib нужна?

1 11

1 ответ:

Хорошо, я провел несколько экспериментов и вот что увидел. Файл " bin1.c " содержит:

#include <stdio.h>
int main() {
    printf("I am bin1.\n");
    return 0;
}

И " bin2.c " - это:

#include <stdio.h>
#include <dlfcn.h>
int main() {
    printf("I am bin2.\n");

    void *l = dlopen("bin1", RTLD_NOW);
    if (l == NULL) {
        printf("dlopen failed: %s\n", dlerror());
        return -1;
    }

    void *f = dlsym(l, "main");
    if (f == NULL) {
        printf("dlsym failed: %s\n", dlerror());
        return -1;
    }

    int (*main)() = f;
    main();

    return 0;
}

На моем Mac все компилируется нормально и действительно загружает другой исполняемый файл, так как это была загружаемая библиотека, и я могу вызвать основную функцию в другом двоичном файле:

Johanka:Desktop newacc$ uname -a
Darwin Johanka.local 11.3.0 Darwin Kernel Version 11.3.0: Thu Jan 12 18:47:41 PST 2012; root:xnu-1699.24.23~1/RELEASE_X86_64 x86_64
Johanka:Desktop newacc$ gcc bin1.c -o bin1 && ./bin1
I am bin1.
Johanka:Desktop newacc$ gcc bin2.c -o bin2 && ./bin2
I am bin2.
I am bin1.

Не уверен, однако, есть ли ограничения на это и можно ли это сделать с неперемещаемыми двоичными файлами. Но этот пример показывает, что, по крайней мере, в некоторых случаях это возможно.