Kernel Module Tutorials?



  • 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?



  • supertux schrieb:

    dann könnten Cracker-Newbies das benutzen, um später Böses zu tun.

    und deswegen schützen wir uns alle und zensieren das Zeug 🤡



  • kann mir noch wer weiterhelfen?



  • Die wenigstens haben halt Lust ihre Zeit zu investieren, wenn das Vorhaben für sie sinnlos ist und du hast halt einfach jetzt den Skriptkiddie-Touch bzw. ein entsprechendes Thema.
    Hättest du dagegen gefragt wie man die syscall-Tabelle beschreibt, da du ein Modul programmieren möchtest das Aufruf-Statistiken der Syscalls erstellt, dann hätten sich sicher Leute gefunden die dir geholfen hätten. Musst halt wissen wie man fragt 😃



  • Die Syscall table und den Interrupt Handler und dessen Zusammenhänge verstehe ich ja. Ich habe einen Code gefunden, welcher eigentlich die oben beschriebene /dev/mem Methode, ausnutzen sollte:

    #include <stdio.h>
    #include <fcntl.h>
    #include <linux/sched.h>
    #include <linux/types.h>
    #include <linux/param.h>
    #include <linux/kernel.h>
    #include <linux/version.h>
    #include <linux/unistd.h>
    #include <linux/string.h>
    #include <asm/errno.h>
    #include <linux/errno.h>
    #include <linux/stat.h>
    
    /*
    #define KERN_START 0xC0000000
    
    int iskernaddr ( unsigned long addr ) 
    {
    	if (addr < KERN_START)
    		return -1;
    
    	return 0;
    }
    
    int readvirt (unsigned long addr, void* buf, unsigned int len)
    {
    	if (iskernaddr (addr) < 0)
    		return -1;
    
    	addr = addr - KERN_START;
    	lseek (mem_fd, addr, SEEK_SET);
    
    	return read(mem_fd, buf, len);
    }
    struct idtentry {
        uint16_t lo ;
        uint16_t css ;
        uint16_t flags ;
        uint16_t hi ;
    }   attribute ( ( packed ) ) ;
    
    int read_mem_linux()
    {
    	int mem_fd;
    	int ret = 1;
    	char var_char[4];
    	char *charp;
    	int count = 0;
    
    	if((mem_fd = open("/dev/mem",O_RDONLY)) < 0)
    	{
    		printf("\n\nProblem in opening /dev/mem: are you root, lamorz?\n\n");
    		return -1;
    	}
    	charp = (char *)malloc(sizeof(char) * 1024 * 1024);
    
    	while(ret != 0 && ret != -1)
    	{
    		ret = read(mem_fd, charp,sizeof(char) * 1024 *1024);
    		printf("\nret:%d",ret);
    		if (ret > 0)
    		count++;
    	}
    	printf("\nMemory Read:%d MB",count);
    }
    
    int main (int argc, char* argv[])
    {
    	read_mem_linux();
    }*/
    
     #include <stdio.h>
     #include <sys/types.h>
     #include <fcntl.h>
     #include <stdlib.h>
    
     int kfd;
    
     struct
     {
     	 unsigned short limit;
     	 unsigned int base;
     } __attribute__ ((packed)) idtr;
    
     struct
     {
     	 unsigned short off1;
     	 unsigned short sel;
     	 unsigned char none, flags;
      	 unsigned short off2;
     } __attribute__ ((packed)) idt;
    
     int readkmem (unsigned char *mem, 
                  unsigned off, 
                  int bytes)
     {
    	  if (lseek64 (kfd, (unsigned long long) off, 
                                        SEEK_SET) != off)
    	  {
           	 	 return -1;
    	  }
    
     	 if (read (kfd, mem, bytes) != bytes) 
    	 {
            	 return -1;
    	 }
    
     }
    
     int main (void)
     {
     	 unsigned long sct_off;
     	 unsigned long sct;
      	 unsigned char *p, code[255];
     	 int i;
    
    /* request IDT and fill struct */
    
    	asm ("sidt %0":"=m" (idtr));
    
    	if ((kfd = open ("/dev/kmem", O_RDONLY)) == -1)
    	{
           	 	perror("open");
            	exit(-1);
    	}
    
    	if (readkmem ((unsigned char *)&idt, idtr.base + 8 * 0x80, sizeof (idt)) == -1)
    	{
            	printf("Failed to read from /dev/kmem\n");
            	exit(-1);
    	}
    
    	sct_off = (idt.off2 << 16) | idt.off1;
    
    	if (readkmem (code, sct_off, 0x100) == -1)
    	{
            	printf("Failed to read from /dev/kmem\n");
            	exit(-1);
    	}
    
    /* find the code sequence that calls SCT */
    
     sct = 0;
    	for (i = 0; i < 255; i++)
    	{
            	if (code[i] == 0xff && code[i+1] == 0x14 && 
                                            code[i+2] == 0x85)
                    	sct = code[i+3] + (code[i+4] << 8) + 
                            (code[i+5] << 16) + (code[i+6] << 24);
    	}
    	if (sct)
     	   	printf ("sys_call_table: 0x%x\n", sct);
    	close (kfd);
     }
    

    Wobei ich das als root ausführe und die Meldung bekomme:

    open: No such device or address

    Auch das bringt mir folgendes Ergebnis:

    sudo cat /dev/kmem
    cat: /dev/kmem: No such device or address

    Diese Möglichkeit nicht mehr aktuell?
    Oder sonstige Denkfehler?

    Vielen Dank schonmals für Anregungen



  • Versuchs mal bei Gulli... 😉



  • @Mod: kann man das hier bitte dicht machen?



  • ___mario schrieb:

    Versuchs mal bei Gulli... 😉

    ja natürlich, bei gulli...
    ansammlung von script kiddies und kindern?

    @Mod: kann man das hier bitte dicht machen?

    Nur weil es deiner Meinung nach nicht legal ist?
    Natürlich, wir tun alles was der große tux will!



  • kernelp schrieb:

    Nur weil es deiner Meinung nach nicht legal ist?

    es ist nicht meine Meinung sondern mittlerweile ein Gesetzt.


Anmelden zum Antworten