【问题标题】:Linux writing to process' own executable file at runtimeLinux 在运行时写入进程自己的可执行文件
【发布时间】:2013-02-06 11:13:12
【问题描述】:

我希望能够将一些配置信息存储在可执行文件(C 程序)内的 char 数组中。而且我需要在运行时修改该数组的内容。 但我无法从进程中打开文件。 所以...有可能吗?如果是的话——有什么诀窍? 非常感谢。

[1] 问题是如何做,不是这是个好主意吗?

[2] 我想在运行时写入进程的自己的 EXEC 只是因为我很好奇如何做到这一点。让我们把它想象成有点 o hacking。

【问题讨论】:

  • 可执行文件在磁盘上,而您的程序在内存中加载。运行时,对文件磁盘版本的任何更改都不会影响正在运行的程序。另外,如果您在可执行文件中有一个数组,您的意思可能是全局变量之类的?在这种情况下,您只需访问它并更改它!
  • 谢谢!没错,它是一个全局 char 数组。问题是我得到的段错误。我刚刚用“string -tx a.out”找到了数组偏移量,并在程序中对其进行了硬编码,我应该 fseek() 和 fwrite()。但是我什至无法打开执行文件进行写入...
  • 不要这样做。改为使用 ASCII 配置文件。这样做的好处是您可以拥有多个配置文件,并且还可以让您在事情停止工作时轻松查看可执行文件正在使用的配置
  • 感谢您的回答。目标是写给执行官的想法……
  • 再一次,就像我说的,获取文件中数组的偏移量与它在内存中的地址完全无关。

标签: c linux runtime executable


【解决方案1】:

解决了。 使用 fork() + execl() 组合我制作可执行文件的副本,修改它没有任何问题,然后使用 fork + execl mv 我用修改后的可执行文件替换原始可执行文件。

【讨论】:

  • 按照描述在 RHEL 上工作 - fork() 子进程,system() 复制、写入、替换 - 错误 26 的好解决方法 - “文本文件忙”。
【解决方案2】:

写入可执行文件几乎肯定是错误的做法。这里最简单的方法是使用配置文件,然后将其读取到您的 char 数组中。

【讨论】:

  • 感谢您的回答。我只是很好奇我该怎么做,因为我发现在 exec 文件中存储变量配置信息的想法很有趣。这只是一些不寻常的事情,也是了解更多关于 linux 的机会。显然在大多数情况下这是一个坏主意,但我的目标是这样做。如果您对如何完成它有一些想法,请分享它们。
【解决方案3】:

既然你已经知道这是个坏主意,那我就懒得再说了。

您最好阅读一些有关可执行文件格式的信息。该文件可能是 ELF 格式,但您可以使用file 命令进行检查。

一般来说,文件是分节构建的,每个变量在节内都有一个偏移量。
nm 命令可以告诉您给定符号的部分和偏移量。
每个部分都从文件中的给定偏移量开始。我认为objdump 命令可以找到这些偏移量。

它不适用于 BSS 部分中的符号(未初始化的静态变量) - 这些值不存储在文件中 - 只是它们应该在加载时分配。

一旦有了这些偏移量,一切就很简单了——添加、打开、查找、写入、关闭。

【讨论】:

  • 谢谢。我已经找到了我需要的所有偏移量。问题是我无法处理 fopen() 进程的 ELF 文件,每次尝试执行此操作时它都会返回 NULL...
  • 我猜该文件无法打开,因为它已经被正在运行的进程打开以供读取。我不知道你是否可以覆盖它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多