问题:
我有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
>我们可以看到这里的主要区别是文件类型: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
任何的想法 ???