转自:http://hi.baidu.com/onejw/blog/item/47c91bdd0751c2c68c102940.html

MobileSubstrate介绍

2012年03月19日 星期一 15:14

MobileSubstrate

MobileSubstrate 实际上是一个框架,允许第三方的开发者在系统的方法里打一些运行时补丁,扩展一些方法.类似于 Application Enhancer(http://www.unsanity.com/haxies/ape).

MobileSubstrate 主要有3部分组成. MobileHooker,MobileLoader 和 safe mode.

1 MobileHooker

-------------------------------------------------------------------------------------------------------------------

MobileHooker 用于替换覆盖系统的方法,这个过程被称为Hooking(挂钩). 将使用到2个API:

IMP MSHookMessage(Class class, SEL selector, IMP replacement, const char* prefix); // prefix should be NULL.

void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result);

void MSHookFunction(void* function, void* replacement, void** p_original);

MSHookMessage() 在Objective-C中替换implementation。[class Selector] 通过替换 并返回原来的执行。挂钩一个类的方法,

在MSHookemessage(EX)中调用Objc_getMetaClass得到提供的元数据和类检索,例如下面的注释。这种动态替换是Objective-c的一个功能. 使用method_setImplementation。MSHookMmessage()是线程不安全的,不赞成使用,赞成MSHookMessageEx()

MSHookFunction() 很像 MSHookMessage() 但是 适合于c/c++ 的函数。MSHookFunctin() 将写入指令调入指定替换函数,并接会分配一些字节在内存地址,相当于原始切出指令并且跳入原始的挂钩方法。 由于iPhone系统默认的内存页不能同时写和执行,一个内核补丁必须申请MSHookFunction() 工作.

截止MobileSubstrate的最新版本,MSHookMessage() 也需要一个内核补丁 调用关闭的挂钩的所有正确方法。

代码示例:

使用 MSHookfunction:

static void (*original_CFShow)(CFTypeRef obj);  // a function pointer to store the original CFShow().

void replaced_CFShow(CFTypeRef obj) {           // our replacement of CFShow().

printf("Calling original CFShow(%p)...", obj);

original_CFShow(obj);                         // calls the original CFShow.

printf(" done.\n");

}

...

// hook CFShow to our own implementation.

MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);

// From now on any call to CFShow will pass through replaced_CFShow first.

...

CFShow(CFSTR("test"));

使用 MSHookMessageEX:

static IMP original_UIView_setFrame_;

void replaced_UIView_setFrame_(UIView* self, SEL _cmd, CGRect frame) {  // Note the implicit self and _cmd parameters are needed explicitly here.

CGRect originalFrame = self.frame;

NSLog("Changing frame of %p from %@ to %@", self, NSStringFromCGRect(originalFrame), NSStringFromCGRect(frame));

original_UIView_setFrame_(self, _cmd, frame);    // Remember to pass self and _cmd.

}

...

MSHookMessageEx([UIView class], @selector(setFrame:), (IMP)replaced_UIView_setFrame_,(IMP *)&original_UIView_setFrame_);

...

myView.frame = CGRectMake(0, 0, 100, 100);

注意,如果你挂钩一个类的方法,有必须放一个元类在类参数中。

MSHookMessageEx(objc_getMetaClass("UIView"), @selector(commitAnimations), replaced_UIView_commitAnimations, (IMP *)&original_UIView_commitAnimations);

2 MobileLoader

-------------------------------------------------------------------------------------------------------------------

MobileLoader 加载第三方补丁代码在运行的应用程序中。

MobileLoader 先加载它自己在运行的应用程序中时使用DYLD_INSERT_LIBRARIES 环境变量。然后查看所有动态库在目录/Library/MobileSubstrate/DynamicLibraries/

并且 Dlopen 他们(Dlopen是供用户直接访问(存取)动态链接库的一类函数中的一个). 一个扩展将要使用构造函数代码去完成一些工作.

...

// The attribute forces this function to be called on load.

__attribute__((constructor))

static void initialize() {

NSLog(@"MyExt: Loaded");

MSHookFunction(CFShow, replaced_CFShow, &original_CFShow);

}

开发者可能添加 过滤器 来限制延期应该加载或者不是。Filters are implemented as plist that lives beside the dylib(这句话不知怎样理解),如果 dylib 的名字时 foo.dylib,那么过滤器的名字应该是 foo.plist. 过滤器应该是一个字典key过滤器。这个另一种词典,包含这些Key:

1) CoreFoundationVersion(array): The extension is loaded only if the version ofCoreFoundation.framework is above the specified values. Currently, only the first 2 values are checked.

Firmware

2.0

2.1

2.2

3.0

3.1

3.2

CF version

478.23

478.26

478.29

478.47

478.52

478.61

2)Bundles(array): 该扩展仅仅加载 运行的应用程序列表中相匹配的ID.

3)Classes (array): 加载该扩展只有  在运行的应用程序中实现指定Objective-C 类.

4)Executables(array):加载该扩展只有一个可执行文件的名称相匹配的运行程序。。 这是必须的挂钩没有其它的可以识别特征。

例如, 限制扩展只在 SpringBoard,中加载,Plist 的配置:

Filter = {

Bundles = (com.apple.springboard);

};

你也可以使用此方法来限制扩展只加载到特定应用程序的一个指定的(Bundle)绑定. 例如 UIKit,例如:

Filter = {

Bundles = (com.apple.UIKit);

};

