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

发布于 2024-12-20 22:17:25 字数 316 浏览 2 评论 0原文

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

有什么方法可以在 Mac 上做相同或类似的事情吗?我有一个 mach-o 可执行文件,我想加载它,因为它是一个动态库(DYLIB)。或者有什么方法可以将可执行文件转换为 DYLIB?可执行文件和 DYLIB 之间的真正区别是什么?

I am doing some reverse engineering with a binary executable without sources. On Windows what I can do is load an executable file (EXE) with LoadLibrary, just as it was a DLL file. If the loaded file is not relocatable I can simply relocate my loader code to "make space" for the other module. When I have the binary loaded, I can call it's functions (assuming I where where they are, of course), and do other stuff.

Is there some way to do the same or similar on Mac? I have a mach-o executable, and I'd like to load it as it was a dynamic library (DYLIB). Or is there some way to convert an executable into a DYLIB? What are the real differences between an executable and a DYLIB?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

骄兵必败 2024-12-27 22:17:25

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

不确定不过,这是否有限制,以及是否可以使用不可重定位的二进制文件来完成。但这个例子表明,至少在某些情况下,这是可能的。

OK, so I did some experiments, and see this. File "bin1.c" contains:

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

and "bin2.c" is:

#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;
}

On my Mac, all compiles fine and indeed loads the other executable as it was a loadable library, and I can call the main function in the other binary:

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.

Not sure though, whether there are limitations on this and if this can be done with non-relocatable binaries. But this example show that at least in some cases, it's possible.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文