5

这是我在内核模块中的函数,我在稍后阶段使用insmod命令插入它。make我正在努力 goldfish (2.6.29)

asmlinkage long our_sys_read(unsigned int fd, char  *buf, size_t count)
{
      printk("------->> our_sys_read getuid() ---------- %d\n", getuid());

      return original_call_read(fd,buf,count);
}

我想捕获系统调用并找出是哪个用户进行了这些系统调用。但是当我运行'make'时,它会引发以下错误。

/home/mohsin/LKM/trapcall.c:245: error: implicit declaration of function 'getuid'

任何建议将不胜感激。

4

4 回答 4

6

你也许可以使用这个:

 #include <include/linux/cred.h>

 static int getuid()
 {
     return current_uid();
 }

cred 代表“凭据”,此宏返回当前活动凭据的用户 ID。但是请记住,“当前用户 id”在 Linux 中可能意味着多种含义。

[dan3 显然不需要像我那样深入挖掘代码来找到这个 - 或者他比我先开始!]

于 2012-12-31T14:44:24.743 回答
6

花了两天时间,终于弄明白怎么获取系统调用进程的uid了。我将给出我在不同链接上找到的所有建议,以便如果我的解决方案不起作用,其他一个可能会起作用。

1)正如告诉我的垫子,

#include <include/linux/cred.h>

 static int getuid()
 {
     return current_uid();
 }

你调用这个函数来获取 uid 但它给了我负数等-943124788

2)

uid_t credd_uid ;
const struct cred *cred = current_cred();
credd_uid = current->cred->uid; 

与大负数相同的输出。

3)

uid_t struct_uid;
struct user_struct *u = current_user();

struct_uid = get_uid(u);

4)工作解决方案

它实际上是在这里给出的。

i) 在顶部声明函数原型,如

asmlinkage int (*getuid_call)();

ii) 将以下行添加到 init_module() 函数

/* 获取 getuid 的系统调用 */

  getuid_call = sys_call_table[__NR_getuid];

iii)在你被困的系统调用函数中调用函数来获取 uid

uid_t uid = getuid_call();
于 2013-01-03T07:47:20.637 回答
5

需要调用current_uid(),定义在linux/cred.h中(2.6开始,以前是current->uid)。请参阅有关凭据的内核文档

current 是一个,顺便说一句。

于 2012-12-31T14:34:17.580 回答
1

在不使用getuid系统调用挂钩的情况下获取 UID:

#include "linux/cred.h"

static inline uid_t get_uid(void) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
#include "linux/uidgid.h"
    // current_uid() returns struct in newer kernels
    return __kuid_val(current_uid());
#else
    return 0 == current_uid();
#endif
}

您还应该查看linux/uidgid.h定义 ROOT uid/gid 的有用宏以及内联比较函数以避免直接调用__kuid_val().

例如,一个常见的用途是检查用户是否为 root:

static inline bool is_root_uid(void) {
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0)
#include "linux/uidgid.h"
    // current_uid() returns struct in newer kernels
    return uid_eq(current_uid(), GLOBAL_ROOT_UID);
#else
    return 0 == current_uid();
#endif
}
于 2018-05-11T21:03:18.930 回答