巨大なカーネルインターセプトを再実装しようとしています(このPhrackの問題で説明されています)。
32ビット関数呼び出しを置き換えるコードは次のようになります。
#define SYSMAPADDR 0x12345678
#define CODESIZE 7
static char acct_code[7] = "\xb8\x00\x00\x00\x00"/*movl $0, %eax*/
"\xff\xe0";/*jmp *%eax*/
*(long*)&acct_code[1] = (long)my_hijacking_function;
// here, use either set_pages_rw or trick CR0 to do this:
memcpy(SYSMAPADDR, acct_code, CODESIZE);
ただし、元の関数の64ビットアドレスは0xffffffff12345678です(カーネルは低メモリにあります)。
では、(長い)新しい関数ポインターはmovl命令の4 \ x00バイトにちょうど収まりますか?
ところで、これをリンクしてくださいLinuxカーネル関数をモジュールに置き換えることはできますか?Linuxカーネルのモジュールで機能をオーバーライドすると、上記のハッキーな方法はより柔軟になります(外部以外の関数をインターセプトできます=>カーネルを再コンパイルする必要はありません)。