LINUX.ORG.RU

Перехват системных вызовов (open)

 ,


0

1

Всем доброго времени суток! Пытаюсь осуществить перехват системного вызова (в данном случае - open()), все получается кроме одного. После некоторой обработки необходимо вызвать реальный системный вызов open(), но с измененным первым параметром - именем файла. Тупой запуск оригинального сисколла с измененным параметром завершается ошибкой bad address (если параметр не изменять, все работает). В чем может быть косяк? Заранее спасибо.

Ответ на: комментарий от true_admin

Да, это было бы удобно. Но, к сожалению, в данном случае не подойдет. Спасибо за ответ)

happycorsair
() автор топика
Ответ на: комментарий от true_admin

Да, конечно, вот пример махонького кусочка кода из модуля ядра, который делает то, что я пытался описать словами)

asmlinkage int custom_open(const char* __user file_name, int flags, int mode) 
{ 
    printk(«Hooked!\n»); 
    if (strcmp(file_name,«/home/tester/hello.c») == 0) 
        return real_open(«/home/tester/hello1.c», flags, mode); 
    else 
        return real_open(file_name, flags, mode); 
}
happycorsair
() автор топика

Тупой запуск оригинального сисколла

Из ядра что ли? Неделя открытия-файла-в-ядре на ЛОРе

panfutij
()
Ответ на: комментарий от panfutij

А, простите, сисколлы - это не интерфейс ядра для простых приложений? Я изменяю этот интерфейс - не более того, в ядро я не лезу.

happycorsair
() автор топика

Надо уже в ядро lua внедрять, как кое-где.

anonymous
()
Ответ на: комментарий от happycorsair

только грязные хаки, только хардкор: отобразить в адресное пространство процесса память для буфера. Как конкретно сделать - не знаю.

AptGet ★★★
()
Ответ на: комментарий от happycorsair

попробуйте так:

asmlinkage int custom_open(const char* __user file_name, int flags, umode_t mode) 
{ 
    if (strcmp(file_name,«/home/tester/hello.c») == 0) {
        int res;
        printk(«Hooked!\n»); 
        mm_segment_t fs = get_fs();
        set_fs(KERNEL_DS);
        res = real_open(«/home/tester/hello1.c», flags, mode); 
        set_fs(fs);
        return res;
    }
    return real_open(file_name, flags, mode); 
}
поправьте, кто может, если я ошибаюсь

anonymous
()

Гуглится это дело нормально. Например.

При исполнении оригинальных системных вызовов в пространстве ядра необходимо скопировать аргументы в адресное пространство пользователя. Это достигается за счет следующей схемы. В указателе на текущий процесс current имеется подструктура mm, отвечающая за менеджмент памяти данного процесса. В ней же имеется указатель на конец сегмента данных brk. Для изменения размера сегмента данных используется функция brk(). Мы расширим сегмент данных и с помощью функции copy_to_user скопируем наши аргументы в адресное пространство пользователя:

unsigned long end;
end = mm->brk;
sys_brk((void *)(end+strlen(pathname)+2));
copy_to_user(end+2, pathname, strlen(pathname+1));
Kuzz ★★★
()
Ответ на: комментарий от happycorsair

Еще бы, оно вообще не компилируется:

test.c:54: error: stray ‘\302’ in program
test.c:54: error: stray ‘\253’ in program
test.c:54: error: expected expression before ‘/’ token
test.c:54: error: stray ‘\302’ in program
test.c:54: error: stray ‘\273’ in program
...

anonymous
()

Пытаюсь осуществить перехват системного вызова

Нахера? Это курсовая такая что ли?

ttnl ★★★★★
()
Ответ на: комментарий от happycorsair

в ядро я не лезу.

Пардон, значит невнимательно прочитал

panfutij
()
Ответ на: комментарий от happycorsair

Гуглится это дело нормально.

Большое спасибо за наводку, очень интересно)

happycorsair
() автор топика
Ответ на: комментарий от ttnl

Нахера? Это курсовая такая что ли?

Нет, не курсовая. Просто есть одна идейка, одним из вариантов реализации которой является разное представление одного и того же файла для разных пользователей.

happycorsair
() автор топика
Ответ на: комментарий от panfutij

Я имею в виду, может он её отладить хочет каким-нибудь таким изощренным способом

А как Вы себе представляете подобную отладку?:)

happycorsair
() автор топика
Ответ на: комментарий от happycorsair

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

arturpub ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.