Kernel Module Tutorials?



  • danke für den link.

    hab mir mal das kapitel durchgelesen und folgendes gemacht:

    #include <linux/init.h>
    #include <linux/module.h>
    MODULE_LICENSE("Dual BSD/GPL");
    static int hello_init(void)
    {
    printk(KERN_ALERT "Hello, world\n");
    return 0;
    }
    static void hello_exit(void)
    {
    printk(KERN_ALERT "Goodbye, cruel world\n");
    }
    module_init(hello_init);
    module_exit(hello_exit);

    Das Makefile mit:

    obj-m := hello.o

    Und der Befehl mit:

    make -C /usr/src/linux-headers-2.6.28-11-generic M=`pwd` modules
    make: Gehe in Verzeichnis '/usr/src/linux-headers-2.6.28-11-generic'
    Building modules, stage 2.
    MODPOST 1 modules
    make: Verlasse Verzeichnis '/usr/src/linux-headers-2.6.28-11-generic'

    Dann als root:
    insmod hello.ko

    Das Modul wird eingeladen und ist auch mit lsmod | grep hello sichtbar.
    Mit rmmod hello.ko kann ich es auch wieder ausladen.

    Jedoch wird die Message "Hello World" bzw. "Good Bye cruel world" nicht angezeigt. Ein cat /var/log/messages | grep world bringt auch kein Ergebnis.

    Danke für weitere hilfen.



  • Hallo

    dmseg | grep world

    Gibt mir die Hello World aus. 🙂
    Kann ich es auch irgendwie erreichen, dass Hello World direkt in der Console ausgegeben wird?

    Danke!



  • Außerdem stimmt glaube ich bei mir was nicht...
    Habe mal im Sourcefile "kernel.h" alle Definitionen der printk() Funktion angeschaut und den Sourcecode folgendermaßen abgeändert:

    #include <linux/init.h>
    #include <linux/module.h>
    
    MODULE_LICENSE("GPL");
    
    static int hello_init (void)
    {
    	printk(KERN_ALERT "Hello, world\n");
     	printk(KERN_INFO "Kernz hackerz\n");
    printk(KERN_NOTICE "Output1\n");
    printk(KERN_WARNING "Output2\n");
    printk(KERN_ERR "Output3\n");
    printk(KERN_CRIT "Output4\n");
    printk(KERN_EMERG "Output5\n");
        	return 0;
    }
    
    static void hello_exit (void)
    {
        	printk(KERN_ALERT "Goodbye, cruel world\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    

    Wieder keine ausgabe auf der Console, jedoch in der dmesg Datei:

    [ 2127.329457] Hello, world
    [ 2127.329464] Kernz hackerz
    [ 2127.329467] Output1
    [ 2127.329469] Output2
    [ 2127.329472] Output3
    [ 2127.329475] Output4
    [ 2127.329478] Output5



  • kerndpl schrieb:

    Wieder keine ausgabe auf der Console, jedoch in der dmesg Datei:

    weil Kernel Output eben nicht in die Konsole kommt sondern durch dmesg angeziegt wird. Es wäre furchtbar, wenn bei der Konsole den ganzen Kram kommen würde, den vom kernel ausgegeben wird.

    Chapter 2: Building and running modules schrieb:

    We've specified a high priority in this module, because a message with the default
    priority might not show up anywhere useful, depending on the kernel version you
    are running, the version of the klogd daemon, and your configuration
    . You can
    ignore this issue for now; we explain it in Chapter 4.

    [...]

    According to the mechanism your system uses to deliver the message lines, your out-
    put may be different. In particular, the previous screen dump was taken from a text
    console; if you are running insmod and rmmod from a terminal emulator running
    under the window system, you won't see anything on your screen.
    The message goes
    to one of the system log files, such as /var/log/messages (the name of the actual file [...]

    lesen hilft!



  • Danke für die Antwort.
    Gibt es denn auch ne Möglichkeit den Dump auf die Konsole zu bringen?

    Was mich dann noch weiters interessieren würde, wäre die system table, calls.
    Was ich auch gerne hätte ist dass ich auf meinem System dann alle Tastatureingaben, von jedem tty/pts abfangen und sichern kann.

    Schon mal vorweg, das hat keinen illegalen Grund, sondern sollte einfach ein kleines Projektchen werden udn wird dann privat bei meinem Server eingesetzt.

    Also würd mich dann im Endeffekt auch interessieren, wie ich einen Systemcall abändern kann, dass er gewisse Dinge macht.

    Vielen Dank für weitere hilfen



  • Habe mich weiter schlau gemacht und habe ein bisschen probiert und programmier und bin auf folgenden Code gestoßen:

    // make -C /usr/src/linux-headers-2.6.28-11-generic M=`pwd` modules
    
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/sched.h>
    #include <linux/types.h>
    #include <linux/param.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/version.h>
    #include <linux/smp_lock.h>
    #include <linux/unistd.h>
    #include <linux/string.h>
    #include <linux/file.h>
    #include <asm/uaccess.h>
    #include <linux/proc_fs.h>
    #include <asm/errno.h>
    #include <asm/io.h>
    
    MODULE_LICENSE("GPL");
    
    extern void *sys_call_table[];
    
    asmlinkage int (*original_sys_exit)(int);
    
    asmlinkage int our_fake_exit_function(int error_code)
    {
            /*print message on console every time we
             *are called*/
            printk("HEY! sys_exit called with error_code=%d\n",error_code);
    
            /*call the original sys_exit*/
            return original_sys_exit(error_code);
    }
    
    /*this function is called when the module is
     *loaded (initialization)*/
    static void output (void)
    {
            /*store reference to the original sys_exit*/
            original_sys_exit=sys_call_table[__NR_exit];
    
            /*manipulate sys_call_table to call our
             *fake exit function instead
             *of sys_exit*/
            sys_call_table[__NR_exit]=our_fake_exit_function;
    }
    
    static int hello_init (void)
    {
    	printk(KERN_ALERT "Hello, world\n");
    	output();
        	return 0;
    }
    
    static void hello_exit (void)
    {
        	printk(KERN_ALERT "Goodbye, cruel world\n");
            sys_call_table[__NR_exit]=original_sys_exit;
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    

    Beim Kompilieren bekomme ich die Warnung:

    WARNING: "sys_call_table" [/home/user/Desktop/kernel/hello.ko] undefined!

    Und beim insmod dann natürlich:

    insmod: error inserting 'hello.ko': -1 Unknown symbol in module
    ERROR: Module hello does not exist in /proc/modules

    Fehlt da ne Headerdatei?
    Oder wo ist das Problem?

    Danke!



  • kernlg schrieb:

    Schon mal vorweg, das hat keinen illegalen Grund, sondern sollte einfach ein kleines Projektchen werden udn wird dann privat bei meinem Server eingesetzt.

    wers glaubt 😉



  • kernlg schrieb:

    Beim Kompilieren bekomme ich die Warnung:

    WARNING: "sys_call_table" [/home/user/Desktop/kernel/hello.ko] undefined!

    Und beim insmod dann natürlich:

    insmod: error inserting 'hello.ko': -1 Unknown symbol in module
    ERROR: Module hello does not exist in /proc/modules

    Fehlt da ne Headerdatei?
    Oder wo ist das Problem?

    Danke!

    Da steht im Prinzip schon alles ... Ein wenig Basiswissen von Compilen und Linke sollte man schon haben, wenn man Kernelmodule schreiben will die Syscalls verbiegen.



  • atomfish schrieb:

    kernlg schrieb:

    Beim Kompilieren bekomme ich die Warnung:

    WARNING: "sys_call_table" [/home/user/Desktop/kernel/hello.ko] undefined!

    Und beim insmod dann natürlich:

    insmod: error inserting 'hello.ko': -1 Unknown symbol in module
    ERROR: Module hello does not exist in /proc/modules

    Fehlt da ne Headerdatei?
    Oder wo ist das Problem?

    Danke!

    Da steht im Prinzip schon alles ... Ein wenig Basiswissen von Compilen und Linke sollte man schon haben, wenn man Kernelmodule schreiben will die Syscalls verbiegen.

    Na, wenn das so klar und logisch für dich ist, dann könntest du mich ja mit deinem Wissen erhellen? 😉



  • atomfish schrieb:

    kernlg schrieb:

    Schon mal vorweg, das hat keinen illegalen Grund, sondern sollte einfach ein kleines Projektchen werden udn wird dann privat bei meinem Server eingesetzt.

    wers glaubt 😉

    Naja was bringts mir?
    Ich hab grad mit kernel-programmierung angefangen und was soll ich großartigs machen? Ein rootkit? Dann kann ich ja gleich eins vom internet runterladen und müsste mich damit net abquälen...

    Wie gesagt es ist für meinen privaten Server, auf dem auch einige User sind, welche ich gerne überwachen würde. Natürlich könnte ich da auch verbreitete linux-keylogger nehmen, aber ich will auch ein bisschen dafür arbeiten und was lernen, so dass ich auch verstehe, was ich eigentlich mache!



  • kernlg schrieb:

    atomfish schrieb:

    kernlg schrieb:

    Schon mal vorweg, das hat keinen illegalen Grund, sondern sollte einfach ein kleines Projektchen werden udn wird dann privat bei meinem Server eingesetzt.

    wers glaubt 😉

    Naja was bringts mir?
    Ich hab grad mit kernel-programmierung angefangen und was soll ich großartigs machen? Ein rootkit? Dann kann ich ja gleich eins vom internet runterladen und müsste mich damit net abquälen...

    Wer weiss vielleicht hast du das schon gemacht bekommst es aber nicht gebaut 😉

    Warum schreibst du nicht erstmal nen einfachen Treiber für meinetwegen den guten alten PC speaker und spielst ein wenig damit rum statt gleich syscalls umbiegen zu wollen ohne zu wissen was du da eigentlich tust ?



  • Wie schon gesagt.

    a) Interessierts mich mehr
    b) Eben das Projekt, wo ich oben erwähnte
    c) Hat das dann auch mehr Nutzen, kann dann auch eigene Calls implementieren usw



  • hier wird dir keiner helfen, rootkits zu schreiben, bzw. das Wissen dafür zu vermitteln (das würde sogar die Forenregel widersprechen), auch wenn du vorgibst, angeblich nur "privat" am "eigenen" Server zu testen. Jeder kann das von sich behaupten. 👎 dafür, dass du uns auf dem Arm nehmen willst.



  • supertux schrieb:

    hier wird dir keiner helfen, rootkits zu schreiben, bzw. das Wissen dafür zu vermitteln (das würde sogar die Forenregel widersprechen), auch wenn du vorgibst, angeblich nur "privat" am "eigenen" Server zu testen. Jeder kann das von sich behaupten. 👎 dafür, dass du uns auf dem Arm nehmen willst.

    Na dann, gib mir dieses Wissen eben nicht - deine Entscheidung.
    Ich denke nicht jeder hier im Forum denkt so wie du und unterstellt mir solche Absichten.



  • ich bin eigentlich erstaunt, wie lange dieser Thread überlebt hat, aber wahrscheinlich nicht mehr so lange. Nimm's nicht persönlich, aber selbst wenn du die Wahrheit sprichst und man hier ein solche Einleitung postest, dann könnten Cracker-Newbies das benutzen, um später Böses zu tun.



  • Könnte man mir dann eventuell diese Informationen -wenn ich registriere- per PN zukommen lassen?

    Somit wären diese für niemand ersichtlich.



  • Eine andere Frage, welche man sicher ohne Probleme beantworten kann hätte ich auch noch:

    unsigned long *p;
          p = (unsigned long *)ptr;
          if (p[__NR_close] == (unsigned long) sys_close)
    

    »sys_close« nicht deklariert (erste Benutzung in dieser Funktion)

    Fehlt mir ein Include?
    Die Includes sehen so aus:

    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/sched.h>
    #include <linux/types.h>
    #include <linux/param.h>
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/version.h>
    #include <linux/smp_lock.h>
    #include <linux/unistd.h>
    #include <linux/string.h>
    #include <linux/file.h>
    #include <asm/uaccess.h>
    #include <linux/proc_fs.h>
    #include <asm/errno.h>
    #include <asm/io.h>
    

    Danke schonmals



  • Habe jetzt folgenden Code gefunden und angepasst:

    void *get_sys_call_table(void *system_call)
    {
      	unsigned char *p;
      	unsigned long s_c_t;
      	int count = 0;
      	p = (unsigned char *) system_call;
      	while (!((*p == 0xff) && (*(p+1) == 0x14) && (*(p+2) == 0x85)))
      	{
          		p++;
          		if (count++ > 500)
          		{
              		count = -1;
              		break;
          		}
      	}
      	if (count != -1)
      	{
          		p += 3;
          		s_c_t = *((unsigned long *) p);
      	}
      	else
          		s_c_t = 0;
    
      	return((void *) s_c_t);
    }
    
    static void output (void)
    {
    
            void* rt_w = get_system_call();
    	unsigned long sys_call_table = (unsigned long)get_sys_call_table(rt_w);
    	printk("%lu", sys_call_table);
    
    }
    

    Sollte ds so funktionieren?
    Sind irgendwo Gedankenfehler dabei?



  • Lies dir das hier mal durch: http://www.dtors.org/papers/malicious-code-injection-via-dev-mem.pdf

    Ist zwar nicht genau was du willst, aber dort wird beschrieben wie man die sys_call_table vom Userspace aus findet. Ich denke dein Code-Snippet macht im Grunde das gleiche.
    Übrigens es hat sicher einen Grund, dass du nicht so einfach in die sys_call_table schreiben kannst (der Compilerfehler). Aber schau doch mal ein wenig im Kernel nach .?sys_call_table[.?]\w=\w**, also nach diesem regulären Ausdruck, dann solltest du einige Beispiele finden.



  • Danke

    Aber ich wollte eigentlich eher ein Modul für den Kernel schreiben und nicht die /dev/mem bzw. /dev/kmem methode anwenden.

    Beim obigen Code von mir scheint aber was nicht zu stimmen. Als sys adresse bekomme ich eine 12 stellige zahl?


Anmelden zum Antworten