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:
Mfg, Lord Kefir
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