文档章节

Cydia的基石:MobileSubstrate

H
 HeroHY
发布于 2018/11/17 14:11
字数 926
阅读 26
收藏 0

在MAC与IOS平台上,动态库的后缀一般是dylid,而加载这些动态库的程序叫做dynamic linker(dyld)。这个程序有很多的环境变量来设置程序的一些行为,最为常用的一个环境变量叫做"DYLD_INSERT_LIBRARIES"。它是一个使用冒号分隔的动态库路径字符串,表示一个将要加载运行的动态库额外依赖的其它动态库。通过这个环境变量,我们就可以向应用中注入自己的动态库,进而改变应用运行时的特定行为。而这种方式,也正是mobileSubstrate所使用的最基本方法。

MobileSubstrate又叫Cydia Substrate,它是由Saurik开发的一个框架。第三方开发者调用其API,可以实现给IOS系统打补丁,改变系统或者应用的运行行为。随着时间的发展,Mobilesubstrate也不再仅仅局限于IOS平台,同样提供了对Android平台的支持,同时也支持了c/c++。Mobile Substrate由MobileHooker/MobileLoader/SafeMode三部分组成。

MobileHooker是对外的API部分,它们主要用来替换系统的函数实现。最主要的二个API见下图:

MSHookMessage是非线程安全的,用于替换原函数实现。而MSHookMessageEx则是线程安全,二者主要是在OC的Runtime机制上实现的。MSHookFunction功能与上面两个类似,但主要用于C/C++函数,与OC不同,它另有一套自己的实现方式,有兴趣的同学可以到其wiki上查阅。

MobileLoader的主要功能是将指定目录下的补丁文件(动态库文件)加载到指定的程序中。MobileLoader首先会将自己通过DYLD_INSERT_LIBRARIES加载到目录程序中,然后它会在/Library/MobileSubstrate/DynamicLibraries/目录下寻找需要加载的第三方补丁文件并使用dlopen加载它们。是否加载是通过一个plist文件来控制的,该文件中可以指定目标程序的bundle id等。如下图:

其中CoreFoundationVersion表示该库的版本,第一个值表示大于或等于,第二个值表示小于,具体的值见wiki。

Executables表示目标程序可执行文件的名称。Bundles表示目标程序的bundle id,Mode表示以上条件之间的逻辑关系,Any表示与运算。

SafeMode的主要功能是容错处理。第三方开发者通过MobileSubstrate向系统注入自定义代码时,如果考虑不周就可能导致终端设备处于崩溃的状态。MobileLoader会捕获这个崩溃异常,然后让设备进入SafeMode状态,在这个状态下,所有的第三方补丁都将被禁用,开发者可以比较从容的恢复设备。

MobileSubstrate是cydia实现的基础,现有的越狱开发环境一般使用的是THEOS或者iosopendev,这两者hook功能都是对MobileSubstrate API的封装。而MobileSubstrate又是基于DYLD_INSERT_LIBRARIES方式实现的,因此有些应用(如美团)为了阻止他人的破解,采用了一些措施阻止了DYLD_INSERT_LIBRARIES这种注入方式,基本原理参见链接

https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html

方法是在应用编译时加入下图的编译参数:

参考资料:

1.https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter7/issue7-1.html

2.http://www.cydiasubstrate.com/inject/darwin/

3.http://blog.timac.org/?p=761

4.https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html

5.http://bbs.iosre.com/t/tweak-app-app-tweak/438

 



 

© 著作权归作者所有

上一篇: 防止Tweak
H
粉丝 3
博文 162
码字总数 86832
作品 0
海淀
私信 提问
iOS设备是否越狱的判断代码

苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制。这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所。总体来说,越狱可以让我们...

彭也没
2014/12/01
61
1
用expect脚本实现Xcode对越狱设备的动态库注入

ssh远程控制 如果我们想远程登录或者控制一台机器,可以在被操控的设备上安装ssh服务。无论是本地设备使用命令行还是可视化工具都需要预先登录到远程设备中,登录过程需要输入用户名和密码。...

欧阳大哥2013
05/31
0
0
逆向第二课(Theos安装配置及Tweak工作原理)

Theos安装与配置 Theos是一个越狱开发工具包,使用它可以创建Tweak项目,动态Hook第三方程序。GitHub链接:https://github.com/theos/theos ,官网安装教程可以参考:https://github.com/theo...

LvesLi
2017/09/06
0
0
越狱iOS一点零碎知识---MobileSubstrate

MobileSubstrate实际上是一个框架,允许第三方的开发者在系统的方法里打一些运行时补丁以扩展一些方法,类似于OSX上的Application Enhancer。所以iOS系统越狱环境下安装绝大部分插件,必须首...

走向未来
2015/10/10
21
0
使用Reveal分析任意的界面结构

更新时间:2016.1.27 已支持直接在Cydia中下载插件Reveal Loader 来监控任意app的UI了 特别提醒,现已无需按下面的方式注入libReveal.dlib了,只需把libReveal.dylib上传到设备的/Library/Mo...

孙哲
2016/05/25
59
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部