网上很少有例子说明如何编写自修改代码。但它们只是一个例子。我想知道是否有任何真正的应用程序是自修改代码。谢谢!
答案 0 :(得分:2)
首先想到的是病毒,特洛伊木马等。
自我修改代码使反病毒应用程序更难将您的应用程序识别为恶意应用程序。
另一个区域是自修改代码,使用的是genetic programming
还有Wikipedia article覆盖了你的问题。
答案 1 :(得分:2)
我可以参考其他架构吗?因为,当您使用较弱的系统(如嵌入式应用程序)时,经常使用SMC,因为只有有限的RAM可供程序运行。
此外,维基百科有一个很好的list。
答案 2 :(得分:1)
'自修改代码'也可以指Java中的字节码修改。许多框架(如Guice,JPA,EJB和Webcontainers)以及几乎所有AOP(面向方面编程)框架都使用它。 基本上,它们在JVM加载和执行之前修改字节码。所有这些框架都试图在类中添加行为,而无需手动编写横切关注点。交易控制,依赖注入,范围或上下文注入是常见的嫌疑。
答案 3 :(得分:1)
我知道一个程序,其中包含一个自我修改的代码(作为一种保护方案),它的作用是在输入正确的密码后对自身进行解密,并且解密后的代码在将打开的文件保存到磁盘中起着重要作用,您可以在虚拟保护的调用上方找到SMC代码,如果输入了正确的密码,则该程序将调用写入过程内存api对该部分进行解密,并最终将文件保存到磁盘。
答案 4 :(得分:0)
动态语言运行库(DLR)使用自修改代码来优化给定呼叫站点的常见类型。
假设您正在.NET之上编写一种动态类型的语言,并且您的语言源代码如下:
x + y
现在,以静态类型的语言,x
和y
的类型可以在编译时确定-假设x
和y
为{{1} } s,那么int
将使用IL“ add”指令。
但是在动态类型语言中,此分辨率可能每次都不相同。下次,x + y
和x
可以是字符串,在这种情况下,此调用站点的值解析将使用String.Concat。但是解决使用哪个IL的成本很高。实际上,如果呼叫站点y
和x
的第一匹配中有一对y
,则该呼叫站点上的连续匹配也很有可能是一对的int
中。
因此DLR迭代如下:呼叫站点的编译代码如下:
int
第一次传入一组给定的类型(例如一对return site.Update(site, x, y);
)时,Update方法将求助于语言实现,以解决应与一对{一起使用的方法/指令{1}}和一个int
。然后将这些规则重新编译到呼叫站点中;生成的编译代码如下所示:
int
成对+
的成功调用使编译后的代码保持不变。
如果遇到新的类型对,则代码将自动重写为如下形式:
if (x is int x1 && y is int y1) { return x1 + y1; }
return site.Update(site, x, y);
有关其工作原理的更多信息,请参见Jim Hugunin's talk at PDC 2008 on dynamic languages上的DLR design documentation和DLR project。