出于教育目的,我设法 create a custom syscall只是在内核日志中打印一条消息。
我现在想的是创建一个“跨进程 memcpy”系统调用,它接收另一个进程的 PID、该进程内存空间的内存地址、长度和当前进程内存空间中的指针,并将内存从另一个进程复制到当前进程。
我的想法是编写一个程序,向用户询问一个字符串,然后打印它的 PID、存储该字符串的变量地址及其长度。然后我会编写另一个进程来请求 PID、地址和长度,并使用我的自定义系统调用将该信息从另一个进程复制到这个进程。
理论上,我知道内核应该能够访问一切,包括其他进程内存。但实际上我发现有 copy_from_user
或 copy_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_PEEKDATA
和 PTRACE_POKEDATA
操作。您可以使用 ptrace
解决您的问题或者从它的实现中抄袭一些东西。
引入系统调用来访问内存可能不是一个好主意。您必须确保它是安全编码的,并且它会检查调用者的凭据,否则您可能会打开一个巨大的安全漏洞。
关于自定义系统调用可以访问另一个进程的内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59021756/