问题标签 [kprobe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - register_kprobe 正在返回 -2
我正在尝试挂钩一些内核函数以用于学习目的,我在下面编写了简单的内核模块,但由于某些原因,register_kprobe
总是返回 -2。我没有发现它所说的这个错误意味着什么,也不知道如何继续。起初我以为是因为它list_add
是一个内联函数,所以我尝试将其替换为kvm_create_vm
并得到相同的结果。然后我检查/proc/kallsyms
并发现两者都没有出现在那里。所以我选择了我也试过kvm_alloc
哪个是导出的,但我仍然得到错误-2。alloc_uid
,但这工作得很好。
我的问题:可以连接什么样的功能kprobes
?
编辑
我划过的线是我感到困惑的主要原因。我错过了拼写kvm_alloc
,它应该kvmalloc
没有下划线。这个功能很好地被钩住了。
linux - kprobe机制拦截do_page_fault
我试图拦截__do_page_fault()
linux内核中的方法。正常的注册方式kprobes
,即定义kp.addr
为
不管用。这样做的正确方法是什么?
编辑:任何其他拦截 do_page_fault 的方法也适用于我。
linux - 在 Jprobes 模块中设置它们后的寄存器值不一致
这个问题是我之前关于Intercepting ELF loader的问题的延续。
现在确切的问题是,以前代码逻辑是在load_elf_binary
函数中实现的,其中函数寄存器的末尾是eax, ebx, ecx and edx
通过内联 asm 调用设置的,就在函数返回之前。
我已经jprobe
在load_elf_binary
函数上植入了一个,因为我需要访问struct linux_binprm *bprm
参数,但是由于我在 jprobe 处理程序中设置了寄存器值,因此当控件返回到实际函数并且应用程序以分段错误终止时会导致不一致。
有什么可能的解决方案?
linux - 函数中间的 Kprobe/Jprobe
我想拦截文件中的load_elf_binary
函数,fs/binfmt_elf.c
从通过参数传递给它的文件中读取一些自定义节标题,并在从函数返回之前设置一些寄存器(eax、ebx、ecx、edx)。
现在我读到 Jprobes 是访问目标函数参数的好方法,但问题是一旦控制从 Jprobes 函数返回,寄存器和堆栈值就会按照它的规范恢复,所以我正在寻找一种解决方法并且可能在函数的中间插入一个探针(最好是在最后)将是一个好主意。如果我错了,请纠正我并提供帮助。
linux-kernel - 在 kretprobe 处理程序中获取函数的返回值
我想知道是否可以将 kretprobe 挂接到内核函数上并在 kretprobe 的返回处理程序中捕获它的返回值。
linux-kernel - 两个内核 kprobes/kretprobes 之间的通信
是否可以使用 kretprobe 捕获内核函数的返回值并将其传递给另一个连接到另一个内核函数的 kretprobe。
linux-kernel - register_kretprobe 失败,返回值为 -2
我编写了一个 kretprobe 来连接 fs/binfmt_elf.c 文件中提到的 randomize_stack_top() 函数。在使用 insmod 加载 LKM 时,register_kretprobe() 调用失败,返回值为 -2。我该如何调试/纠正它以启动我的模块?
linux-kernel - 从 Kprobe 处理程序打开/写入文件
我正在编写一个用于跟踪特定系统调用的 Linux 内核模块,并且我需要从处理程序(特别是 a )Kprobes
中写入文件。我知道通常不建议这样做,但我需要将输出写入一个非常具体的位置,所以我不能使用任何标准的日志记录机制。KProbe
Kretprobe
我可以从模块中的函数打开/写入正常init()
,但是当我尝试从探测处理程序中这样做时,内核崩溃了。
linux - jprobe do_execve 不适用于内核 4.1
我想在 do_execve 上设置一个 jprobe 钩子来捕获每个执行的程序。
我的代码正在<= 3.2 linux内核(debian)上运行。这是我在 linux 内核 3.2 上的输出:
在 4.1 内核上,我得到相同的结果(所有内容都已注册),但没有“execve”:
这是我的代码:
当我在 kallsyms 上执行 grep 时,我得到了 3.2:
在 4.2 上:
我什至尝试将函数(因为 do_execve 原型已更改)更改为:
甚至没有帮助。
我可以在 do_fork 或 sys_open 等其他函数上设置挂钩,但不能在 do_execve 上设置。为什么?有人有想法吗?为什么它不再工作了?
编辑:
我也在挂钩 do_execveat:
linux - 如何在 kprobe 中使用寄存器?
来自kprobe 文档:
据我了解,在X86_64
平台上,参数应该传递到寄存器中(请参阅X86_64 syscalls)。所以我认为添加探针应该是这样的:
但是执行上面的语句,bash
报错:
所以我的问题是:如何使用寄存器kprobe
?哪些寄存器有效?