STATUS: 故障中
前回の続き
とりあえずいろいろ試してみましたが、まだうまくいかないや。
(1) _syscall2マクロを使ってみました。
こんな感じでいのでしょうか。
_syscall2( int , open , const char *,pathname, int ,flags);
コンパイルすると次のようなエラーになるので、
(上記のマクロは24行目にあります。)
$ gcc -c hook_uname.c
hook_uname.c: In function `open':
hook_uname.c:24: `errno' undeclared (first use in this function)
hook_uname.c:24: (Each undeclared identifier is reported only once
hook_uname.c:24: for each function it appears in.)
errno.hをインクルードしてみましたが、
#include
モジュールを組み込むにエラーにになってしまいました。
#insmod -f hook_uname.o
hook_uname.o: unresolved symbol errno
(2) sys_openを使ってみました。
fd = func_sys_open("/tmp/hook_uname.txt",O_APPEND | O_CREAT );
コンパイルは成功しましたが、モジュールを組み込むにエラーにになってしまいました。
#insmod -f hook_uname.o
hook_uname.o: unresolved symbol sys_open
(3) sys_call_tableのアドレスを呼び出してみました
int (*func_sys_open)(const char *pathname, int flags);
func_sys_open = sys_call_table[SYS_open];
fd = func_sys_open("/tmp/hook_uname.txt",O_APPEND | O_CREAT );
コンパイル、insmodとも成功しましたが、実行すると
func_sys_openの呼び出し中に失敗し -9 が返ってきました。
-1ならともかく、-9ってなんだよ。違うエントリ呼んでしまってりうのかなあ。
やっぱりカーネル内からの呼び出しはだめですか。
皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー