質問編集履歴

1

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

2018/01/30 10:00

投稿

u_09
u_09

スコア18

test CHANGED
File without changes
test CHANGED
@@ -11,3 +11,97 @@
11
11
  struct pid ではなく単純に PID を知りたいだけなのですが, 何か方法はないでしょうか.
12
12
 
13
13
  よろしくお願いします.
14
+
15
+
16
+
17
+ 追記
18
+
19
+
20
+
21
+ 逆にプロセス (task_struct) からsocketをたどることはできたのですが, この処理をどこにいれればいいのかがわかりません. 例えば, task_struct の解放のタイミングではすでにソケットが閉じられているためアドレスが取れません. ソケット生成のタイミングやバインドのタイミングでは上記の通り task_struct が取れません. 今考えているのは, task_struct を持っているカーネル内の関数をフックし下記の処理を追加してアドレスを取る方法です. ですが, フック先として適した関数を見つけられずにいます. 全てのソケットについてPIDとアドレスを取得したいです.
22
+
23
+
24
+
25
+ こちらの方法 (task_struct => sock) でも構いませんのでご回答よろしくお願いいたします.
26
+
27
+
28
+
29
+ ```
30
+
31
+ int get_ip(struct task_struct *task)
32
+
33
+ {
34
+
35
+ struct sock *sk;
36
+
37
+ struct files_struct *files;
38
+
39
+ struct fdtable fdtab;
40
+
41
+ struct inet_sock *inet;
42
+
43
+
44
+
45
+ unsigned int max_proc_fds = 0;
46
+
47
+ unsigned int i = 0;
48
+
49
+
50
+
51
+ if (!task || !task->mm || task->pid <= 1)
52
+
53
+ return -1;
54
+
55
+
56
+
57
+ files = task->files;
58
+
59
+ if (!files)
60
+
61
+ return -1;
62
+
63
+ fdtab = files->fdtab;
64
+
65
+ if (!files->fdt || !fdtab.fd || !(*fdtab.fd) || !fdtab.fd[0])
66
+
67
+ return -1;
68
+
69
+ max_proc_fds = fdtab.max_fds;
70
+
71
+
72
+
73
+ rcu_read_lock();
74
+
75
+ for (i = 3; i < max_proc_fds; ++i) {
76
+
77
+ inet = NULL;
78
+
79
+
80
+
81
+ if (!fdtab.fd[i])
82
+
83
+ break;
84
+
85
+ if (!fcheck_files(files, i))
86
+
87
+ continue;
88
+
89
+ if (!(sk = get_sock(fdtab.fd[i])) || !(inet = inet_sk(sk)))
90
+
91
+ continue;
92
+
93
+
94
+
95
+ // inet から IP アドレスを取得する
96
+
97
+ }
98
+
99
+ rcu_read_unlock();
100
+
101
+
102
+
103
+ return -1;
104
+
105
+ }
106
+
107
+ ```