1

全てにおいて良い日。誰かが私を助けてくれることを願っています。事前に感謝の意を表します。何時間も検索しましたが、解決策を見つけることができませんでした。

私の問題:

「security_task_create(clone_flags)」関数のアドレスを取得する必要があります。次のコード スニペット (「/usr/src/linux-2.6.27/kernel/fork.c」に従って、926 行目、fork.c にあります) - :

************************************ ************************************ 

static struct task_struct *copy_process(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *child_tidptr,
struct pid *pid,
int trace)

{

int retval;
struct task_struct *p;
int cgroup_callbacks_done = 0;

if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
return ERR_PTR(-EINVAL);

/*
* Thread groups must share signals as well, and detached threads
* can only be started up within the thread group.
*/
if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
return ERR_PTR(-EINVAL);

/*
* Shared signal handlers imply shared VM. By way of the above,
* thread groups also imply shared VM. Blocking this case allows
* for various simplifications in other code.
*/
if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
return ERR_PTR(-EINVAL);

****retval = security_task_create(clone_flags);****
if (retval)
goto fork_out;

retval = -ENOMEM;
p = dup_task_struct(current);
if (!p)
goto fork_out;

rt_mutex_init_task(p);
************************************ ************************************ 

カーネル 3.1.7 を搭載した Fedora Core 16 マシンで、キーボード経由の KDB アクセスを有効にしました。KDB コンソール (つまり " kdb[0]> ) に入ると、security_task_create と入力すると、0x0040118e などの 16 進アドレスが表示されます。

私の質問:

  1. 表示されている 16 進アドレスは、カーネルがロードされたときの security_task_create のアドレスですか?

2.ない場合、security_task_create 関数のアドレスを取得するにはどうすればよいですか? security_task_create 関数のアドレスを取得するように KDB を構成するにはどうすればよいですか?

  1. 私が念頭に置いているのは、カーネルがメモリ内で security_task_create を実行するときに、KDB を使用して fork.c の 926 行目にブレークポイントを挿入することです。それが本当に適切な解決策である場合、そのような方法を使用して security_task_create のアドレスを取得するにはどうすればよいですか?
4

2 に答える 2

0

ソース ディレクトリで printk を grep するだけで、たくさんの例が見つかるはずです。

printk(KERN_INFO "fork(): process `%s' used deprecated "
                    "clone flags 0x%lx\n",
                get_task_comm(comm, current),
                clone_flags & CLONE_STOPPED);
于 2013-12-26T19:27:31.830 に答える
0

カーネル内の任意のシンボルのアドレスを取得するには、単純にSystem.mapファイルを使用します。

CONFIG_KALLSYMSそのファイル内のすべてのシンボルを取得するには、カーネル構成で有効にする必要があります。

于 2013-10-16T09:29:31.623 に答える