Загрузите двоичный файл Mac в качестве динамической библиотеки - PullRequest
11 голосов
/ 12 декабря 2011

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

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

1 Ответ

7 голосов
/ 27 апреля 2012

ОК, я провел несколько экспериментов и вижу это. Файл "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 все прекрасно компилируется и действительно загружает другой исполняемый файл, так как это была загружаемая библиотека, и я могу вызвать функцию main в другом двоичном файле:

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.

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

...