我想使用系统调用setgid来更改当前进程的组I d试图查找此函数时,我找到的唯一实现是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);)。
int setgid(gid_t);是否是int setgid(proc_t p, struct setgid_args *uap, __unused int32_t *retval)的包装
在哪里可以找到int setgid(gid_t);的实现?
是否可以从kern_prot.c调用setgid的实现?
更新:
在用dtruss监视我的程序以观察系统调用之后,调用setgid(gid_t)似乎触发了带有3个参数的系统调用
setgid(0x2, 0x7F9AA3803200, 0x1000)这与kern_prot.c中的实现相匹配。问题是,在哪里可以找到包装器源代码,它属于哪个库(可能是glibc?)
谢谢,

最佳答案

你要找的不是开源的但如果在IDA中打开/usr/lib/system/libsystem_kernel.dylib:
c - OSX setgid系统调用-哪个API是正确的-LMLPHP
从xnu来源:

#define SYS_setgid         181

此处181=0xB5
如果选中bsd/dev/i386/systemcalls.c中的unix_syscall64函数(来自xnu内核源代码):
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(系统设置)

08-05 22:42