【问题标题】:How can I retrieve a task's sessionid in an eBPF program?如何在 eBPF 程序中检索任务的 sessionid?
【发布时间】:2018-01-24 14:51:17
【问题描述】:

我想从 eBPF 程序中的任务结构中检索 sessionid。我的 eBPF 程序中有以下代码:

struct task_struct *task;
u32 sessionid;    

task = (struct task_struct *)bpf_get_current_task();
sessionid = task->sessionid;

这会运行,但 sessionid 总是以 -1 结束。我在this 中读到答案,我可以使用task_session 来检索它,但我收到有关无效内存访问的错误。我相信我需要使用bpf_probe_readtask 指向的task_struct 移动到堆栈上,但我无法让它工作。我有什么遗漏吗?

【问题讨论】:

  • 如果没有看到您的代码,很难确切地说出为什么会发生这种情况。请注意,eBPF 不能调用任意核函数。
  • 是的,我想我本可以更清楚地了解我是如何构建程序/如何注入它的——我设法以不同的方式获得了 sessionid,所以我自己给出了答案。我现在正在尝试这样做:p stackoverflow.com/questions/48447855/…

标签: linux linux-kernel bpf ebpf


【解决方案1】:

在深入研究task_struct 结构后,我意识到你可以这样做:

struct task_struct *task;
struct pid_link pid_link;
struct pid pid;
unsigned int sessionid;

task = (struct task_struct *)bpf_get_current_task();

bpf_probe_read(&pid_link, sizeof(pid_link), (void *)&task->group_leader->pids[PIDTYPE_SID]);    
bpf_probe_read(&pid, sizeof(pid), (void *)pid_link.pid);

sessionid = pid.numbers[0].nr;

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2013-09-17
    • 1970-01-01
    • 2019-06-10
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多