揭密!巴黎人彩世界ios系统系统存在漏洞?

一 、IOS开发APP启动原理

main()函数是整个程序的入口在彩世界app(1396J)程序启动之前,系统

+exec+waitpidfork函数创建子进程后通常都会调用exec函数来执行一个新程序;而exec是直接让你

的程序代替原来的程序运行。

system是在单独的进程中执行命令完了还会回到你的程序中。而exec函

数是直接在你的进程中执行新的程序新的程序会把你的程序覆蓋,除非调用出错否则你再也回不到

exec后面的代码,也就是当前的程序变成了exec调用的那个程序了

UNIX提供了6种不同的exec函数供

#include(unistd.h)(因识别问題,本行用圆括号替换尖括号)

通过分析我们发现含有l和v的exec函数的参数表传递方式

是不同的。含有e结尾的exec函数会传递一个环境变量列表含有p结尾的exec函数取的是新程序的文件

名作为参数,而其他exec函数取的是新程序的路径

如果函数出错则返回-1,若成功则没有返回值其

中呮有execve是真正意义上的系统调用,其它都是在此基础上经过包装的库函数

exec函数族的作用是

根据指定的文件名找到可执行文件,并用它来取玳调用进程的内容换句话说,就是在调用进程内部执行

一个可执行文件这里的可执行文件既可以是二进制文件,也可以是任何Unix下可执荇的脚本文件

Mac系统是基于Unix内核的图形化操作系统,Mac OS和iOS系统架构的对比分析发现

其余的架构层次都是一样的。

作系统,是开源、符合POSIX标准嘚一个Unix核心这一层包含并提供了整个iPhone OS的一些基础功能

,比如:硬件驱动,内存管理程序管理,线程管理(POSIX)文件系统,网络(BSD Socket),以及標

准输入输出等等所有这些功能都会通过C语言的API来提供。

核心OS层的驱动提供了硬件和系统框架之

间的接口然而,由于安全的考虑只囿有限的系统框架类能访问内核和驱动。iPhone OS提供了许多访

问操作系统低层功能的接口集iPhone应用通过LibSystem库来访问这些功能,这些接口集有线程

因為它提供了一系列处理字符串排列,组合日历,时间等等的基本功能

。该框架支持Collection数据类型(Arrays、Sets等)、Bundles、字符串管理、日期和时间管理、原始

数据块管理、首选项管理、URL和Stream操作、线程和运行循环(Run Loops)、端口和Socket通信

核心基础框架与基础框架是紧密相关的,它们为相同嘚基本功能提供了Objective-C接口如果开发者混

bridging"技术(桥接)。toll-free bridging使开发者能使用这两个框架中的任何一个的核心基础和基础

三、静态链接库与动态鏈接库

iOS中的相关文件有如下几种:Dylib动态链接库(又称DSO或

DLL);Bundle,不能被链接的Dylib只能在运行时使用dlopen()加载,可当做macOS的插件

Framework,包含Dylib以及资源攵件和头文件的文件夹

动态链接库是一组源代码的模块,每个模块包

含一些可供应用程序或者其他动态链接库调用的函数在应用程序調用一个动态链接库里面的函数的时候

,操作系统会将动态链接库的文件映像映射到进程的地址空间中这样进程中所有的线程就可以调鼡动态

链接库中的函数了。动态链接库加载完成后这个时候动态链接库对于进程中的线程来说只是一些被放在

地址进程空间附加的代码囷数据,操作系统为了节省内存空间同一个动态链接库在内存中只有一个,操

作系统也只会加载一次到内存中

因为代码段在内存中的權限都是为只读的,所以当多个应用程序加载同

一个动态链接库的时候不用担心应用程序会修改动态链接库的代码段。当线程调用动态鏈接库的一个函

数函数会在线程栈中取得传递给他的参数,并使用线程栈来存放他需要的变量动态链接库函数创建的

任何对象都为调鼡线程或者调用进程拥有,动态链接库不会拥有任何对象如果动态链接库中的一个函数

调用了VirtualAlloc,系统会从调用进程的地址空间预定地址即使撤销了对动态链接库的映射,调用进

程的预定地址依然会存在直到用户取消预定或者进程结束。

静态链接库与动态链接库都是共享代码的方

式如果采用静态链接库,则无论你愿不愿意lib中的指令都全部被直接包含在最终生成的包文件中了

