【问题标题】:Self Modification of .exe c file after execution执行后自行修改.exe c文件
【发布时间】:2016-04-20 02:29:30
【问题描述】:

我有一个带有初始化为“hello world”的字符数组的 c 代码。

我想知道是否有可能在每次执行代码时将此字符数组重新初始化为其他随机字符串。如果不是 C,请问是否可以在任何其他编程语言中实现这样的实现?

具体来说,假设我的代码如下所示:

char c[] = "hello world";
.
.

执行此代码一次后,我希望 char 数组 c 自动初始化为其他一些随机字符串(而不是“hello world”),这应该是永久更改。这种需要是出于安全原因。我可以知道这样的事情是否可能吗?

如果没有,请问是否可以让代码执行一次后自毁?

【问题讨论】:

  • 这取决于操作系统。一些操作系统标记不允许写入正在运行的可执行文件。

标签: c security initialization self-modifying self-destruction


【解决方案1】:

如果你能描述你想要实现的目标,而不是你想实现它的特定机制,那么回答这个问题会容易得多。

现代操作系统通常会阻止修改正在运行的可执行文件,并且有充分的理由(安全性、完整性等)。出于类似的原因,修改磁盘上的可执行文件也是不可取的。我相信还有其他方法可以实现您的愿望,而无需借助自我修改代码。

我有一个 c 代码,其字符数组初始化为“hello world”。我想知道是否有可能在每次执行代码时将此字符数组重新初始化为其他随机字符串。

是的,这是可能的,但您需要授予用户对可执行文件的写入权限,在二进制文件中找到正确的偏移量,修补文件并以原子方式完整保存,等等。有很多方法这可能会出错。不要这样做。

不是在可执行文件本身中静态分配的字符串,而是有一个单独的资源文件,其中包含字符串和所需的任何其他状态。您可以更改此资源文件(INI 文件、数据文件等)以在需要时修改字符串(甚至删除它)。为了提供安全性,您可以对文件进行数字签名,这样您就可以验证内容是否合法。如果签名失败,软件可以拒绝工作。您还可以对内容进行加密,使其无法被好奇的用户读出。 (除非他们使用调试器很方便!)

如果不是 C,我可以知道这种实现是否可以在任何其他编程语言中实现?

这主要是一个操作系统限制,包括普通用户能够写入系统文件夹中已安装的应用程序(通常是您想要允许的)。如果你不能用 C 来做,你可能也不能用另一种语言来做!

执行此代码一次后,我希望 char 数组 c 自动初始化为其他一些随机字符串(而不是“hello world”),这应该是永久更改。 ...我可以知道这样的事情是否可能吗?

确实可以,但如上所述使用单独的文件。不要修改可执行文件本身。

出于安全考虑。

首先不允许自修改代码的原因是出于安全原因。如果您尝试实施某种复制保护,您最好研究现有的方法和工具以及最佳实践,甚至可能使用现成的解决方案。这东西很难,而且有些人为了好玩而破解软件,除了最复杂的保护方案之外,他们可以轻松绕过所有问题。

如果没有,请问是否可以让代码执行一次后自毁?

您也许可以让可执行文件自行删除,但这通常也需要提升权限。

只需让程序检查资源文件上的签名,如果无效则拒绝运行。

【讨论】:

    【解决方案2】:

    你可以自行修改EXE文件,但你需要知道:

    1. 这样做基本上是在重新发明轮子
    2. 自修改代码通常(事实上,很可能)被防病毒软件标记。执行完后销毁EXE就更阴暗了。
    3. 如何执行 EXE(和 ELF)文件
    4. 什么是汇编语言

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-28
      • 2016-01-26
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多