自定义系统调用可以访问另一个进程的内存吗?

标签 c linux linux-kernel virtual-address-space userspace

出于教育目的,我设法 create a custom syscall只是在内核日志中打印一条消息。

我现在想的是创建一个“跨进程 memcpy”系统调用,它接收另一个进程的 PID、该进程内存空间的内存地址、长度和当前进程内存空间中的指针,并将内存从另一个进程复制到当前进程。

我的想法是编写一个程序,向用户询问一个字符串,然后打印它的 PID、存储该字符串的变量地址及其长度。然后我会编写另一个进程来请求 PID、地址和长度,并使用我的自定义系统调用将该信息从另一个进程复制到这个进程。

理论上,我知道内核应该能够访问一切,包括其他进程内存。但实际上我发现有 copy_from_usercopy_to_user函数在用户空间和内核空间之间复制内存,但它们不接收 PID 或任何其他进程标识符。因此,系统调用似乎以某种方式关于调用者进程的上下文信息——我不知道是否有任何限制或 API 阻止/允许从系统调用访问另一个进程的内存空间。

Linux 内核是否有任何 API 来访问另一个进程的内存,给定它的 PID 和内存地址?

最佳答案

Does the Linux kernel have any API to access another process' memory, given it's PID and memory address?

是的,get_user_pages .

请注意,其他进程未映射到调用者的地址空间。 get_user_pages获取底层页面。

我们可以使用get_user_pages在涵盖要读取或写入的请求区域的一系列页面上获得引用。然后小心地将数据复制到这些页面和从这些页面中复制出来,以便我们只接触请求的区域。

/proc/<pid>/mem机制可能基于 get_user_pages ;无论如何,值得一看,看看它是如何工作的。

另请参阅 ptrace系统调用及其PTRACE_PEEKDATAPTRACE_POKEDATA操作。您可以使用 ptrace 解决您的问题或者从它的实现中抄袭一些东西。

引入系统调用来访问内存可能不是一个好主意。您必须确保它是安全编码的,并且它会检查调用者的凭据,否则您可能会打开一个巨大的安全漏洞。

关于自定义系统调用可以访问另一个进程的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59021756/

相关文章:

c - 使用 Pipes 和 exec() 来控制另一个控制台应用程序

c - MIPS 汇编 - 字符串到二进制表示

linux - POSIX AIO 库和回调处理程序

linux - 这是一个有效的 Go 路径配置吗?

linux - 是否可以从 linux 的用户空间执行 net_enable_timestamp()?

c - 遇到文件 I/O 和字符串数组的问题

c - 这个递归行如何实现打印反转的字符串?

linux - 了解事件是否发生(运行 gtk_dialog_run() 时)

linux - 可以从 Linux 内核模式写入 BIOS 吗?

c - 如何通过 kprobe 将 BPF 程序附加到内核函数?