当前位置: 首页 > news >正文

MAC OS X IOS系统调用的处理

有其它系统基础的很容易理解,没有基础的可以先看看其它系统的。目前水果pc端cpu大部分都是intel,虽然他支持很多架构。因此这里只说intel的。
我们先调用一个系统函数frok,代码如下:


int main(int argc, char * argv[])
{
    fork();
    return 1;
}

下断在fork(),然后我们直接看汇编,如图所示:
MAC OS X & IOS系统调用的处理
他直接 0x100000f76 <+22>: callq 0x100000f8c ; symbol stub for: fork
我们进入这个函数(xcode不能直接步入),如图所示:
MAC OS X & IOS系统调用的处理
0x100000f8c <+0>: ff 25 7e 00 00 00 jmpq 0x7e(%rip) ; (void )0x00007fff7eb4d084: fork
发现还在当前模块,我们继续进入,如图所示:
MAC OS X & IOS系统调用的处理
现在到了libsystem_c.dylib模块,调用:

0x7fff7eb4d090 <+12>: e8 a1 11 07 00     callq  0x7fff7ebbe236            ; symbol stub for: __fork

继续进入,如图所示:
MAC OS X & IOS系统调用的处理
还在这个模块。

    libsystem_c.dylib`__fork:
    0x7fff7ebbe236 <+0>: ff 25 94 ae d1 32  jmpq   *0x32d1ae94(%rip)         ; (void *)0x00007fff7ec30a44: __fork

继续进入,如图所示:
MAC OS X & IOS系统调用的处理
我们对比windows的看看。
MAC OS X & IOS系统调用的处理
发现水果的调用号很大,但是看xun源码压根没有这么大一个数组,同时也不可能有这么大一个数组,其实他有好几层意思,第一是调用号左移24位,代表是哪种系统调用。因为水内核还是很杂的内核分bsd,下层又是mach。同时他是POSIX系统标准。
大部分人都熟悉POSIX系统调用。然而在XNU中,POSIX 系统调用只是4种系统调用的类别之一:
MAC OS X & IOS系统调用的处理
怎么找呢,intel64位新加了快速调用,有一组MSR寄存器,有一个寄存器保存的是一个内核函数地址。(可以先看windows的https://bbs.pediy.com/thread-216995.htm)
这个内核函数地址其实就是一个中断例程,经过一等系列调用(因为要兼容其它框架)最后就到了上面那几种类型种的其中一种。这里只看64位。
我们直接看源码,直接搜索mach_call_munger如图所示:
MAC OS X & IOS系统调用的处理
我们查看源码,发现它做了一个位运算。
MAC OS X & IOS系统调用的处理
看看那个掩码,做了三次定义。
MAC OS X & IOS系统调用的处理
手动算下:
0xFF << 24=0xFF000000
~0xFF000000=0x00FFFFFF
然后他与rax相& 就是去掉最前面俩位,fook 调用号是0x2000002,而他的call_number是0x2。
MAC OS X & IOS系统调用的处理
查看mach_syscall_name_table,就能找到对应函数。
MAC OS X & IOS系统调用的处理
MAC OS X & IOS系统调用的处理
发现未定义,我们换个函数试试。
MAC OS X & IOS系统调用的处理
我们直接看,mach_call_munger64 发再刚好对上,说明我们前面类型找错了,最高位1才是mach_call_munger64,2是unix_syscall64
MAC OS X & IOS系统调用的处理
unix_syscall64就没继续看了。
MAC OS X & IOS系统调用的处理

int main(int argc, char * argv[])
{
    //fork();
    task_t task;
    task_for_pid(mach_task_self(), 4082, &task);
    return 1;
}

完整lldb

(lldb) di -b -s  0x100000f8c 
MachPortDump`fork:
    0x100000f8c <+0>: ff 25 7e 00 00 00     jmpq   *0x7e(%rip)               ; (void *)0x00007fff7eb4d084: fork
    0x100000f92:      00 00                 addb   %al, (%rax)
    0x100000f94:      4c 8d 1d 6d 00 00 00  leaq   0x6d(%rip), %r11          ; (void *)0x000000010008b0f0: initialPoolContent + 1216
    0x100000f9b:      41 53                 pushq  %r11
    0x100000f9d:      ff 25 5d 00 00 00     jmpq   *0x5d(%rip)               ; (void *)0x00007fff7eadcac4: dyld_stub_binder
    0x100000fa3:      90                    nop    
    0x100000fa4:      68 00 00 00 00        pushq  $0x0
