C 更改内核中的文件权限

C 更改内核中的文件权限,c,linux,file-permissions,kernel-module,C,Linux,File Permissions,Kernel Module,我正在编写内核模块(Linux中的C),我想更改其中其他文件的权限。 有解决办法吗? 因为我在内核中,所以无法使用chmod syscall和。。。 谢谢你的帮助 这是我的生成文件: > obj-m += ca.o > > all: > make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules > > clean: > make -C /

我正在编写内核模块(Linux中的C),我想更改其中其他文件的权限。 有解决办法吗? 因为我在内核中,所以无法使用chmod syscall和。。。 谢谢你的帮助

这是我的生成文件:

> obj-m += ca.o
> 
>     all:
>       make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
>     
>     clean:
>       make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
这是我的代码:

> #include <linux/string.h>
> #include <linux/mm.h>
> /* Snip, tons of includes (all of them :))*/
> #include <linux/delay.h> .... int procfile_write(struct file *file,
> const char *buffer, unsigned long
> count,
>          void *data) { ...    sys_chmod(path, per); ... } ...
#包括
>#包括
>/*剪,包括吨(全部:)*/
>#包括。。。。int procfile_write(结构文件*file,
>常量字符*缓冲区,无符号长
>伯爵,
>void*data){…sys_chmod(路径,per);…}。。。
在作出警告时:

警告:“sys\u chmod”[文件]未定义

加载带有“sudo insmod”的模块时,会出现以下错误:

模块中的未知sybol


这个错误似乎特别发生在内核模块中。有什么想法吗?再次感谢

欢迎来到stackoverflowIIRC您想要的
sys\u chmod()

来自Linux内核邮件列表

2003年2月20日星期四晚上11:10:27+0100,安德里亚·阿坎格里写道: 2003年2月20日星期四下午12:40:43-0500,杰夫·加齐克写道:

2003年2月20日星期四晚上11:04:37+0530,普拉萨德写道:

有没有一种方法可以在内核中调用系统调用 空间系统调用将伪装成另一个进程运行。实际的

调用sys\u whatever()。查看内核代码以获取示例

内核已经在中这样做了 各个地方。系统读取,系统写入, 打开filp、系统关闭和其他 从内核调用函数是安全的 代码——尽管不鼓励这样做。 init/do_mounts.c是一个特殊的 令人讨厌的情况,这是一个很大的原因 klibc需要合并。系统调用 应该从用户空间而不是 内核

人们开始担心,因为这不是您在内核中可能做的事情(除非您正在使用您知道自己在做什么)。如果您只想更改某个事件的权限,请使用或类似的方法从用户空间进行更改

免责声明:

下面是我在另一个内核模块中找到的一些代码,它使用sys_*调用:

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/fcntl.h>
#include <linux/delay.h>
#include <linux/string.h>
#include <linux/syscalls.h>
/* Snip */

int openflags = O_WRONLY|O_CREAT;
if (ml != 1)
        openflags |= O_TRUNC;
wfd = sys_open(collected, openflags, mode);

if (wfd >= 0) {
    sys_fchown(wfd, uid, gid);
    sys_fchmod(wfd, mode);
    state = CopyFile;
}
include/linux/syscalls.h

请注意,我已经有一段时间没有做任何内核的东西了检查这是chmod的合适接口,例如,您不能缩短任何其他可能实现安全挂钩的调用


还有,及其符号。另外,是用户空间API系统调用的快速参考,以及它们在内核中的实现位置

系统调用不是导出符号。如果你想要的话,你需要做一点黑客攻击

您想在
sys\u call\u表上找到您的手指。它包含指向每个系统调用的指针。
查看较旧内核上的
arch/x86/kernel/syscall\u table\u 32.S
arch/i386/kernel/entry.S

您可以
grep sys\u call\u table/usr/src/linux/System.map
(或者
/proc/kallsyms
,如果符号已导出)来查找此表的基址。 您可以将此地址作为模块的参数(需要将十六进制字符串转换为指针)

您可以使用
arch/x86/include/asm/unistd_32.h
中定义的偏移量调用正确的系统调用(或者在旧内核上使用
include/asm-i386/unistd.h
)。 你会得到这样的结果:
#define\u NR\u chmod 15

宏非常有用:

#define DO_SYSCALL_2(sc, t1, a1, t2, a2)                       \
    (((asmlinkage long (*)(t1, t2)) sys_call_table[__NR_##sc]) (a1, a2));
#define USER_SYSCALL_2(sc, t1, a1, t2, a2)                     \
    static inline asmlinkage long syscall_##sc(t1 a1, t2 a2)   \
    { return DO_SYSCALL_2(sc, t1, a1, t2, a2) }

USER_SYSCALL_2(chmod, const char __user *, filename, mode_t, mode);
int my_code(void) { return syscall_chmod(arg1, arg2); }
此外,如果您要传递的内核缓冲区(例如文件名)应该是用户缓冲区,请不要忘记更改数据段:

mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS);
ret = syscall_XXX(...);
set_fs(oldfd);

您正在尝试更改哪些文件的权限?在内核模块中?普通文件。像在家里或其他地方。。唯一的一点是我的代码是在内核中的。嗯,我得听听这个的“为什么”。您可以在用户空间中执行此操作,那么为什么要在内核中执行此操作呢?@derobert-有时候,无知就是幸福;)我打算制作一个内核模块,它可以做很多类似的事情。我总是喜欢学习更多:谢谢!它使用sys_chmod编译并发出警告:“sys_chmod未被破坏”。当通过“sudo insmod…”加载时出现错误:“模块中的未知符号”我包含了所有头文件,包括syscalls、sys和40个其他头文件。这些可能会有所帮助。另外,请参见编辑。我从源代码片段(initramfs的源代码)中添加了include,还检查了Makefile/gccrely中的链接器内容,例如“-L/linux-2.6.x/…”,真的非常感谢您花了这么多时间!但它仍然有警告和错误。我把细节放在编辑栏上。+1(但愿我能+4)回答得很好。我提名这个来代替我自己的“猜”哇!谢谢我会尽快尝试的!它看起来很不错:-D:)而且,您还可以劫持它们(只需将syscall表中的正确指针替换为您自己的函数)。如果保存原始指针,则会有一个包装器:)
mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS);
ret = syscall_XXX(...);
set_fs(oldfd);