我和ptrace
玩了一段时间。我按照了this one或this one这样的教程。到目前为止,当我有一个ptrace
- d子进程时,我能够:
PTRACE_PEEKDATA
的{{1}}选项。ptrace
的{{1}}选项,更改这些寄存器的值并更改子流程用户空间中的内存值。我的问题如下:例如,我刚刚检测到PTRACE_POKEDATA
系统调用。由于存储在ebx寄存器中的地址,我可以修改要打开的文件的文件名。但是,我想知道我是否可以将文件名更改为我想要的任何大小。如果我要更改的名称非常大(假设是原始文件名长度的50倍),那么我不应该在处理一些我不应该写的内存吗?我应该在孩子的记忆空间中“分配”一些记忆吗?如果是这样,将如何做?
请注意,子进程是使用ptrace
执行的某个程序,我无法访问其源代码。
答案 0 :(得分:2)
传递给open的路径名可以由程序动态分配(因此它在堆或堆栈的某处),或者如果它是编译时常量,它可以在只读部分。在任何一种情况下,您都不知道程序的其他部分可能正在使用它,因此更改其内容可能不是一个好主意。如果你写过当前长度,你肯定会覆盖相邻的内存(这可能会导致像破坏堆元数据或破坏其他随机分配对象这样的细微问题。)
以下是关于如何在子进程中分配内存的一些随机想法(完全未经测试):