2

我正在尝试编写一个示例代码,看看它是如何实际工作的。

正如这里所说并在这里讨论过

如果一切正确,输出应该是:

$ cat foo1
this is foo1 content
$ cat foo2
this is foo2 content
$ sudo bcc_mangle_open.py &
[1] 63453
$ cat foo1
this is foo2 content

我在密件抄送中写了一个示例,如下所示:

from bcc import BPF

# define BPF program
prog = """
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
int trace_entry(struct pt_regs *ctx)
{
    char buf[10];
    char foo2[] = "foo2";
    char *fname = (char *) PT_REGS_PARM1(ctx);

    bpf_probe_read_str(buf, sizeof(buf), fname);
    if (buf[0] != 'f' || buf[1] != 'o' || buf[2] != 'o' || buf[3] != '1') {
        return 0;
    }

    bpf_probe_write_user(fname, foo2, sizeof(foo2));

    return 0;
};
"""

# load BPF program
b = BPF(text=prog)

b.attach_kprobe("do_sys_open", fn_name="trace_entry")

的内容foo1应该改变,但它没有发生。

我曾尝试打印fname甚至buf使用bpf_trace_printk(),但我的屏幕上什么也没有。

知道为什么内容没有改变吗?

更新-1

正如@Queole 所建议的那样

.它起作用了..所以我们必须给予(char *) PT_REGS_PARM2(ctx)而不是(char *) PT_REGS_PARM1(ctx)。我得到了输出,但有点奇怪。经过一些 3-4 cat foo1,内容正在发生变化。

$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo2 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo1 content
$ cat foo1
this is foo2 content

这种行为的原因是什么?

4

0 回答 0