我想使用系统调用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:
从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
(系统设置)