(lldb) di -b -s  0x00007fff7eb4d084
libsystem_c.dylib`fork:
    0x7fff7eb4d084 <+0>:  55                 pushq  %rbp
    0x7fff7eb4d085 <+1>:  48 89 e5           movq   %rsp, %rbp
    0x7fff7eb4d088 <+4>:  53                 pushq  %rbx
    0x7fff7eb4d089 <+5>:  50                 pushq  %rax
    0x7fff7eb4d08a <+6>:  ff 15 90 ef d8 32  callq  *0x32d8ef90(%rip)         ; _libSystem_atfork_prepare
    0x7fff7eb4d090 <+12>: e8 a1 11 07 00     callq  0x7fff7ebbe236            ; symbol stub for: __fork
    0x7fff7eb4d095 <+17>: 89 c3              movl   %eax, %ebx
    0x7fff7eb4d097 <+19>: 85 db              testl  %ebx, %ebx
    0x7fff7eb4d099 <+21>: 74 12              je     0x7fff7eb4d0ad            ; <+41>
    0x7fff7eb4d09b <+23>: 83 fb ff           cmpl   $-0x1, %ebx
    0x7fff7eb4d09e <+26>: 75 17              jne    0x7fff7eb4d0b7            ; <+51>
(lldb) di -b -s  0x7fff7ebbe236
libsystem_c.dylib`__fork:
    0x7fff7ebbe236 <+0>: ff 25 94 ae d1 32  jmpq   *0x32d1ae94(%rip)         ; (void *)0x00007fff7ec30a44: __fork

libsystem_c.dylib`__fpclassifyd:
    0x7fff7ebbe23c <+0>: ff 25 96 ae d1 32  jmpq   *0x32d1ae96(%rip)         ; (void *)0x00007fff7ec53df2: __fpclassifyd

libsystem_c.dylib`__fpclassifyl:
    0x7fff7ebbe242 <+0>: ff 25 98 ae d1 32  jmpq   *0x32d1ae98(%rip)         ; (void *)0x00007fff7ec5fac1: __fpclassify

libsystem_c.dylib`__fstat64_extended:
    0x7fff7ebbe248 <+0>: ff 25 9a ae d1 32  jmpq   *0x32d1ae9a(%rip)         ; (void *)0x00007fff7ec306a4: __fstat64_extended

libsystem_c.dylib`__fstat_extended:
    0x7fff7ebbe24e <+0>: ff 25 9c ae d1 32  jmpq   *0x32d1ae9c(%rip)         ; (void *)0x00007fff7ec4814c: __fstat_extended
(lldb) di -b -s  0x00007fff7ec30a44
libsystem_kernel.dylib`__fork:
    0x7fff7ec30a44 <+0>:  48 83 ec 18           subq   $0x18, %rsp
    0x7fff7ec30a48 <+4>:  b8 02 00 00 02        movl   $0x2000002, %eax          ; imm = 0x2000002 
    0x7fff7ec30a4d <+9>:  0f 05                 syscall 
    0x7fff7ec30a4f <+11>: 73 14                 jae    0x7fff7ec30a65            ; <+33>
    0x7fff7ec30a51 <+13>: 48 89 c7              movq   %rax, %rdi
    0x7fff7ec30a54 <+16>: e8 28 99 ff ff        callq  0x7fff7ec2a381            ; cerror
    0x7fff7ec30a59 <+21>: 48 c7 c0 ff ff ff ff  movq   $-0x1, %rax
    0x7fff7ec30a60 <+28>: 48 83 c4 18           addq   $0x18, %rsp
(lldb) 

转载于:https://blog.51cto.com/haidragon/2407612

相关文章:

  • 8位二进制补码表示整数的最小值是什么,最大值是什么
  • ttlsa教程系列之mongodb——(五)mongodb架构-复制原理复制集
  • Eclipse中java获得mysql的查询结果集
  • 成熟的软件组件都是老板用大把、大把的钱堆出来烧出来的,以最简单的数据库访问组件为例...
  • Cookie 在前端中的实践
  • 事务(Transaction)
  • Android之ubuntu源码开发环境搭建笔记
  • [转]Nodejs基础中间件Connect
  • mybatis 中的where标签
  • 高并发量网站解决方案
  • WinPcap的开发与应用:获取设备列表
  • 什么是JSON ?
  • Java-优秀博客推荐
  • ConfigFileApplicationListener
  • iOS网络监测区分2、3、4G
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • FastReport在线报表设计器工作原理
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript设计模式之工厂模式
  • Java反射-动态类加载和重新加载
  • magento 货币换算
  • Python - 闭包Closure
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 分布式熔断降级平台aegis
  • 规范化安全开发 KOA 手脚架
  • 计算机在识别图像时“看到”了什么?
  • 浏览器缓存机制分析
  • 前端性能优化——回流与重绘
  • 最近的计划
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​flutter 代码混淆
  • # 达梦数据库知识点
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (ibm)Java 语言的 XPath API
  • (LeetCode 49)Anagrams
  • (ZT)薛涌:谈贫说富
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (十一)图像的罗伯特梯度锐化
  • (一)认识微服务
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net core使用ef 6
  • .NET值类型变量“活”在哪?
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • ?.的用法
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]