Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >过年发霉一起读 - Mac OS & iOS内核(一)

过年发霉一起读 - Mac OS & iOS内核(一)

原创
作者头像
Wilbur-L
发布于 2022-02-06 06:02:16
发布于 2022-02-06 06:02:16
1.1K00
代码可运行
举报
文章被收录于专栏:iOS底层原理iOS底层原理
运行总次数:0
代码可运行

前言·为什么会有这篇文章

一·查看Darwin系统信息

uname -a

kernal
kernal

二·用户体验层

UI层由 Aqua ,Quick Look, Spotlight, Accessibility

Aqua

调用起Aqua是通过类似WindowServer窗口服务器来支持GUI.而这个WindowServer属于Core Graphics中苹果未开源的一部分

查看WindowsServer完整路径

窗口服务进程
窗口服务进程

WindowServer启动时传入了-daemon 开关参数,但实际工作的人是Core Graphics 中的Core Graphics X Server函数完成.

QuickLook

实现Finder功能的主要框架,它大部分工作由插件完成,后缀是.qlgenerator bundel文件.实际的插件不是一个可独立运行的执行程序。翻译成人话就是没入口函数类似go的main(),而采用了QuickLookGeneratorPluginFactory工厂模式来调用,还有一个配置文件来找到对应的文件。通过UIT(Uniform Type Identifier)表示.

还说了一点逆DNS表示法(reverse DNS notation),这里的注释没看懂。有知道的大佬可以科普一下

quicklook指令- qlmanage -m

插件指令
插件指令

Spotlight

Spotlight是在Tiger版本中引入的快速搜索技术,balabala由索引服务器mds,mds在MetaData框架中,这个框架属于系统核心服务的一部分,且是一个没有GUI的后台服务程序(说白了 没办法通过用户交互层找到它,只能感知它的功能).每当有文件创建修改删除发生时,内核都会通过fsevents(我个人翻译为fast speed events)快速消息事件机制.回到mds当它收到通知时,会通过工作进程mdworker将各种元数据信息导入数据库.进程可以加载一个具体的Spotlight Importer从文件中提取元数据信息,这些导入器都是实现了固定API的插件(在Xcode 中选择MetaData Importer项目模版可以创建出API框架 我已经找不到了Xcode的模版了 估计在哪个版本删掉)

大概是这个意思?
大概是这个意思?

黑魔法:在一个目录中创建.metadata_never_index 可以防止这个目录被索引

三·iOS文件系统的区别

1.文件系统(HFSX)是大小写敏感的,文件系统是部分加密的

2.内核已经以kernelcache的形式将内核打包在内核中(/System/Library/Caches/com.apple.kernelcaches).iOS的内核缓存是Img3加密文件

四·bundel

NeXTSTEP的遗产(是一家做内核的公司).什么是bundel?框架/包/共享库目标的一种文件目标格式

bundle结构
bundle结构

通过NSBundle对象和CoreFoundation提供的CFBundle系列API可以访问和加载bundle

五·应用程序和APP

iOS会区分自带的app(./Applications)和从应用商店下载的app(/var/mobile/Applications).

应用商店的app安装在一个128位GUID的目录下面,以字节数分解为更易于管理的结构4-2-2-2-6结构

(J2LC231104-JIF4-JL4F-02DA-123461245123)

当iOS App运行时会被chroot到自己应用目录GUID/下,也既沙盒环境。它能阻断应用与应用之间的访问 因为GUID的目录

逆向的小伙伴应该看过这个结构目录 通过openssl usb连接手机 127.0.0.1:端口 ps -A 可以打印出当前运行的所有应用进程

虽然写过逆向的文章,后来我删掉了 个人觉得逆向市场不大。(苹果的逆向比安卓的逆向难太多了,黑产也不会优先选择苹果端,安卓端相对应会比较容易)

文章中很有意思的一点是我这一年开发以来没发现的,通常来说企业为了维护成本通常是通过代码来实现UI界面,而UI界面苹果提供了XIB故事板和纯代码。纯代码优势在维护成本低如果企业按照一定的格式规范文档,XIB的维护却难很多,但是xib还有一个优点在上面说:xib反编译会丢失信息 这在系统层面的保护措施是我没想到过的。

六·框架

