Изменение полномочий файла в ядре

несколько важных вещей отметить:

сначала различия между API только относятся к коду стороны хоста. Ядра являются точно тем же. на стороне хоста сложность API драйвера довольно тривиальна, принципиальные различия:

в API драйвера у Вас есть доступ к функциональности, которая не доступна в API во время выполнения как контексты.

эмулятор только работает с кодом, написанным для API во время выполнения.

, о, и в настоящее время cudpp то, которое является очень удобной библиотекой только, работает с API во время выполнения.

8
задан Aiden Bell 28 August 2009 в 23:29
поделиться

2 ответа

Системные вызовы не являются экспортируемыми символами. Вам нужно немного взломать, если вы этого хотите.

вы хотите прикоснуться к sys_call_table . Он содержит указатель на каждый системный вызов. Посмотрите на arch / x86 / kernel / syscall_table_32.S или arch / i386 / kernel / entry.S в старых ядрах.

Вы можете grep sys_call_table / usr / src / linux / System.map (или / proc / kallsyms , если символы экспортируются), чтобы найти базовый адрес этой таблицы. Вы можете использовать этот адрес в качестве параметра для вашего модуля (потребуется преобразование шестнадцатеричной строки в указатель).

Вы сможете вызвать правильный системный вызов со смещением, определенным в arch / x86 / include /asm/unistd_32.h (или include / asm-i386 / unistd.h в старых ядрах). Вы получите что-то вроде: #define __NR_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);
3
ответ дан 5 December 2019 в 20:18
поделиться

Добро пожаловать в stackoverflow! Вы хотите IIRC sys_chmod ()

Из списка рассылки ядра Linux

в четверг, 20 февраля 2003 г., 11:10: 27PM +0100, Андреа Арканджели написал: В четверг, 20 февраля 2003 г., в 12:40:43 -0500 Джефф Гарзик написал:

В четверг, 20 февраля 2003 г., в 23:04:37 +0530, Прасад написал:

Есть ли способ использовать который я мог бы вызвать системный вызов в ядре пространство? Системный вызов должен выполняться замаскированным под другой процесс. Фактический

вызов sys_whatever (). Взгляните на код ядра для примеров.

Ядро уже делает это в разные места. sys_read, sys_write, open_filp, sys_close и другие функции безопасно вызывать из ядра код - хотя это не рекомендуется. init / do_mounts.c - особенно раздражающий случай, и это большая причина, почему klibc необходимо объединить. системные вызовы должно быть сделано из пользовательского пространства, а не из kernel.

Люди начинают беспокоиться, так как это не то, что вы можете делать в ядре (если вы не используете, вы знаете, что делаете). Если вы просто хотите изменить права доступа для определенного события, сделайте это из пользовательского пространства с помощью inotify или аналогичного.

Отказ от ответственности:

Вот код, который я нашел в другом модуле ядра, который использует sys_ * calls:

#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;
}

Также найдено:

asmlinkage long sys_rename(const char __user *oldname, const char __user *newname);
asmlinkage long sys_chmod(const char __user *filename, mode_t mode);
asmlinkage long sys_fchmod(unsigned int fd, mode_t mode);

в include / linux / syscalls.h

Имейте в виду, что я давно не занимался какими-либо вещами для ядра. Проверьте , что это подходящий интерфейс для chmod, и что вы не сокращаете никакие другие вызовы, которые могут, например, реализовывать перехватчики безопасности.

Также, Эта ссылка содержит информацию о системных вызовах и их символы. Также Здесь - это краткий справочник системных вызовов API пользовательского пространства и их реализации в ядре.

5
ответ дан 5 December 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: