feat: За секунду до падения системы

This commit is contained in:
root
2024-10-17 12:32:56 +03:00
parent eb85d6dd9a
commit f57aa67887

View File

@ -3,8 +3,18 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/desc.h> #include <asm/desc.h>
// Смотрим у производителя процессора номер прерывания
// деления на ноль (я сижу на x86-64, а этот номер зависит от архитектуры процессора)
#define ZERODIV_NR 0x00
extern void store_idt(struct desc_ptr *storage); extern void store_idt(struct desc_ptr *storage);
static void example_handler(void)
{
pr_warn("entered the handler");
return;
}
static int __init fuck_system(void) static int __init fuck_system(void)
{ {
pr_info("start to fuck system"); pr_info("start to fuck system");
@ -12,12 +22,28 @@ static int __init fuck_system(void)
struct desc_ptr newidtreg; struct desc_ptr newidtreg;
struct desc_ptr oldidtreg; struct desc_ptr oldidtreg;
gate_desc *oldidt, *newidt; gate_desc *oldidt, *newidt;
// Выделяем память под 256 прерываний
unsigned long new_page = __get_free_page(GFP_KERNEL);
if (!new_page)
{
return -ENOMEM;
}
store_idt(&oldidtreg); store_idt(&oldidtreg);
newidtreg.address = oldidtreg.address; newidtreg.address = new_page;
newidtreg.size = oldidtreg.size; newidtreg.size = oldidtreg.size;
newidt = (gate_desc *)newidtreg.adress; newidt = (gate_desc *)newidtreg.address;
memcpy(newidt, oldidt, newidtreg.size); memcpy(newidt, oldidt, newidtreg.size);
pack_gate(
(newidt + ZERODIV_NR),
GATE_INTERRUPT,
(unsigned long) example_handler,
0,
0,
__KERNEL_CS
);
load_idt(&newidtreg);
pr_info("idt register stored"); pr_info("idt register stored");
return 0; return 0;
} }