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

所有,

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

现在让我们说一个用户在我的应用程序中改变一个设置。 他/她检查一个checkbox控件。 我想将更新的设置保存到我的资源。 但是,我的应用程序运行时,似乎我的UpdateResource调用不起作用。 即使尺寸相同,我也无法修改资源数据。

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

注:我必须有我的运行可执行文件中的设置。 他们不能在硬盘上或在registry中。 请不要build议作为一个选项。

Solutions Collecting From Web of "修改正在运行的可执行文件的资源内容"

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

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

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

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

  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最后一个方法(创建一个随机EXE文件,如explorer或cmd.exe,然后劫持它)暂停过程听起来就像它也将工作exe修改 – 您可以启动cmd.exe处于暂停状态,然后将您的exe图像复制到该进程的内存中,并释放您的原始exe文件。

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