teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

プロセスからソケットを取得する方向での質問を追加

2018/01/30 10:00

投稿

u_09
u_09

スコア18

title CHANGED
File without changes
body CHANGED
@@ -4,4 +4,51 @@
4
4
  PID 取得のために struct task_struct の取得を試みたり, socket->file->f_owner->pid (https://stackoverflow.com/questions/28841483/getting-pid-from-sk-buff-and-inode-in-linux-kernel) を取得しようとしましたができませんでした.
5
5
  前者は task_struct がそもそも取得できず, 後者は f_owner が空 (?) のようで取得できませんでした.
6
6
  struct pid ではなく単純に PID を知りたいだけなのですが, 何か方法はないでしょうか.
7
- よろしくお願いします.
7
+ よろしくお願いします.
8
+
9
+ 追記
10
+
11
+ 逆にプロセス (task_struct) からsocketをたどることはできたのですが, この処理をどこにいれればいいのかがわかりません. 例えば, task_struct の解放のタイミングではすでにソケットが閉じられているためアドレスが取れません. ソケット生成のタイミングやバインドのタイミングでは上記の通り task_struct が取れません. 今考えているのは, task_struct を持っているカーネル内の関数をフックし下記の処理を追加してアドレスを取る方法です. ですが, フック先として適した関数を見つけられずにいます. 全てのソケットについてPIDとアドレスを取得したいです.
12
+
13
+ こちらの方法 (task_struct => sock) でも構いませんのでご回答よろしくお願いいたします.
14
+
15
+ ```
16
+ int get_ip(struct task_struct *task)
17
+ {
18
+ struct sock *sk;
19
+ struct files_struct *files;
20
+ struct fdtable fdtab;
21
+ struct inet_sock *inet;
22
+
23
+ unsigned int max_proc_fds = 0;
24
+ unsigned int i = 0;
25
+
26
+ if (!task || !task->mm || task->pid <= 1)
27
+ return -1;
28
+
29
+ files = task->files;
30
+ if (!files)
31
+ return -1;
32
+ fdtab = files->fdtab;
33
+ if (!files->fdt || !fdtab.fd || !(*fdtab.fd) || !fdtab.fd[0])
34
+ return -1;
35
+ max_proc_fds = fdtab.max_fds;
36
+
37
+ rcu_read_lock();
38
+ for (i = 3; i < max_proc_fds; ++i) {
39
+ inet = NULL;
40
+
41
+ if (!fdtab.fd[i])
42
+ break;
43
+ if (!fcheck_files(files, i))
44
+ continue;
45
+ if (!(sk = get_sock(fdtab.fd[i])) || !(inet = inet_sk(sk)))
46
+ continue;
47
+
48
+ // inet から IP アドレスを取得する
49
+ }
50
+ rcu_read_unlock();
51
+
52
+ return -1;
53
+ }
54
+ ```