gpt4 book ai didi

c - 如何在 C 中编写自修改代码?

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

我想写一段不断改变自己的代码,即使改变是微不足道的。

例如可能是这样的

for i in 1 to  100, do 
begin
x := 200
for j in 200 downto 1, do
begin
do something
end
end

假设我希望我的代码在第一次迭代后将行 x := 200 更改为其他行 x := 199 然后在下一次迭代后将其更改为x := 198 等等。

可以写这样的代码吗?我需要为此使用内联汇编吗?

编辑:这就是我想用 C 来做的原因:

这个程序将在实验性操作系统上运行,我不能/不知道如何使用从其他语言编译的程序。我需要这样一段代码的真正原因是因为这段代码是在虚拟机上的 guest 操作系统上运行的。管理程序是一个二进制翻译器,负责翻译代码块。翻译器做了一些优化。它只翻译一次代码块。下次在 guest 中使用相同的 block 时,翻译器将使用先前翻译的结果。现在,如果代码在运行中被修改,那么翻译器会注意到这一点,并将其之前的翻译标记为陈旧。因此强制重新翻译相同的代码。这就是我想要达到的,迫使翻译者做很多翻译。通常这些 block 是分支指令(例如跳转指令)之间的指令。我只是认为自修改代码是实现这一目标的绝佳方式。

最佳答案

您可能想考虑用 C 编写一个虚拟机,您可以在其中构建自己的自修改代码。

如果您想编写自修改的可执行文件,很大程度上取决于您的目标操作系统。您可以通过修改内存中的程序镜像来接近您想要的解决方案。为此,您将获得程序代码字节的内存地址。然后,您可能会在此内存范围内操纵操作系统保护,从而允许您修改字节而不会遇到访问冲突或“SIG_SEGV”。最后,您将使用指针(可能是 '''unsigned char *''' 指针,在 RISC 机器上可能是 '''unsigned long *''')来修改已编译程序的操作码。

关键是您将修改目标体系结构的机器代码。 C 代码在运行时没有规范格式 -- C 是编译器的文本输入文件的规范。

关于c - 如何在 C 中编写自修改代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7447013/

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