【问题标题】:Is it possible for one process to change the value of a variable in another process at runtime?一个进程是否可以在运行时更改另一个进程中的变量值?
【发布时间】:2019-06-13 06:26:37
【问题描述】:

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

【问题讨论】:

  • 当然,调试器一直都在这样做。
  • 一般情况下,不会。如果进程共享一些共享内存,那么是的。如果其中一个进程是调试器,那么是的。但是您的平均流程无法更改另一个流程中的变量。 (哦,在使用vfork() 创建子进程后,父进程中还有一个漏洞窗口——子进程可能会修改父进程的变量,但这样做会调用未定义的行为。关于使用vfork() 的POSIX 规则非常严格。)
  • 我认为一个进程可能能够针对另一个进程启动调试器。
  • cheatengine.org 或任何其他游戏作弊/培训师。

标签: c memory stack


【解决方案1】:

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

正常运行时,每个进程的地址空间是完全独立的。

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

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

在 Linux 中,一个进程可以调用 prctl(PR_SET_DUMPABLE, 0uL) 以使自己及其子进程不可跟踪。这很常见,例如,当特权服务启动一个代表非特权用户执行某些操作的帮助程序进程时,该帮助程序进程需要防止该用户操纵(例如,帮助程序进程返回用户应该使用的一些特权数据)不能欺骗或伪造)。

(事实上,如果一个进程通过seteuid()setegid()setfsuid()setfsgid()或相关调用改变了它的身份,或者该进程作为setuid/setgid二进制执行,或者获得了额外的基于其二进制文件系统功能的功能,内核会自动执行与上述 prctl() 调用等效的操作,不允许 ptracing 此类进程。)

Linux 中的动态链接器还可用于插入或注入代码到用户启动的任何(非 setuid/setgid/gaining-capabilities)进程,方法是在 LD_PRELOAD 环境中指定那些额外动态库的路径多变的。这允许使用您自己的包装器替换标准 C 库函数。 ELF 可执行文件格式还支持“构造函数”和“析构函数”;在执行和退出二进制文件时自动调用的函数(即在main() 之前和之后)。这些允许您从本质上向您启动的任何进程(使用您自己的用户帐户和您的用户权限运行)注入一个小服务,您可以远程连接到该进程并对进程进行恶作剧,例如重定向文件或更改存储的数据在一些内存地址。

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

【讨论】:

  • @Ry-:确实如此。现在修好了。感谢您注意到这一点!
【解决方案2】:

是的,这是可能的。例如Linux 操作系统提供ptrace 系统调用,通过它您不仅可以检查还可以更改被跟踪者的内存。来自 ptrace [强调添加]:

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

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    相关资源
    最近更新 更多