Function Hijacking - put_queue

Lord Kefir

Lord Kefir

König
Guten Tach!
Also, ich schreibe gerade ein Kernelmodul, dass die Funktion put_queue quasi abfangen soll. Auf meinem Rechner hat es gestern funktioniert - bei meiner Freundin leider nicht.

Wenn ich das Modul lade, funktioniert die Kiste noch einwandfrei - allerdings werden auf dem tty keine Zeichen mehr ausgegeben.
Wenn das Modul beenden wird, klappt alles wieder einwandfrei... vielleicht hat hier ja einer 'ne kleine Idee, woran es liegen könnte:

Code:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/string.h>

#define LICENSE "GPL"
#define VERSION "0.1"
#define CODESIZE 7
#define ADDRESS 0xc027a860; // UNBEDINGT ANPASSEN!!!
 
// global variables:
void (*put_queue)(int) = (void(*)(int))ADDRESS;

static char code[CODESIZE];
static char jump[CODESIZE] =
 "\xb8\x00\x00\x00\x00"
 "\xff\xe0";

// prototypes:
void _put_queue (int ch);

/* ----------------------------------------------
     function: _put_queue
   ---------------------------------------------- */
void _put_queue (int ch) {
  printk ("flog: %d\n", ch);

  memcpy (put_queue, code, CODESIZE); // restore byte of the original code
  put_queue (ch);   // call function
  memcpy (put_queue, jump, CODESIZE); // re-restore jump code
}

/* ----------------------------------------------
     function: init_module
   ---------------------------------------------- */
int init_module (void) {
  printk ("flog version %s: session start\n", VERSION);

  *(long*)&jump[1] = (long)_put_queue; // get address
  memcpy (code, put_queue, CODESIZE); // save original code
  memcpy (put_queue, jump, CODESIZE); // set jump code

  return (0);
}

/* ----------------------------------------------
     function: cleanup_module
   ---------------------------------------------- */
void cleanup_module (void) {
  memcpy (put_queue, code, CODESIZE);
}

// Macros:
MODULE_LICENSE (LICENSE);

Mfg, Lord Kefir
 
Also, es liegt wohl zu 100% an der Adresse. Hat einer 'ne Ahnung, warum die falsch ist? Bin folgend vorgegangen:

Code:
lordkefir@linda:~$ grep put_queue /proc/kallsyms
c027a860 t put_queue
c02a5700 t cfq_put_queue

Mfg, Lord Kefir
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Aufgabe in C

Rollei Mini Wifi Camcorder

windows schneller als linux stdlib ...

USB Geräte per Bash Script resetten (Gerät hängt sich öfter mal auf)

Zurück
Oben