hook系统调用表函数sys_execve后如何打印argv参数

发布于 2025-01-17 15:54:10 字数 1377 浏览 2 评论 0原文

作为标题,我通过ftrace连接系统呼叫表函数sys_execve,但是当我打印argv参数和envp参数时,printk函数会打印一堆无形的字符,我该怎么做才能打印argv参数通常

“在此处输入映像”

我的操作系统是ubuntu18.04,内核版本为5.4.0,编译器是GCC-7.5

我的挂钩代码看起来像

static asmlinkage long (*orig_sysexecve)(const struct pt_regs*);

asmlinkage int hook_sysexecve(const struct pt_regs *regs)
{
        char __user *filename = (char *)regs->di;
        char file_name[NAME_MAX] = {0};
        char __user *argv = (char *)regs->si;
        char __user *envp = (char *)regs->dx;
        char envp_list[NAME_MAX] = {0};
        char argv_list[NAME_MAX] = {0};

        long error1 = strncpy_from_user(file_name,filename,NAME_MAX);
        long error2 = strncpy_from_user(argv_list,argv,NAME_MAX);
        long error3 = strncpy_from_user(envp_list,envp,NAME_MAX);
        if(error1 > 0 && error2 > 0 && error3 > 0)
        {
            printk(KERN_INFO "[TestSysExecve]: filename = %s | argv = %s | envp = %s\n",file_name,argv_list,envp_list);
        }
        orig_sysexecve(regs);
    return 0;
}

我尝试使用char __user ** argv =(char **)regs-> si; char ** argvs;长错误= strncpy_from_user(argvs,argv,name_max),但直接编译失败。

还要尝试使用char ** argv =(char **)regs-> si; printk(kern_info“%s”,argv [0]);,但是此系统直接损坏。

as title,I hook system call table function sys_execve through ftrace,But when I print the argv parameter and the envp parameter, the printk function prints a bunch of invisible characters,What should I do to print the argv parameter normally

enter image description here

My OS is ubuntu18.04,Kernel version is 5.4.0,the compiler is gcc-7.5

My hook code looks like this

static asmlinkage long (*orig_sysexecve)(const struct pt_regs*);

asmlinkage int hook_sysexecve(const struct pt_regs *regs)
{
        char __user *filename = (char *)regs->di;
        char file_name[NAME_MAX] = {0};
        char __user *argv = (char *)regs->si;
        char __user *envp = (char *)regs->dx;
        char envp_list[NAME_MAX] = {0};
        char argv_list[NAME_MAX] = {0};

        long error1 = strncpy_from_user(file_name,filename,NAME_MAX);
        long error2 = strncpy_from_user(argv_list,argv,NAME_MAX);
        long error3 = strncpy_from_user(envp_list,envp,NAME_MAX);
        if(error1 > 0 && error2 > 0 && error3 > 0)
        {
            printk(KERN_INFO "[TestSysExecve]: filename = %s | argv = %s | envp = %s\n",file_name,argv_list,envp_list);
        }
        orig_sysexecve(regs);
    return 0;
}

I tried using char __user **argv = (char**)regs->si; char **argvs; long error = strncpy_from_user(argvs,argv,NAME_MAX),but the direct compilation fails.

Also try to use char **argv = (char**)regs->si;printk(KERN_INFO "%s",argv[0]);,But this system is directly broken.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独木成林 2025-01-24 15:54:10

它实际上比人们想象的要简单得多。你可以看看我在我的项目中是如何做到的:
获取 execve 系统调用的 argv
获取调用的进程的argv open/openat

open/openat 选项是一个单行选项,现在我想了一下,它也应该适用于 execve。
如果对您有帮助,请随意为该项目加注星标;)

Its actually much simpler then people think. You can check out how I did it in my project:
Get argv of execve syscall
Get argv of process that called open/openat

The open/openat option is a one liner, and now that I think about it, it should work for execve as well.
Feel free to star the project if it helped you ;)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文