前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >过年发霉一起读 - Mac OS & iOS内核(一)

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

原创
作者头像
Wilbur-L
发布2022-02-06 14:02:16
9260
发布2022-02-06 14:02:16
举报
文章被收录于专栏:iOS底层原理iOS底层原理

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

一·查看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
复制
#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
复制
#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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言·为什么会有这篇文章
  • 一·查看Darwin系统信息
  • 二·用户体验层
    • Aqua
      • QuickLook
        • quicklook指令- qlmanage -m
      • Spotlight
      • 三·iOS文件系统的区别
      • 四·bundel
      • 五·应用程序和APP
      • 六·框架
        • SpeechSynthesis.Framework框架(ApplicationServices框架位于Carbon)
        • 七·BSD特性
          • 通过kevent跟踪某个PID表示的进程到进程级别事件
          • 八·审计OS X
            • 苹果BSM额外的三个系统调用
              • mach_port_name_t (返回用于当前向审计会话发送消息的Mach端口)
              • audit_session_join (加入Mach端口表示的审计会话)
              • audit_session_port (Lion版本引入的调用,替换file_port_makeport活动指定审计会话asid的Mach端口)
            • 强制访问控制
              • 系统配置seutil
              • 九·插曲
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档