【发布时间】:2011-11-29 19:53:41
【问题描述】:
网络上很少有示例演示如何编写自修改代码。但它们只是示例。我想知道是否有任何真正的应用程序正在自我修改代码。谢谢!
【问题讨论】:
-
你对自我修改代码有什么不明白的?
-
就像link 上定义的一样。据我了解,自修改代码会在运行时更改其原始代码。
标签: self-modifying
网络上很少有示例演示如何编写自修改代码。但它们只是示例。我想知道是否有任何真正的应用程序正在自我修改代码。谢谢!
【问题讨论】:
标签: self-modifying
首先想到的是病毒、木马等。
自我修改代码使防病毒应用程序更难将您的应用程序识别为恶意应用程序。
另一个使用自修改代码的区域是genetic programming
还有一个Wikipedia article 涵盖了您的问题。
【讨论】:
“自修改代码”也可以指 Java 中的字节码修改。这被许多框架使用,如 Guice、JPA、EJB 和 Web 容器以及几乎所有 AOP(面向方面编程)框架。 基本上,它们会在 JVM 加载和执行字节码之前对其进行修改。所有这些框架都试图向类添加行为,而无需手动编写横切关注点。事务控制、依赖注入、范围或上下文注入是常见的嫌疑犯。
【讨论】:
我可以参考其他架构吗?因为,当您使用较弱的系统(如嵌入式应用程序)时,通常会使用 SMC,因为可供程序运行的 RAM 数量有限。
另外,维基百科有一个相当不错的list。
【讨论】:
我知道一个包含自我修改代码的程序(用作保护方案),如果输入了正确的密码,它的作用是自行解密,并且解密的代码在将打开的文件保存到磁盘方面起着重要作用,这个程序名为“WinHEX”。您可以在调用虚拟保护的正上方找到 SMC 代码,如果输入正确的密码,程序会调用写入进程内存 api 来解密该部分,并最终将文件保存到磁盘。
【讨论】:
动态语言运行时 (DLR) 使用自修改代码来优化给定呼叫站点的常见类型。
假设您正在.NET 之上编写一种动态类型语言,并且您的语言中的源代码如下:
x + y
现在,在静态类型语言中,x 和 y 的类型可以在编译时确定——比如 x 和 y 是 ints,那么 x + y 将使用IL“添加”指令。
但在动态类型语言中,此分辨率可能每次都不同。下一次,x 和 y 可能是字符串,在这种情况下,此调用站点的值解析将使用 String.Concat。但是解决使用哪个 IL 的成本可能非常高。事实上,如果在调用站点的第一次点击中x 和y 是一对ints,那么在这个调用站点上的连续点击很可能也有一对ints。
所以 DLR 迭代如下:调用站点的编译代码如下所示:
return site.Update(site, x, y);
第一次传入一组给定类型时——比如一对ints,Update 方法转向语言实现来决定哪个方法/指令应该与一对int一起使用s 和 +。然后将这些规则重新编译到调用站点中;生成的编译代码如下所示:
if (x is int x1 && y is int y1) { return x1 + y1; }
return site.Update(site, x, y);
ints 对的连续调用使编译后的代码保持不变。
如果遇到新的类型对,代码会自行重写为:
if (x is int x1 && y is int y1) { return x1 + y1; }
if (x is string x2 && y is string y2) { return String.Concat(x2, y2); }
return site.Update(site, x, y);
有关其工作原理的更多信息,请参阅Jim Hugunin's talk at PDC 2008 on dynamic languages 和DLR design documentationDLR project。
【讨论】: