闲
uname -a
UI层由 Aqua ,Quick Look, Spotlight, Accessibility
调用起Aqua是通过类似WindowServer窗口服务器来支持GUI.而这个WindowServer属于Core Graphics中苹果未开源的一部分
查看WindowsServer完整路径
WindowServer启动时传入了-daemon 开关参数,但实际工作的人是Core Graphics 中的Core Graphics X Server函数完成.
实现Finder功能的主要框架,它大部分工作由插件完成,后缀是.qlgenerator bundel文件.实际的插件不是一个可独立运行的执行程序。翻译成人话就是没入口函数类似go的main(),而采用了QuickLookGeneratorPluginFactory工厂模式来调用,还有一个配置文件来找到对应的文件。通过UIT(Uniform Type Identifier)表示.
还说了一点逆DNS表示法(reverse DNS notation),这里的注释没看懂。有知道的大佬可以科普一下
Spotlight是在Tiger版本中引入的快速搜索技术,balabala由索引服务器mds,mds在MetaData框架中,这个框架属于系统核心服务的一部分,且是一个没有GUI的后台服务程序(说白了 没办法通过用户交互层找到它,只能感知它的功能).每当有文件创建修改删除发生时,内核都会通过fsevents(我个人翻译为fast speed events)快速消息事件机制.回到mds当它收到通知时,会通过工作进程mdworker将各种元数据信息导入数据库.进程可以加载一个具体的Spotlight Importer从文件中提取元数据信息,这些导入器都是实现了固定API的插件(在Xcode 中选择MetaData Importer项目模版可以创建出API框架 我已经找不到了Xcode的模版了 估计在哪个版本删掉)
黑魔法:在一个目录中创建.metadata_never_index 可以防止这个目录被索引
1.文件系统(HFSX)是大小写敏感的,文件系统是部分加密的
2.内核已经以kernelcache的形式将内核打包在内核中(/System/Library/Caches/com.apple.kernelcaches).iOS的内核缓存是Img3加密文件
NeXTSTEP的遗产(是一家做内核的公司).什么是bundel?框架/包/共享库目标的一种文件目标格式
通过NSBundle对象和CoreFoundation提供的CFBundle系列API可以访问和加载bundle
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反编译会丢失信息 这在系统层面的保护措施是我没想到过的。
#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);
}
#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]指向了一片空地址
基本安全模块(Basic Security Module) 这个审计系统(auditing)子系统来源自Solaris,作用是跟踪用户和进程的动作.
审计日志
FreeBSD 5.x 有一个强大的特性强制访问控制Mandatory Access Control(强大的地方在于 可以限制特定进程针对具体文件或资源套接字和IPC的访问权限,从而控制一个给定的程序不允许访问用户的私有数据或网站)
proc_enforce 和 vnode_enforce MIB 都是用来控制iOS上的代码签名.在越狱设备上采用的一个著名绕过代码签名的方法上将这两个变量设置为0,但是在iOS 4.3以后这两个变量设置为只读,但是通过内核补丁依旧可以绕过这个限制
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。