SpeechSynthesis.Framework框架(ApplicationServices框架位于Carbon)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <ApplicationServices/ApplicationServices.h>
int main(int argc, const char * argv[]) {
 // insert code here...
 OSErr rc;
 SpeechChannel channel;
 VoiceSpec vs;
 int voice;
 char *test = "love";
 if (!argv[1]) {
 voice = 1;
 }else {
 voice = atoi(argv[1]);
 }
 if (argc == 3) {
 test = argv[2];
 }
 rc = GetIndVoice(voice, &vs);
 rc = NewSpeechChannel(&vs, &channel);
 rc = SpeakText(channel, test, strlen(test));
 if (rc) {
 fprintf(stderr, "Unable to speak\n");
 exit(1);
 }
 while (SpeechBusy()) sleep(1);
 exit(0);
}

七·BSD特性

通过kevent跟踪某个PID表示的进程到进程级别事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/event.h>
int main(int argc, const char * argv[]) {
 // insert code here...
 pid_t pid;
 int kq;
 int rc;
 int done;
 struct kevent ke;
 pid = atoi(argv[1]);
 kq = kqueue();
 if (kq == -1) {
 perror("kqueue error");
 exit(2);
 }
 //监听 fork exec exit 通知
 EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT | NOTE_FORK | NOTE_EXEC, 0, NULL);
 //注册事件
 rc = kevent(kq, &ke, 1, NULL, 0, NULL);
 if (rc < 0) {
 perror("kevent error");
 exit(3);
 }
 done = 0;
 while (!done) {
 memset(&ke, '\0', sizeof(struct kevent));
 rc = kevent(kq, NULL, 0, &ke, 1, NULL);
 if (rc < 0) {
 perror("kevent");
 exit(4);
 }
 if (ke.fflags & NOTE_FORK) {
 printf("PID %lu fork()ed\n",ke.ident);
 }
 if (ke.fflags & NOTE_EXEC) {
 printf("pid %lu has exec()ed\n",ke.ident);
 }
 if (ke.fflags & NOTE_EXIT) {
 printf("pid %lu has exit()ed\n",ke.ident);
 done++;
 }
 }
}

书上的这段代码我在Xcode中无法运行 argv[1]指向了一片空地址

八·审计OS X

基本安全模块(Basic Security Module) 这个审计系统(auditing)子系统来源自Solaris,作用是跟踪用户和进程的动作.

审计日志

苹果BSM额外的三个系统调用

mach_port_name_t (返回用于当前向审计会话发送消息的Mach端口)

audit_session_join (加入Mach端口表示的审计会话)

audit_session_port (Lion版本引入的调用,替换file_port_makeport活动指定审计会话asid的Mach端口)

强制访问控制

FreeBSD 5.x 有一个强大的特性强制访问控制Mandatory Access Control(强大的地方在于 可以限制特定进程针对具体文件或资源套接字和IPC的访问权限,从而控制一个给定的程序不允许访问用户的私有数据或网站)

proc_enforce 和 vnode_enforce MIB 都是用来控制iOS上的代码签名.在越狱设备上采用的一个著名绕过代码签名的方法上将这两个变量设置为0,但是在iOS 4.3以后这两个变量设置为只读,但是通过内核补丁依旧可以绕过这个限制

系统配置seutil

系统配置
系统配置

九·插曲

