修改正在运行的可执行文件的资源内容

时间:2011-01-02 07:30:01

标签: c# c++ windows file resources

全部,

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

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

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

注意:我必须在运行的可执行文件中进行设置。它们不能位于硬盘驱动器或注册表中。请不要建议作为一种选择。

3 个答案:

答案 0 :(得分:6)

编写自修改代码是100%可能的。这不是一件容易的事。

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

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

显然,您希望进行更改,而不是删除它。疯狂背后的想法是一样的 - 你必须取消映射文件。

答案 1 :(得分:1)

  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. A / 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。

答案 2 :(得分:0)

您是否阅读过MSDN(UpdateResource函数)?它有一个列表,不会更新您的更改。 也许你正在尝试那些。