在冯·诺伊曼体系结构中,程序和数据都存储在内存中,因此程序可以修改自身。这对程序员有用吗?你能给一些例子吗?
变形
我想到的一个(有争议的)用例是变形病毒。这些恶意软件通过将其自己的机器代码重写为语义上等效但外观不同的表示来隐藏自己,从而避免基于签名的检测。
跳板技术
另一个(更复杂但也更常见)用例是跳板技术,这是一种基于动态代码生成的技术,用于解决某些嵌套函数调用的问题。
JIT编译
我能想到的最常见的动态代码生成用法是JIT(即时)编译。像.NET或Java这样的现代语言不会编译成本机机器代码,而是编译成某种中间语言(称为字节码)。当程序执行时,该字节码将被解释(由针对目标架构编写的虚拟机执行)。同时,后台进程检查哪些代码部分经常被执行。这些部分有很好的机会被动态编译成本机机器语言以获得最大的性能。所有这些都发生在程序运行时!
安全影响
需要记住的一件事是,将数据解释为代码的可能性可用于利用计算机软件中的安全漏洞,这就是现代硬件和操作系统趋势的原因,即启用并在可能的情况下强制执行代码和数据的分离(也请参见NX位和DEP)。