0

sys exit 呼び出しを変数に設定しようとしています

extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]

ただし、作成しようとすると、コンソールにエラーが表示されます

error: ‘__NR_exit’ undeclared (first use in this function) 

どんなヒントでもいただければ幸いです:)ありがとう

4

2 に答える 2

5

カーネル2.6.xを使用しているため、sys_call_tableはエクスポートされなくなります。コンパイルエラーを回避したい場合は、これを含めてみてください

#include<linux/unistd.h>

ただし、動作しません。したがって、sys_call_tableを「再生」するための回避策は、次のコマンドを使用してSystemXXXX.map(/ bootにあります)でsys_call_tableのアドレスを見つけることです。

grep sys_call System.map-2.6.X -i

これによりアドレスが提供され、次のコードでテーブルを変更できるようになります。

unsigned long *sys_call_table; 
sys_call_table = (unsigned long *) simple_strtoul("0xc0318500",NULL,16); 


original_mkdir = sys_call_table[__NR_mkdir];
sys_call_table[__NR_mkdir] = mkdir_modificado;

それがあなたのために働くことを願っています、私はカーネル2.6.24の下でそれをテストしたばかりなので、2.6.18で働くはずです

こちらもチェックしてください。非常に優れた http://commons.oreilly.com/wiki/index.php/Network_Security_Tools/Modifying_and_Hacking_Security_Tools/Fun_with_Linux_Kernel_Modules

于 2009-12-09T00:29:44.183 に答える
2

ファイル syscall.h をインクルードしていない場合は、__NR_exit への参照の前にインクルードする必要があります。例えば、

#include <syscall.h>
#include <stdio.h>

int main()
{
    printf("%d\n", __NR_exit);
    return 0;
}

戻り値:

$ cc t.c
$ ./a.out 
60

その他の観察事項:

  1. ファイルを既にインクルードしている場合、通常の理由は、条件付きコンパイル (またはどこかで作業中) のために__NR_exit定義が無視されたか、 .#ifdef#ifndef#undef

  2. カーネル スペース用のコードを作成している場合は、使用するヘッダーのセットがまったく異なります。LXR ( http://lxr.linux.no/linux ) のカーネル ソースの検索および参照可能なアーカイブは、役立つリソースです。

于 2009-10-19T00:53:07.933 に答える