简介
CydiaSubstrate,iOS7越狱之前名为 MobileSubstrate(下文简称为MS或MS框架),作者为大名鼎鼎的Jay Freeman(saurik).
MS框架为越狱iDevice提供了一个稳定的代码修改平台。开发者可以很方便的利用它进行各种插件开发工作。可以说目前很多插件都是基于MS实现,比如activator、barrel、KuaiDial等等。
目前大部分人对MS的认知也只停留在表面(API Hook 应用),却很少有人探究它的原理。今天笔者就以逆向分析的角度,去一探究竟。
准备工作
我们用Xcode创建一个空目标工程mssheep.app,并设定它的Bundle ID为com.rainyx.mssheep,再把他生成到iPhone上,这样我们就可以通过com.rainyx.mssheep这个Bundle ID对目标程序mssheep进行注入了,当然前提是要有MS的支持;p.
再创建一个动态库工程mswolf、用于Hook目标程序mssheep。在iOSOpenDev生成的模版中可以看到,按照MS的规则生成了两个文件,分别是/Library/MobileSubstrate/DynamicLibraries/xxx.dylib和/Library/MobileSubstrate/DynamicLibraries/xxx.plist,打开Plist在filters中加入com.rainyx.mssheep这个Bundle ID,然后同样生成到iPhone上。
在iOS桌面启动mssheep.app。然后SSH到iOS,GDB attach到目标进程,打info sh查看加载的库,在列表中有mswolf.dylib,说明我们的动态库成功被目标进程加载,这时候想干什么坏事就都可以干了/:阴险。
修改mswolf工程加入Hook部分代码,此次我们Hook fopen这个API。
我们要让mswolf在目标程序加在后运行Initialize函数,需要在Build Settings的Other Link Flags中加入-init _Initialize选项.编译后生成到iPhone上,再次运行mssheep。
入口跳转分析
目标API fopen被Hook以后,会跳转到我们自己定义的函数入口,即my_fopen,在ARM体系中,由寄存器PC来控制程序的执行顺序,换句话说,寄存器PC保存了下一条要被执行的指令的地址。MS如何改变流程,看下反汇编代码便知。
SSH到iPhone,GDB附加到目标进程,打disassemble fopen,如下:
CydiaSubstrate,iOS7越狱之前名为 MobileSubstrate(下文简称为MS或MS框架),作者为大名鼎鼎的Jay Freeman(saurik).
MS框架为越狱iDevice提供了一个稳定的代码修改平台。开发者可以很方便的利用它进行各种插件开发工作。可以说目前很多插件都是基于MS实现,比如activator、barrel、KuaiDial等等。
目前大部分人对MS的认知也只停留在表面(API Hook 应用),却很少有人探究它的原理。今天笔者就以逆向分析的角度,去一探究竟。
准备工作
我们用Xcode创建一个空目标工程mssheep.app,并设定它的Bundle ID为com.rainyx.mssheep,再把他生成到iPhone上,这样我们就可以通过com.rainyx.mssheep这个Bundle ID对目标程序mssheep进行注入了,当然前提是要有MS的支持;p.
再创建一个动态库工程mswolf、用于Hook目标程序mssheep。在iOSOpenDev生成的模版中可以看到,按照MS的规则生成了两个文件,分别是/Library/MobileSubstrate/DynamicLibraries/xxx.dylib和/Library/MobileSubstrate/DynamicLibraries/xxx.plist,打开Plist在filters中加入com.rainyx.mssheep这个Bundle ID,然后同样生成到iPhone上。
在iOS桌面启动mssheep.app。然后SSH到iOS,GDB attach到目标进程,打info sh查看加载的库,在列表中有mswolf.dylib,说明我们的动态库成功被目标进程加载,这时候想干什么坏事就都可以干了/:阴险。
修改mswolf工程加入Hook部分代码,此次我们Hook fopen这个API。
代码:
FILE *(*old_fopen)(const char *path, const char *mode); FILE *my_fopen(const char *path, const char *mode) { // 这里什么都不干 return old_fopen(path, mode); } void Initialize() { MSHookFunction(&fopen, &my_fopen, (void **)&old_fopen); }
我们要让mswolf在目标程序加在后运行Initialize函数,需要在Build Settings的Other Link Flags中加入-init _Initialize选项.编译后生成到iPhone上,再次运行mssheep。
入口跳转分析
目标API fopen被Hook以后,会跳转到我们自己定义的函数入口,即my_fopen,在ARM体系中,由寄存器PC来控制程序的执行顺序,换句话说,寄存器PC保存了下一条要被执行的指令的地址。MS如何改变流程,看下反汇编代码便知。
SSH到iPhone,GDB附加到目标进程,打disassemble fopen,如下:
代码:
0x3a043694 <fopen+0>: bx pc 0x3a043696 <fopen+2>: nop (mov r8, r8) 0x3a043698 <fopen+4>: blx 0x3a4480d8 0x3a04369c <fopen+8>: ldr r1, [r1, #120] 0x3a04369e <fopen+10>: lsls r1, r1, #0 0x3a0436a0 <fopen+12>: mov r8, r0 0x3a0436a2 <fopen+14>: mov r0, r1 0x3a0436a4 <fopen+16>: mov r1, r2 0x3a0436a6 <fopen+18>: blx 0x3a0969ac <dyld_stub___sflags> 0x3a0436aa <fopen+22>: mov r5, r0 0x3a0436ac <fopen+24>: movs r6, #0 0x3a0436ae