3 Commits

3 changed files with 46 additions and 0 deletions

View File

@ -2,3 +2,12 @@
## Подпрограммы, программные прерывания и особые случаи ## Подпрограммы, программные прерывания и особые случаи
### АХТУНГ
**НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ НЕ ЗАГРУЖАТЬ КОД ИЗ ЭТОЙ ЛАБЫ**. Дело в том, что Linux считает прерывания его личной заботой и поэтому как правило сам отвечает за их обработку. Для того, чтобы сделать прикол из лабы с подменой таблицы векоторов прерываний необходимо написать модуль ядра.
Для тех, кто в танке, это означает следующее: **ЕСЛИ Я ОШИБСЯ ХОТЬ ГДЕ-ТО (А Я ВЕРОЯТНЕЕ ВСЕГО ГДЕ-ТО ОШИБСЯ), ВАШЕЙ СИСТЕМЕ МОЖЕТ ПРИЙТИ ПИЗДА. И ОЧЕНЬ БЫСТРО**
## Теперь для смелых
Милицын препод лояльный, поэтому было принято решение не грохать в лоб системную таблицу, а расширить ее своими прерываниями. Делается это в основном при помощи `request_irq`, в который передается куча инфы о прерывании

View File

@ -0,0 +1,30 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
typedef struct {
uint16_t size;
uint64_t adress;
} Fuck_IDT_register;
extern void store_idt(Fuck_IDT_register *storage);
static int __init fuck_system(void)
{
pr_info("start to fuck system");
struct desc_ptr newidtr;
gate_desc *oldint, *newint;
Fuck_IDT_register idt_register;
store_idt(&idt_register);
pr_info("idt register stored");
return 0;
}
static void __exit unfuck_system(void)
{
pr_info("start to unfuck system");
}
module_init(fuck_system);
module_exit(unfuck_system);
MODULE_LICENSE("GPL");

View File

@ -0,0 +1,7 @@
global store_idt
section .text
store_idt: ; rdi - указатель
sidt [rdi]
ret