如果我做对了,这应该不会像人们想象的那么难。具体来说,我将从 iOS 和 ELF 可执行格式开始。让我们澄清一下,我有一部越狱的 iPhone,我不想在任何 appstore 应用程序中这样做,所以请避免像“你不能这样做,因为它被 Apple 禁止”这样的“好建议”。
所以,我所看到的是有一个名为 Frash 的 Flash 播放器实现(由 Comex 顺便说一句,最近越狱的开发者)。安装后,此实用程序要求 Android 的 libflashplayer.so 存在(复制到)iPhone 文件系统。我深入研究了源代码,发现该调整实际上打开了 Android (ELF) 共享对象文件,“解析”它并从中执行代码。我已经问过我的一个朋友这实际上是否可行,他告诉我是的,因为 ARM 上的 ELF 和 ARM 上的 Mach-O 是二进制兼容的(因为它们都是 ARM)。但是他居然没有给我详细的解释,所以我想问一下怎么做?我不能完全理解处理的源代码片段,但有一件事是肯定的:
int fd = open("libflashplayer.so", O_RDONLY);
_assert(fd > 0);
fds_init();
sandbox_me();
int symtab_size;
Elf32_Sym *symtab;
void **init_array;
Elf32_Word init_array_size;
char *strtab;
TIME(base_load_elf(fd, &symtab, &symtab_size, &init_array, &init_array_size, &strtab));
// Call the init funcs
_assert(init_array);
while(init_array_size >= 4) {
void (*x)() = *init_array++;
notice("Calling %p", x);
x();
init_array_size -= 4;
}
(来自原始代码,截至 2011 年 2 月 12 日在 GitHub 上)
在我看来,他使用 libelf 来执行此操作,对吗?并且在 ELF 文件中有可以在兼容处理器上执行的符号吗?
我还想知道所有其他处理器架构是否都适用?那么也许可以在 OS X 上执行 Linux 二进制文件中的符号?