将MH_EXECUTE转换为MH_DYLIB(mach-o)

uns*_*ble 8 reverse mach-o dylib ios

问题:

我有2个MH_EXECUTE iOS二进制文件(已编译,没有源代码).
让我们来命名binary1binary2.
UIApplicationMain调用之前我尝试在它们之间切换!

1尝试

我成功地做了这个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;
}
Run Code Online (Sandbox Code Playgroud)

创建iOS应用程序 binary2

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我跑步时,binary1我得到:

在此输入图像描述

第2步


让我们看看差异MH_EXECUTE与MH_DYLIB

全屏 在此输入图像描述

  • 我们可以看到这里的主要区别是文件类型:MH_EXECUTE与MH_DYLIB

让我们改变它们并binary1再次运行.
改变后的结果是out of address space

第3步


让我们看一下全屏加载命令
在此输入图像描述
*在dylib没有__PAGEZERO
*dylib __TEXTVM address== 0但在binary2== 0000000100000000

所以我们也要修补它们...(修补:__TEXT,___DATA__LINKEDIT)
运行后binary1我得到malformed mach-o image: segment __PAGEZERO overlaps load commands

第4步


我成功地__PAGEZERO从加载命令中删除了二进制看起来像dylib:
fullscreen 在此输入图像描述

但是一开始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
Run Code Online (Sandbox Code Playgroud)

任何的想法 ???

小智 6

你得到的BAD_ACCESS是因为你删除__PAGEZERO并因此使rebased操作码无效.保持__PAGEZERO但使其无效.我类似地将一个可执行文件转换为一个共享库,它在iOS和macOS上正常加载.