微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 将MH_EXECUTE转换为MH_DYLIB(mach-o)

问题:

我有2个MH_EXECUTE iOS二进制文件(已编译,无源代码).
让我们将它们命名为binary1和binary2.
调用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;
}

创建iOS应用程序binary2

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

    return 0;
}

当我运行binary1时,我得到:

第2步

让我们看看差异MH_EXECUTE与MH_DYLIB

fullscreen

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

让我们改变它们并再次运行binary1.
更改后,结果超出了地址空间

第3步

让我们看看加载命令
fullscreen

*在dylib中没有__PAGEZERO段
* dylib __TEXT段VM地址== 0但在binary2 == 0000000100000000

所以我们也要修补它们…(修补:__TEXT,___ DATA和__LINKEDIT)
运行binary1后,我得到格式错误的mach-o图像:segment __PAGEZERO重叠加载命令

第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,ImageLoader::RPathChain const&) + 176
4   dyld                            0x00000001200088e0 dyld::link(ImageLoader*,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

任何的想法 ???

解决方法

您正在获取BAD_ACCESS,因为您删除了__PAGEZERO,从而使rebased操作码无效.保持__PAGEZERO但无效.我类似地将一个可执行文件转换为共享库,它在iOS和macOS上正常加载.

原文地址:https://www.jb51.cc/iOS/334020.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