【发布时间】:2018-05-27 03:44:23
【问题描述】:
我想知道是否可以在运行时修改一段 C 程序(或其他二进制文件)?
我写了这个小 C 程序:
#include <stdio.h>
#include <stdint.h>
static uint32_t gcui32_val_A = 0xAABBCCDD;
int main(int argc, char *argv[]) {
uint32_t ui32_val_B = 0;
uint32_t ui32_cpt = 0;
printf("\n\n Program SHOW\n\n");
while(1) {
if(gcui32_val_A != ui32_val_B) {
printf("Value[%d] of A : %x\n",ui32_cpt,gcui32_val_A);
ui32_val_B = gcui32_val_A;
ui32_cpt++;
}
}
return 0;
}
使用十六进制编辑器,我可以找到“0xAABBCCDD”并在程序停止时对其进行修改。当我重新启动程序时,修改工作。酷!
我想在程序运行时这样做可以吗?
这是一个简单的例子,可以理解现象并尝试一下,但我真正的项目更大。
- 我有一个名为 Dangerous Dave 的旧 DOS 游戏。
- 我可以通过简单地编辑二进制文件来修改图块(感谢http://www.shikadi.net/moddingwiki/Dangerous_Dave)
- 我开发了一个小编辑器,它做得很好并且玩得很开心。
- 我用DOSBOX启动DOS游戏,好用!
我想在游戏运行时动态执行此操作。有可能吗?
PS : 我在 Debian 64bit 下工作
问候
【问题讨论】:
-
加载时,代码在大多数系统中驻留在只读段中,但您可以通过附加调试器来更改数据,如果您有符号则可以动态更改数据
-
是的,原则上是可以的。调试器可以附加到进程,如果您暂停它,甚至允许您修改进程内存(包括可执行页面)。然而,这并非易事。
-
@IporSircer.:似乎上下文错误。但在这里你也基本上改变了模式......从内核到用户。总体而言,答案与 Op 希望在不更改模式(内核与用户模式)的情况下运行用户级程序的想法相矛盾。我将删除答案,因为这显然不是作者的意图。
-
您可以在您链接的教程中看到调试。这是我想强调的想法。但同样,如果您使用调试器,您基本上是在更改正在调试的代码。而且实际上没有人考虑更改在内核模式下运行的代码(这是不可能的)。 C 语言和任何编译器都不支持它。但是是的,我想我错过了调试器。
-
你的DOS游戏是开源的吗?您是否考虑过使用一些开源游戏或游戏引擎?你的总体目标是玩那个游戏,还是做一个更好的游戏?你的编程技能是什么?