【发布时间】:2015-02-21 18:44:31
【问题描述】:
我正在尝试通过我的内核驱动程序获取正在运行的进程的实际可执行路径。
我做了以下事情:
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(实际上是它的完整路径,但让我们从名称开始)
有什么建议吗?
【问题讨论】:
-
你使用的是printk(),可能得不到p指向的完整路径,因为字符串中'/bin/bash'后面可能有'\n',printk在它看到了新行。只是猜测。
标签: c linux linux-kernel