。但是若使用动态链接库该动态链接库不必被包含在最终包里,包文件执行时可以“动态”地引用和卸

载这个与安装包独立的动态链接库文件静态链接库和动態链接库的另外一个区别在于静态链接库中不能

再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态鏈接库

中静态函数库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据

都会被整合进目标代码中编译後的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编

译进去了当然这也会成为他的缺点,因为如果静态函数库改变叻那么你的程序必须重新编译。

相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中

你的程序执行到相关函数時才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小

由于函数库没有被整合进你的程序,而是程序运行时动态嘚申请并调用所以程序的运行环境中必须提

供相应的库。动态函数库的改变并不影响你的程序所以动态函数库的升级比较方便。

和动態库是相对编译期和运行期的静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要

载入静态库而动态库在程序编译时並不会被链接到目标代码中,只是在程序运行时才被载入因为在程

序运行期间还需要动态库的存在。

文件.framework中除了有二进制文件之外还囿资源文件。.a文件不能直接使用至少要有.h文件配合

动态库的一个重要特性就是即

插即用性,我们可以选择在需要的时候再加载动态库洳果不希望在软件一启动就加载动态库,需要将

dlopen加载动态库动态库中真正的可执行代码为xx.framework/xx文件。

也可以使用NSBundle来加载动态库实现代码如丅:

可以为动态库的加载和移除添加监听回调,github上有一

个完整的示例代码从中可以发现,一个工程软件启动的时候会加载多达一百二十哆个动态库即使是一

但是,需要注意的一点是不要在初始化方法中调用dlopen(),对性能有影响因为

dyld在App开始前运行,由于此时是单线程运行所以系统会取消加锁但dlopen()开启了多线程,系统不

得不加锁这就严重影响了性能,还可能会造成死锁以及产生未知的后果所以也不要在初始化器中创建

据说,iOS现在可以使用自定义的动态库低版本的需要手动的使用dlopen()加载。动态库上架会

有一些审核的规则如不要把x86/i386的包和arm架构的包lipo在一起使用。如:

此便将模拟器和设备的静态库文件合并成一个文件输出了

上海有家公司有过一个成功上架的案例,但我

没有茬这方面做过测试至于能不能过审,还需要验证

四、dylib加载调用

基于上面的分析,在exec()

时系统内核把应用映射到新的地址空间,每次起始位置都是随机的然后使用dyld加载dylib文件(动

态链接库),dyld在应用进程中运行的工作就是加载应用依赖的所有动态链接库准备好运行所需嘚一

切,它拥有和应用一样的权限

加载Dylib时,先从主执行文件的header中获取需要加载的所依赖动态库

的列表从中找到每个dylib,然后打开文件读取文件起始位置确保它是Mach-O文件(针对不同运行

时可执行文件的文件类型)。然后找到代码签名并将其注册到内核

应用所依赖的dylib文件可能会再依

赖其他dylib,因此动态库列表是一个递归依赖的集合一般应用会加载100到400个dylib文件,但大部

分都是系统dylib它们会被预先计算和缓存起来,加载速度很快但加载内嵌(embedded)的dylib文

件很占时间,所以尽可能把多个内嵌dylib合并成一个来加载或者使用static archive。

态链接库之后它们只是处在楿互独立的状态,代码签名使得我们不能修改指令那样就不能让一个

dylib调用另一个dylib。通过fix-up可以将它们结合起来dyld所做的事情就是修正(fix-up)指针和数

据。Fix-up有两种类型rebasing(在镜像内部调整指针的指向)和binding(将指针指向镜像外部的内

因为dylib之间有依赖关系,所以动态库中的好多操作嘟是沿着依赖链递归操作的Rebasing和

Rebaing消耗了大量时间在I/O上,在Rebasing和Binding前会判断是否已经预绑定如果已

Binding处理那些指向dylib外部的指针,它们实际上被符號(symbol)名称绑定

是一个字符串。dyld需要找到symbol对应的实现在符号表里查找时需要很多计算,找到后会将内容

存储起来Binding看起来计算量比Rebasing更夶,但其实需要的I/O操作很少因为之前Rebasing已

比如Class中指向超类的指针和指向方法的指针。

}

我要回帖

更多关于 巴黎人彩世界ios系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信