问题:
我有两个MH_EXECUTE iOS二进制文件(已编译,没有源代码)。
我们称它们为binary1
和binary2
。
我试图在调用UIApplicationMain
之前切换它们!
尝试一
我成功地使用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
时,会得到以下结果:
![enter image description here](https://istack.dev59.com/7nYY4.webp)
让我们看看MH_EXECUTE与MH_DYLIB之间的区别。 全屏查看
![enter image description here](https://istack.dev59.com/bcU0s.webp)
让我们更改它们并再次运行
binary1
。
更改后的结果是out of address space
。步骤3:
让我们看一下加载命令。 全屏查看
![enter image description here](https://istack.dev59.com/mEgpj.webp)
dylib
中没有__PAGEZERO
段。
* dylib
__TEXT
段VM地址
==0,但在binary2
中==0000000100000000。因此,我们也要修补它们...(已修补:
__TEXT
、___DATA
和__LINKEDIT
)
运行binary1
后,我得到了malformed mach-o image: segment __PAGEZERO overlaps load commands
。步骤4:
我成功地从加载命令中删除了
__PAGEZERO
,现在二进制文件看起来像dylib:
全屏查看
![enter image description here](https://istack.dev59.com/5gXS3.webp)
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
有什么想法吗?