gpt4 book ai didi

c - 获取当前进程上下文的实际可执行路径 - Linux kernel

转载 作者:IT王子 更新时间:2023-10-29 00:34:56 27 4
gpt4 key购买 nike

我正在尝试通过我的内核驱动程序获取正在运行的进程的实际可执行路径。

我做了以下事情:

static struct kretprobe do_fork_probe = {
.entry_handler = (kprobe_opcode_t *) process_entry_callback,
.handler = (kprobe_opcode_t *) NULL,
.maxactive = 1000,
.data_size = 0
};

do_fork_probe.kp.addr = (kprobe_opcode_t*)kallsyms_lookup_name("do_fork");

if ((ret = register_kretprobe(&do_fork_probe)) < 0)
return -1;

static int process_entry_callback(struct kretprobe_instance *ri, struct pt_regs *regs)
{

printk("Executable path = %s\n", executable_path(current));
return 0;
}

executable_path 函数:

char* executable_path(struct task_struct* process)
{
#define PATH_MAX 4096
char* p = NULL, *pathname;
struct mm_struct* mm = current->mm;
if (mm)
{
down_read(&mm->mmap_sem);
if (mm->exe_file)
{
pathname = kmalloc(PATH_MAX, GFP_ATOMIC);
if (pathname)
p = d_path(&mm->exe_file->f_path, pathname, PATH_MAX);
}
up_read(&mm->mmap_sem);
}

return p;
}

问题是,如果我按如下方式使用 bash 运行可执行文件:

./execname

我得到以下输出:

Executable path = /bin/bash

虽然我真正想要的是 : execname(实际上是它的完整路径,但让我们从名称开始)

有什么建议吗?

最佳答案

不清楚你想得到什么,所以这里是选项列表:

  • execname 因为它被 SystemTap 认为。简单的 process->comm 就足够了。这就是 comm 字段在内核中定义的方式:

    char comm[TASK_COMM_LEN]; /* executable name excluding path
    - access with [gs]et_task_comm (which lock
    it with task_lock())
    - initialized normally by setup_new_exec */

    但是如果 bash 是一个符号链接(symbolic link),那么 comm 应该包含符号链接(symbolic link)的名称,而不是真正的可执行文件名称。

  • argv[0] 命令行参数数组的第一个元素,因为它看到我的应用程序(并且可能会被它更改)。内核中有一个get_cmdline()函数,但是好像没有导出。

  • 完整路径的基本名称。在这种情况下,不要调用d_path,只取dentry的d_name字段:

    strlcpy(pathname, mm->exe_file->f_path->d_name, PATH_MAX);

但这听起来像是一个 XY 问题。您试图获取所有 fork 进程的可执行文件名称?为什么不使用 SystemTap直接?

# stap -v -e 'probe scheduler.process_fork { println(execname()); }'

关于c - 获取当前进程上下文的实际可执行路径 - Linux kernel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28644637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com