另外,MobileLoader 也挂钩 nilst() 去提高它的性能。并定义安全模式多种信号处理器。

对于标识的应用程序,由于所有嵌入的环境变量被忽略,开发者的应用程序必须明确的dlopen("/Library/MobileSubstrate/MobileSubstrate.dylib")让MobileLoader 运行.

3 Safe mode

-------------------------------------------------------------------------------------------------------------------

当一个扩展在SpringBoard崩溃, MobileLoader 会进入设备的安全模式捕捉并且处理。在安全模式下,所有的第三放扩展将失效.

下列信号将调用的安全模式:

1)SIGTRAP

2)SIGABRT

3)SIGILL

4)SIGBUS

5)SIGSEGV

6)SIGSYS

这是我第一次翻译英文技术文档,我承认我的英语很菜,翻译完后,我还云里雾里,不知该怎样使用... --!

有什么不对的地方请指出,谢谢!

原文地址:http://iphonedevwiki.net/index.php/MobileSubstrate

iOS越狱开发之MobileSubstrate介绍相关推荐

  1. 荒野行动ios和android能不能联机,荒野行动iOS和安卓怎么组队 iOS安卓开黑组队方法介绍...

    荒野行动iOS和安卓之前就放出过消息要互通服了,现在总算是正式合服了,但是很多小伙伴还不知道要怎么组队开黑吧?小编今天就带来了详细的组队方法介绍,不知道的快来看看吧! 问:荒野行动ios安卓怎么组队? ...

  2. 专访实战专家,揭秘iOS神奇开发之路

    专访实战专家,揭秘iOS神奇开发之路 转自:http://www.ciitn.com/archive/5533.html 时间: 2012-03-29 10:59来源: 未知 作者: xinglu 点 ...

  3. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  4. iOS网络开发之:NSURLConnection

    今天开始打算总结一下在iOS开发中的网络部分 NSURLConnection 这个访问网络的方式最简单,但功能也是最少的因此只有很简单的网络访问才会用到; 使用NSURLConnection访问网络大 ...

  5. iOS多线程开发之NSThread

    一.NSThread基本概念 NSThread是基于线程使用,轻量级的多线程编程方法(相对GCD和NSOperation),一个NSThread对象代表一个线程,需要手动管理线程的生命周期,处理线程同 ...

  6. IOS视频开发之MPMoviePlayerController

    这篇文章转载自IOS疯狂讲义下

  7. iOS混合开发之uni-app本地打包集成到iOS原生项目

    iOS混合开发 1.前言 2.项目背景 3.项目框架 4.从入坑到踩坑 4.1打包错误 4.2 运行错误 总结 1.前言     前端统一开发越来越多,公司为了大一统前端的所有页面显示问题,同时为节约 ...

  8. ios开发开发之:关于时间戳转化成时间

    最近开发项目中遇到时间转的问题,当从服务端传回时间到客户端,而这个时间确是时间戳,并且是13位,如果是普通的字符串比如"2015-09-24 19:00:000" 这样转化是比较简 ...

  9. iOS日常开发之Xcode的缓存清理

    Xcode缓存占内存太大,清理一下 1.~/Library/Developer/Xcode/DerivedData/ 这个文件夹中保存的是Xcode的缓存文件,曾经在Xcode跑过的所有项目的索引.b ...

最新文章

  1. 漫谈五种IO模型(主讲IO多路复用)
  2. p8工程师告诉你软件测试的三大误区,你误了几个?
  3. c语言24点游戏流程图,C语言解24点游戏程序
  4. HDU - 6749 Mosquito(二分+状态压缩+最大流)
  5. Scala基础 - _root_ package的作用
  6. 本地环境和测试环境搭建
  7. FR-TO-FR本地交换
  8. 如何在Ubuntu-16.04 / 18.04上为 RTX 2080 Ti GPU 安装Nvidia驱动和cuda-10.0
  9. LeetCode 45 跳跃游戏||
  10. [转载] python 时间sleep() 的方法
  11. mysql数据库官网怎么下载安装_MySQL数据库的下载与安装
  12. 在Ubuntu下看各种格式的电影──包括RMVB
  13. 病毒分析一:恶意下载软件
  14. 深入理解Binder机制
  15. PW4052锂电池充电管理芯片2.5A 单节(多并)锂 电池充电管理
  16. 【分享】马卡龙玩图v3.6.5,滑动手指让图片动起来,懒人党的福音~
  17. QQ推广,QQ在线代码
  18. win7计算机双击变管理,如何修复Win7系统鼠标单击以双击
  19. MATLAB的疲劳检测系统
  20. 室内地图导航系统基础功能与衍生服务详解

热门文章

  1. 安卓开发中,release安装包安装后,打开app后再按home键,再次点击程序图标app再次重新启动的解决办法
  2. 嵌入式工程师面试题汇总(应届、转行)
  3. C#实现软件注册码算法
  4. 过来人(江苏)专转本考试后的感悟和经验,真的很受用
  5. RK3288 千兆网改100M网(修复硬件布线问题)
  6. pycharm中光标变粗解决办法
  7. 拯救报错:Error: ER_HOST_NOT_PRIVILEGED: Host ‘x.x.x.x‘ is not allowed to connect to this MySQL server
  8. 百度输入法的B次元:从生活必需品,走向产业引擎
  9. 2022年第十三届蓝桥杯省赛C++B组
  10. MTK6737N平台做反复重启开关机测试卡在开机动画界面不开机