我正在使用没有源代码的二进制可执行文件进行一些逆向工程。在 Windows 上,我可以做的是使用 LoadLibrary 加载可执行文件 (EXE),就像它是 DLL 文件一样。如果加载的文件不可重定位,我可以简单地重新定位加载器代码,为其他模块“腾出空间”。当我加载二进制文件时,我可以调用它的函数(当然,假设我在它们所在的位置),并执行其他操作。
有什么方法可以在 Mac 上执行相同或类似的操作吗?我有一个 mach-o 可执行文件,我想加载它,因为它是一个动态库(DYLIB)。或者有什么方法可以将可执行文件转换为 DYLIB?什么是real可执行文件和 DYLIB 之间的区别?
好的,所以我做了一些实验,看到了这一点。文件“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.
但不确定这是否有限制以及是否可以使用不可重定位的二进制文件来完成。但这个例子表明,至少在某些情况下,这是可能的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)