gpt4 book ai didi

C程序可以修改其可执行文件吗?

转载 作者:太空狗 更新时间:2023-10-29 16:25:35 26 4
gpt4 key购买 nike

我手上的时间有点多,开始考虑是否可以编写一个自修改程序。为此,我用 C 编写了一个“Hello World”,然后使用十六进制编辑器在已编译的可执行文件中查找“Hello World”字符串的位置。是否可以修改此程序以打开自身并覆盖“Hello World”字符串?

char* str = "Hello World\n";

int main(int argc, char* argv) {

printf(str);

FILE * file = fopen(argv, "r+");

fseek(file, 0x1000, SEEK_SET);
fputs("Goodbyewrld\n", file);
fclose(file);

return 0;
}

这不起作用,我假设有什么东西阻止它自行打开,因为我可以将它分成两个单独的程序(一个“Hello World”和一些修改它的东西)并且它工作正常。

编辑:我的理解是,当程序运行时,它已完全加载到 ram 中。因此,就所有意图和目的而言,硬盘驱动器上的可执行文件是一个副本。为什么它修改自己会有问题?

有解决办法吗?

谢谢

最佳答案

在 Windows 上,当程序运行时,整个 *.exe 文件使用 memory-mapped-file functions in Windows映射到内存中。 .这意味着文件不一定一次全部加载,而是文件的页面在访问时按需加载。

当文件以这种方式映射时,另一个应用程序(包括它自己)在运行时无法写入同一个文件来更改它。 (此外,在 Windows 上,运行的可执行文件也不能重命名,但在 Linux 和其他具有基于 inode 的文件系统的 Unix 系统上可以)。

可以更改映射到内存中的位,但如果您这样做,操作系统会使用“写时复制”语义进行操作,这意味着底层文件不会在磁盘上更改,而是内存中的页面是根据您的修改创建的。不过,在被允许执行此操作之前,您通常必须摆弄相关内存上的保护位(例如 VirtualProtect )。

曾几何时,在非常受限的内存环境中使用自修改代码的低级汇编程序很常见。然而,没有人再这样做了,因为我们不再在相同的受限环境中运行,而且现代处理器有很长的管道,如果你开始从它们下面更改代码,它们会变得非常不安。

关于C程序可以修改其可执行文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com