将MH_EXECUTE转换为MH_DYLIB(mach-o)

9

问题:

我有两个MH_EXECUTE iOS二进制文件(已编译,没有源代码)。
我们称它们为binary1binary2
我试图在调用UIApplicationMain之前切换它们!

尝试一

我成功地使用binary1和一个dylib进行了尝试。因此,我尝试将MH_EXECUTE转换为MH_DYLIB。


步骤1
创建iOS应用程序binary1

#import <dlfcn.h>

int main(int argc, char * argv[])
{
    NSLog(@"binary1 -> Hello, World!");

    void *handle = dlopen([[[NSBundle mainBundle] pathForResource:@"binary2" ofType:nil] cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);

    if (handle)
    {
        NSLog(@"DLOPEN is OK!");
    }
    else
    {
        NSLog(@"!OK ... --> %s", dlerror());

    }

    return 0;
}

创建iOS应用程序 binary2
int main(int argc, char * argv[])
{
    NSLog(@"binary2 -> Hello, World!");

    return 0;
}

当我运行binary1时,会得到以下结果: enter image description here 步骤2:
让我们看看MH_EXECUTE与MH_DYLIB之间的区别。 全屏查看 enter image description here 如我们所见,这里的主要区别是文件类型:MH_EXECUTE与MH_DYLIB。
让我们更改它们并再次运行binary1。 更改后的结果是out of address space
步骤3:
让我们看一下加载命令。 全屏查看 enter image description here * 在dylib中没有__PAGEZERO段。 * dylib __TEXTVM地址==0,但在binary2中==0000000100000000。
因此,我们也要修补它们...(已修补:__TEXT___DATA__LINKEDIT) 运行binary1后,我得到了malformed mach-o image: segment __PAGEZERO overlaps load commands
步骤4:
我成功地从加载命令中删除了__PAGEZERO,现在二进制文件看起来像dylib: 全屏查看 enter image description here 但是在启动binary1时,我得到了BAD_ACCESS
Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Subtype: KERN_PROTECTION_FAILURE at 0x00000001019e0010
Triggered by Thread:  0

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   dyld                            0x0000000120016d78 ImageLoaderMachOCompressed::rebase(ImageLoader::LinkContext const&) + 892
1   dyld                            0x0000000120016c24 ImageLoaderMachOCompressed::rebase(ImageLoader::LinkContext const&) + 552
2   dyld                            0x0000000120010c8c ImageLoader::recursiveRebase(ImageLoader::LinkContext const&) + 132
3   dyld                            0x000000012001039c ImageLoader::link(ImageLoader::LinkContext const&, bool, bool, bool, ImageLoader::RPathChain const&) + 176
4   dyld                            0x00000001200088e0 dyld::link(ImageLoader*, bool, bool, ImageLoader::RPathChain const&) + 180
5   dyld                            0x000000012000df68 dlopen + 684
6   libdyld.dylib                   0x0000000194e65b94 dlopen + 68
7   binary1                         0x00000001000b7e18 main (main.m:16)
8   libdyld.dylib                   0x0000000194e66a04 start + 0

有什么想法吗?
1个回答

7

你遇到了BAD_ACCESS的问题,原因是你移除了__PAGEZERO,从而使重定向操作码无效。保留__PAGEZERO但将其置空。我同样将一个可执行文件转换为共享库,并成功地在iOS和macOS上加载。


“nullify it”是什么意思?如果您将VM地址或大小归零,则其他段将不对齐。 - dkaranovich

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