首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OSX setgid系统调用哪个API是正确的

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

Stack Overflow用户
提问于 2016-06-06 11:16:58
回答 1查看 264关注 0票数 2

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

代码语言:javascript
复制
/*
 * 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)似乎触发了具有与kern_prot.c实现相匹配的3个参数setgid(0x2, 0x7F9AA3803200, 0x1000)的系统调用。问题是,在哪里可以找到包装程序源代码,它属于哪个库(可能是glibc?)

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-29 17:47:12

你要找的不是露台。但是,如果在IDA中打开/usr/lib/system/libsystem_kernel.dylib:

来自xnu消息来源:

代码语言:javascript
复制
#define SYS_setgid         181

这里181 = 0xB5

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

code = regs->rax & SYSCALL_NUMBER_MASK;

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

代码语言:javascript
复制
#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)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37656016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档