作用层次:uprobe本身是基于Linux内核的机制,它工作在内核层(Kernel Space),由内核子系统提供支持。然而,uprobe的探测目标是用户态进程(User Space Process),它可以监视应用程序中函数的调用或指令的执行。 主要功能:允许用户在用户空间程序的特定位置(如函数入口)插入探测点,以监测和分析程序的行为:
intmain(int argc, char *argv[]){ structuprobe_bin_bpf *skel; int err = 0; // define var uprobe_opts, type is bpf_uprobe_opts LIBBPF_OPTS(bpf_uprobe_opts, uprobe_opts); skel = uprobe_bin_bpf__open_and_load(); if (!skel) { fprintf(stderr, "Failed to open and load BPF skeleton\n"); return1; }
//uprobe_opts.func_name = "myadd"; // used when binary has symbols uprobe_opts.retprobe = false; skel->links.uprobe_add = bpf_program__attach_uprobe_opts(skel->progs.uprobe_add, -1, "/home/fanrong/Computer/Cpp/calc", 0x1169, // offset for function, 0 when func_name knows &uprobe_opts); if (!skel->links.uprobe_add) { fprintf(stderr, "Failed to attach uprobe: %d\n", -errno); goto cleanup; } printf("Uprobe attached. Monitoring function add\n"); while (1) { fprintf(stderr, "."); sleep(1); } cleanup: uprobe_bin_bpf__destroy(skel); return -err; }
char LICENSE[] SEC("license") = "GPL"; SEC("uprobe") intBPF_UPROBE(uprobe_add, int a, int b){ bpf_printk("add ENTRY: a = %d, b = %d", a, b); return0; }
SEC("uprobe") intuprobe_add(struct pt_regs *ctx){ int a = PT_REGS_PARM1(ctx); int b = PT_REGS_PARM2(ctx); bpf_printk("add ENTRY: a = %d, b = %d", a, b); return0; }