既存の構造体 linux_binprm からすべての argv を抽出したいと考えています。カーネル 3.4 で、次のコードを試しました: http://www.mail-archive.com/kernelnewbies@nl.linux.org/msg00278.html in do_excve_common ですが、うまくいきません。(null) を返します。問題は何ですか? char * 文字列内のすべての引数を取得するにはどうすればよいですか?
1 に答える
1
. do_execve_common() でバイナリ ローダーを実行する前に完全なコマンド ラインを取得したい場合は、以下を試すことができます: 関数 do_execve_common() パラメーター テーブルに引数 *argv が 1 つあります。 ? 次のコードで *argv を直接使用できます。do_execve_common() に、次のようなコードを挿入します。
argc = count(argv, MAX_ARG_STRINGS);
i = 0;
while (i < argc)
{
const char __user *str;
int len;
ret = -EFAULT;
str = get_user_arg_ptr(argv, i);
if (IS_ERR(str))
goto out;
len = strnlen_user(str, MAX_ARG_STRLEN);
if (!len)
goto out;
//copy the str to kernel temporary storage
//NOTE: tmp[] is a string array,
// the memory should have been allocated already for strings storage,
// each string is ended with \0
memcpy(tmp[i], str, len)
}
これらのコードを実行した後、argv 文字列はすべて tmp[] 配列に保存されると思います。
. バイナリローダーの実行後に完全なコマンドラインを取得したい場合は、現時点で引数ページが正しく設定されていると思いますが、次のアプローチを試して完全なコマンドラインを取得できます: 関数 proc_pid_cmdline() に. /fs/proc/base.c ファイルでは、proc_pid_cmdline() 関数のほとんどのコードを再利用して、引数ページから完全なコマンド ラインを取得できます。
于 2013-03-11T01:24:42.490 に答える