c - OSX setgid 系统调用 - 哪个 API 是正确的

标签 c macos bsd mach

我想使用系统调用setgid来更改当前进程的组ID。尝试查找这个函数,我发现的唯一实现是在 kern_prot.c 中:

/*
 * setgid
 *
 * Description: Set group ID system call
 *
 * Parameters:  uap->gid            gid to set
 ...
 ..
 .
 */

 int
 setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)
 {
 ...
 ..
 .
 }

请注意,根据/usr/unistd.h,API 完全不同 ( int setgid(gid_t); )。

  1. int setgid(gid_t);int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval) 的包装
  2. 哪里可以找到 int setgid(gid_t); 的实现?
  3. 是否有任何选项可以从 kern_prot.c 调用 setgid 的实现?

更新:

使用 dtruss 监视我的程序后观察系统调用,似乎调用setgid(gid_t)用3个参数触发系统调用 setgid(0x2, 0x7F9AA3803200, 0x1000)它与 kern_prot.c 中的实现相匹配。问题是,我在哪里可以找到包装器源代码,它属于哪个库(也许是 glibc?)

谢谢,

最佳答案

您正在寻找的内容不是开源的。但是如果你在IDA中打开/usr/lib/system/libsystem_kernel.dylib:

enter image description here

来自 xnu 来源:

#define SYS_setgid         181

这里 181 = 0xB5

如果您检查 bsd/dev/i386/systemcalls.c 中的 unix_syscall64 函数(来自 xnu 内核源代码):

code = regs->rax & SYSCALL_NUMBER_MASK;

其中 SYSCALL_NUMBER_MASK 为 ~0xFF000000 = 0xFFFFFF(代码为 32 位值):

#define SYSCALL_CLASS_SHIFT 24
#define SYSCALL_CLASS_MASK  (0xFF << SYSCALL_CLASS_SHIFT)
#define SYSCALL_NUMBER_MASK (~SYSCALL_CLASS_MASK)

所以0x20000B5 & 0xFF000000 = 0xB5 (SYS_setgid)

关于c - OSX setgid 系统调用 - 哪个 API 是正确的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656016/

相关文章:

c - 创建字符串数组时遇到问题。我究竟做错了什么?

macos - 在控制台 Vim 中使用 CMD 映射

ios - IOS上使用CFSocket的UDP广播

c - open(name, O_CREAT|O_DIRECTORY, mode) 的预期行为是什么?

macos - 在 Mac 上使用 KEXT 进行文件 I/O

c中的复数输入

c - 编译C程序时出错

c - 如何通过C语言编程在现有PDF文件中添加下标?

macos - 调整所有正在运行的应用程序的所有窗口

c++ - 如何导航到OSX上的用户输入站点?