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

ios – 将MH_EXECUTE转换为MH_DYLIB(mach-o),第1张

概述问题: 我有2个MH_EXECUTE iOS二进制文件(已编译,无源代码). 让我们将它们命名为binary1和binary2. 在调用UIApplicationMain之前,我尝试在它们之间切换! 1试试 我用binary1和一个dylib成功完成了这个.所以我尝试将MH_EXECUTE转换为MH_DYLIB. 步骤1 创建iOS应用程序binary1 #import <dlfcn.h>in 问题:

我有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 0x00000001019e0010Triggered by Thread:  0Thread 0 name:  dispatch queue: com.apple.main-threadThread 0 Crashed:0   dyld                            0x0000000120016d78 ImageLoaderMachOCompressed::rebase(ImageLoader::linkContext const&) + 8921   dyld                            0x0000000120016c24 ImageLoaderMachOCompressed::rebase(ImageLoader::linkContext const&) + 5522   dyld                            0x0000000120010c8c ImageLoader::recursiveRebase(ImageLoader::linkContext const&) + 1323   dyld                            0x000000012001039c ImageLoader::link(ImageLoader::linkContext const&,bool,ImageLoader::RPathChain const&) + 1764   dyld                            0x00000001200088e0 dyld::link(ImageLoader*,ImageLoader::RPathChain const&) + 1805   dyld                            0x000000012000df68 dlopen + 6846   libdyld.dylib                   0x0000000194e65b94 dlopen + 687   binary1                         0x00000001000b7e18 main (main.m:16)8   libdyld.dylib                   0x0000000194e66a04 start + 0

任何的想法 ???

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

以上是内存溢出为你收集整理的ios – 将MH_EXECUTE转换为MH_DYLIB(mach-o)全部内容,希望文章能够帮你解决ios – 将MH_EXECUTE转换为MH_DYLIB(mach-o)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1104156.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存