1

既存の構造体 linux_binprm からすべての argv を抽出したいと考えています。カーネル 3.4 で、次のコードを試しました: http://www.mail-archive.com/kernelnewbies@nl.linux.org/msg00278.html in do_excve_common ですが、うまくいきません。(null) を返します。問題は何ですか? char * 文字列内のすべての引数を取得するにはどうすればよいですか?

4

1 に答える 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 に答える