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

时间:2016-06-06 11:16:59

标签: 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. 的包装
  3. 我在哪里可以找到int setgid(gid_t);的实现?
  4. 是否可以选择从kern_prot.c调用setgid的实现?
  5. 更新:

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

    谢谢,

1 个答案:

答案 0 :(得分:2)

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

enter image description here

来自xnu来源:

#define SYS_setgid         181

这里181 = 0xB5

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

code = regs->rax & SYSCALL_NUMBER_MASK;

其中SYSCALL_NUMBER_MASK is ~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)