一个进程在运行时是否可以更改另一个进程中变量的值?

时间:2019-01-19 01:14:36

标签: c memory stack

一个可执行文件(进程)在运行时是否可以修改另一个可执行文件(进程)的变量值?

2 个答案:

答案 0 :(得分:0)

是的,有可能。例如Linux操作系统提供了ptrace系统调用,您不仅可以检查它,还可以更改跟踪对象的内存。来自 ptrace [添加了重点]:

  

ptrace()系统调用提供了一种方法,通过该方法,一个进程(“示踪剂”)可以观察并控制另一个进程的执行(“示踪剂”),并检查并更改跟踪的内存和寄存器。它主要用于实现断点调试和系统调用跟踪。

答案 1 :(得分:0)

可能,是的,但不能保证。

在正常操作中,每个进程的地址空间是完全分开的。

进程可以使用共享内存来允许在不同进程中访问相同的内存区域(请注意,每个进程中该区域可见的地址不一定相同)。在大多数操作系统中,您甚至可以通过这种方式映射文件。

操作系统提供各种功能来帮助进行开发和调试。在Linux和BSD(最初来自Unix System V)中,ptrace接口可能是最强大的。通常,该接口在以相同用户ID运行的进程之间工作,并且需要超级用户特权才能使用该接口。 (在Linux中,取决于内核配置,还可以通过/proc/PID/mem操作每个进程直接看到的内存内容。这也具有类似的安全注意事项。)

在Linux中,进程可以调用prctl(PR_SET_DUMPABLE, 0uL)以使其自身及其子级不可追踪。例如,这在特权服务启动代表非特权用户执行某项操作的助手进程时很常见,但是该助手进程需要确保不会受到该用户的操纵(例如,助手进程返回用户应具有的某些特权数据)无法欺骗或伪造。)

(实际上,如果某个进程通过seteuid()setegid()setfsuid()setfsgid()或相关调用更改了其标识,或者该进程以setuid / setgid二进制文件,或基于其二进制文件的文件系统功能获得的额外功能,内核会自动执行上述prctl()调用的等效操作,不允许跟踪此类进程。)

通过在{{1}中指定这些额外动态库的路径,Linux中的动态链接器还可以用于将代码插入或注入到用户启动的任何(非setuid / setgid / gaining-capabilities)进程中。 }环境变量。这样就可以用自己的包装器替换标准C库函数。 ELF可执行文件格式还支持“构造函数”和“析构函数”。在执行二进制文件并退出时(即{{1}之前和之后)会自动调用的函数。这些实际上使您可以为启动的任何进程(使用您自己的用户帐户和用户权限运行)注入小型服务,您可以远程连接到该进程并对其进行恶作剧,例如重定向文件或更改存储的数据在某些内存地址。

如您所见,更好的问题是如何何时一个进程可以在运行时更改另一个进程中变量的值。答案取决于具体情况。最常见的情况是使两个进程互相通信-进程间通信-,以便目标进程实际上在另一个进程要求这样做时进行修改。解决方案视具体情况而定-当然也要使用所使用的操作系统;我在这里的回答是针对Linux的,但是在所有操作系统中都可以使用相似或相关的功能,它们只是有所不同。