将Mac二进制文件作为动态库加载

13

我正在对没有源代码的二进制可执行文件进行一些反向工程。在Windows上,我可以使用LoadLibrary加载可执行文件(EXE),就像加载DLL文件一样。如果加载的文件不可重定位,我可以简单地重定位我的加载器代码以“为其他模块腾出空间”。当我加载了二进制文件后,我可以调用它的函数(假设我知道它们在哪里),并进行其他操作。

在Mac上是否有类似的方法?我有一个mach-o可执行文件,我想将其作为动态库(DYLIB)加载。或者有没有将可执行文件转换为DYLIB的方法?可执行文件和DYLIB之间的真正区别是什么?

1个回答

10

好的,我做了一些实验,看到了这个。文件"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.

不确定是否有限制,以及非可重定位二进制文件是否可以执行此操作。但是这个例子表明,至少在某些情况下,这是可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接