Kernelmodule
LKMs Loadable Kernel Modules
---------------
Ein Kernelmodul braucht mindestens folgende Funktionen:
int init_module(void)
void cleanup_module(void)
---------------
#define MODULE
#define __KERNEL__
#include <syscall.h>
#include <linux/module.h>
/* Beispiel um Systemcalls "umzubiegen": */
/* laeuft bei mir unter 2.4 Kernel */
/* Syscall Tabelle importieren */
extern void* sys_call_table[];
/* um original Referenzen zu speichern */
int (*orig_socketcall)(int call, unsigned long *args);
/* Returnwerte fuer die echten Funktionen */
int realone;
/* Replace fuer SYS_socketcall */
int my_socketcall(int call, unsigned long *args)
{
/* da ich echt nicht weiss, was ich jetz hier machen soll, */
/* gebe ich einfach mal den echten syscall zurueck... */
/* Beliebt in "backdoor rootkits" ist auf ein bestimmtes Packet */
/* zu warten und dann eine Verbindung zu dem Angreifer aufzubauen. */
/* Tip: "Unreliable Guide To Hacking The Linux Kernel" von Paul Rusty Russell */
/* echten Syscall machen und zurueckgeben */
realone=(*orig_socketcall)(call,args);
return realone;
}
int init_module(void)
{
/* "umbiegen" */
orig_socketcall=sys_call_table[SYS_socketcall];
sys_call_table[SYS_socketcall]=my_socketcall;
return 0;
}
void cleanup_module(void)
{
/* "zurueckbiegen" */
sys_call_table[SYS_socketcall]=orig_socketcall;
}
----------
machen:
[kaese@toast kernelhacking]$ echo $LKM >lkm.c
[kaese@toast kernelhacking]$ gcc -c -O2 lmk.c
[kaese@toast kernelhacking]$ su
Password:
[root@toast kernelhacking]# insmod lmk.o
gucken (darauf kann man sich nicht verlassen bei $EVIL-LKM):
[root@toast kernelhacking]# lsmod
Module Size Used by
lmk 864 0 (unused)
......
raus aus dem Kernel:
[root@toast kernelhacking]# rmmod lkm
(besonders evil ist, wenn lsmod $LMK angezeigt hat...und es nach einem rmmod verschwunden ist..
aber im Hintergrund weiter laeuft.)
linux