笑死
笑死

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式(五):单例模式
设计模式(五):单例模式
Java架构师必看
2021/05/14
2190
设计模式二十四章经之单例设计模式
概述 单例模式是应用最广的设计模式之一。也可能是很多初级工程师唯一会使用的设计模式。从字面意思,单例模式就是单例对象的类必须保证只有一个实例的存在,而且自行实例化并向整个系统提供这个实例。例如,创建一个对象需要消耗太多的资源,如要访问IO和数据库等资源,这时需要考虑单例模式。 懒汉单例模式 线程不安全 当提到单例模式的时候,我们第一反应就是如下代码: public class Singleton { private static Singleton instance; private S
我就是马云飞
2018/06/22
4820
Java设计模式之(一)------单例模式
IT可乐
2018/01/04
9240
Java设计模式之(一)------单例模式
23设计模式之 --------- 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
默 语
2024/11/20
1150
23设计模式之 --------- 单例模式
设计模式之单例模式实践
概念 单例模式即一个JVM内存中只存在一个类的对象实例 分类 1、懒汉式 类加载的时候就创建实例 2、饿汉式 使用的时候才创建实例 当然还有其他的生成单例的方式,双重校验锁,枚举和静态内部类,文中会有
Java技术栈
2018/03/29
6720
JAVA设计模式之单例模式
public static Singleton getInstance() {
一觉睡到小时候
2019/07/04
4260
JAVA设计模式之单例模式
JAVA设计模式之单例模式
作者:炸斯特 出处:https://blog.csdn.net/jason0539 概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下特点:   1、单例类只能有一个实例。   2、单例类必须自己创建自己的唯一实例。   3、单例类必须给所有其他对象提供这一实例。   单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对
Tanyboye
2018/07/02
4070
一篇通俗易懂的文章让你彻底了解设计模式中的单例模式
之前给大家讲了关于设计模式的七大原则,这一次给大家带来了设计模式中的单例模式,以后会将23种设计模式一一为大家准备好。接下来让我们来看看单例模式吧。
@派大星
2023/06/28
2450
一篇通俗易懂的文章让你彻底了解设计模式中的单例模式
Java设计模式(一)-单例模式
单例模式(Singleton Pattern) 是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
joshua317
2021/11/24
8690
Java设计模式(一)-单例模式
一天一个设计模式:单例模式
作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化,并向整个系统提供这个实例。
用户1134788
2018/12/05
3960
单例模式
所谓饿汉式单例设计模式,就是将类的静态实例作为该类的一个成员变量,也就是说在JVM 加载它的时候就已经创建了该类的实例,因此它不会存在多线程的安全问题。
栋先生
2018/09/29
5040
单例模式
设计模式—单例模式
例如在Java开发中,我们都知道类和对象实例可以通过new来创建一个或者多个,而单例模式就是采取一定的办法保证整个系统中某一个类只能存在唯一一个对象实例,并且获取该类实例的方法只能是该类自己提供的一个获取其实例的静态方法。
炒香菇的书呆子
2022/04/18
3680
设计模式——单例模式详解
饿汉式:在类加载的时候已经创建好该单例对象。 懒汉式:在需要使用对象的时候才会去创建对象
小尘要自信
2023/10/10
1.4K0
设计模式——单例模式详解
Java设计模式——单例模式(Singleton Pattern)
从上一篇文章Java设计模式——装饰模式(Decorator Pattern)中估计大家都已经对java设计模式有了初步的理解,今天呢,阿Q就给大家讲一下另一种设计模式——单例设计模式。首先我们先来了解一下它的概念,单例模式是设计模式中最简单的形式之一,这一模式的目的是使得类的一个对象成为系统中的唯一实例,也就是保证类在内存中只有一个对象。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。它主要是为了解决全局使用的类频繁地创建与销毁浪费系统资源。
阿Q说代码
2021/05/13
9270
Java设计模式——单例模式(Singleton Pattern)
Java设计模式 | 单例模式解析与实战
确保某个类有且只有一个对象的场景, 避免产生多个对象消耗过多的资源, 或者 某种类型的对象只应该有且只有一个。 例如, 创建一个对象需要消耗的资源过多, 如要访问IO和数据库等资源,这时就要考虑使用单例模式。
凌川江雪
2020/04/14
7230
Java设计模式 | 单例模式解析与实战
设计模式【1】-- 单例模式到底几种写法?
单例模式,是一种比较简单的设计模式,也是属于创建型模式(提供一种创建对象的模式或者方式)。
秦怀杂货店
2020/12/26
4280
深入理解单例模式
Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide
用户2164320
2018/06/14
6330
《23种设计模式(Java版)》| 单例模式(内附源码案例)。
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
百思不得小赵
2022/12/01
3260
《23种设计模式(Java版)》| 单例模式(内附源码案例)。
Java单例模式8种方式 详解
1、单例模式(Singleton Pattern):确保某一个类最多只有一个实例,并向整个系统提供这个实例,即该类需提供一个访问唯一实例的全局方法,这个类称为单例类。单例模式的目的是使得某个类最多只有一个实例。
全栈程序员站长
2022/09/22
1.1K0
Java单例模式8种方式 详解
设计模式:单例模式 (关于饿汉式和懒汉式)
单例模式是比较常见的一种设计模式,目的是保证一个类只能有一个实例,而且自行实例化并向整个系统提供这个实例,避免频繁创建对象,节约内存。
一诺千金
2021/03/16
1.1K0
相关推荐
设计模式(五):单例模式
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验