【问题标题】:Modifying resource contents of a running executable修改正在运行的可执行文件的资源内容
【发布时间】:2011-01-02 07:30:00
【问题描述】:

全部,

我将应用程序设置存储在资源中。当我的程序第一次加载时,我使用 WinAPI 读取指定的资源。然后我解析检索到的字节数据。这对我来说完美无缺。

现在假设用户更改了我的应用程序中的设置。他/她检查一个复选框控件。我想将更新的设置保存到我的资源中。但是,在我的应用程序运行时,我对 UpdateResource 的调用似乎不起作用。即使大小相同,我也无法修改我的资源数据。

首先,是否可以修改正在运行的图像的资源数据?其次,如果这不可能,我有什么替代方法可以在我的应用程序内部存储设置?

注意:我必须在正在运行的可执行文件中包含这些设置。它们不能位于硬盘驱动器或注册表中。请不要建议将其作为一个选项。

【问题讨论】:

  • 您为什么要这样做?从我所在的位置来看,提出这个问题表明您的应用程序设计存在严重缺陷。这应该是一个全面的补救措施,而不是创可贴的解决方案。
  • 我打算为您的问题提出解决方案,但您已明确表示您不希望任何人提出解决方案。抱歉,我帮不上忙。
  • 即使您的图像未在进程中加载​​,它通常也无法正常工作。当用户受到适当限制时,您无法获得对可执行文件的写访问权。 UAC是常见的情况。让我们结束这个问题吧,你对真正的答案不感兴趣。
  • @Cody Gary:我需要这样实现。它必须在我的应用程序映像中。
  • 考虑到我的年龄,我不得不接受这一点。我会在这方面工作一段时间。

标签: c# c++ windows file resources


【解决方案1】:

编写自修改代码是 100% 可能的。只是不容易做到。

当您启动可执行文件时,Windows 会将其映射到内存中。这实质上会锁定文件并防止在运行时进行编辑。显然,您可以取消映射您的程序(通过在 ntdll 中使用未记录的函数)。当您的文件未映射时,您将能够对其进行更改。

这有点类似于你想要做的:http://www.johnfindlay.plus.com/lcc-win32/asm/SelDelNT.htm

显然,您不想删除它,而是想要进行更改。疯狂背后的想法是相同的 - 您必须取消映射文件。

【讨论】:

  • @ddebug:我同意,这是一个很好的问题,这是很好的答案 (+1)。应该有更多像你一样开放的思想。
  • @ddebug 来完成这个故事,也许你也可以解释当你没有足够的权限时如何写入文件
  • @David Heffernan,我想我不明白你想表达什么。在 mrwoik 的声明中,他没有说他没有可执行文件的写权限。他想在运行时修改他的图像。当文件正在执行时,Windows 会锁定您的文件。您可以使用 UnmapViewOfFile 删除此锁定。虽然,这会阻止您的可执行文件的进一步代码执行,但我在上面发布的链接显示了一个解决方法。这对您的 David 来说可能太高级了,但是,如果您确实阅读了我链接的资源,您可能会理解它。
  • @ddebug 规范,因为 UAC 和 Vista,你没有可执行文件的写权限
  • @ddebug 正如我所说,标准是您没有对可执行文件的写入权限。否认系统上存在多个用户的处理方式是什么。不管这个程序是什么,我都不想运行它,尤其是因为我只能想象它是某种描述的恶意软件!
【解决方案2】:
  1. 很遗憾,SelDelNT 不能在 XP+ 上运行 - 它可以取消映射文件,但是 exe 图像句柄不再是 0x4 - 实际上 stdin 句柄是 0x3 而 stdout 句柄是 0x7, 因此很可能故意使 exe 句柄无法访问(-1 或其他东西)。
  2. 一种可能性是重命名 exe(允许),然后将其复制到文件中 使用原始名称并对其进行修改,并将 MoveFileEx 与 MOVEFILE_DELAY_UNTIL_REBOOT 一起使用 (或其他一些技巧)稍后将其删除。
  3. [2] 的一个更明显的版本是先将 exe 复制到 %TEMP%,然后从那里重新启动。
  4. VSS (http://msdn.microsoft.com/en-us/library/aa384645(v=VS.85).aspx) 可能允许这样做 (通过“恢复”),但它非常缓慢并且有明显的副作用。
  5. /SWAPRUN:NET 链接器/editbin 选项似乎是相关的。
  6. 这里有一个关于在解锁的 exe 中更新资源的教程 - http://www.codeproject.com/KB/DLL/Modify_UpdateResources_.aspx?msg=3307326
  7. 这是另一个包含自删除方法列表的教程:http://www.catch22.net/tuts/selfdel 最后一种方法(使用 explorer 或 cmd.exe 等随机 exe 创建暂停的进程, 然后劫持它)听起来它也适用于 exe 修改 - 你可以开始 cmd.exe 处于挂起状态,然后将您的 exe 映像复制到该进程的内存中并释放您的原始 exe。

【讨论】:

    【解决方案3】:

    你读过 MSDN (UpdateResource Function) 吗?它有一个不更新您的更改的事物列表。 也许您正在尝试其中之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多