
我有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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)