自修改代码有实际用途吗?
我知道它们可用于构建蠕虫/病毒,但我想知道是否存在一些程序员必须使用自修改代码的好原因。
有什么想法吗?假设情况也可以。
自修改代码有实际用途吗?
我知道它们可用于构建蠕虫/病毒,但我想知道是否存在一些程序员必须使用自修改代码的好原因。
有什么想法吗?假设情况也可以。
原来维基百科关于 "self-modifying code" 的条目有一个很好的列表:
关于使用自修改代码来挫败黑客的观点:
- 半自动优化状态相关循环。
- 运行时代码生成,或在运行时或加载时专门为算法进行特化(例如,在实时图形领域中非常流行),例如一般的排序实用程序准备代码以执行特定调用中描述的关键比较。
- 修改对象内联状态,或模拟闭包的高级构造。
- 修补子例程地址调用,通常在动态库的加载时间完成,或在每次调用时修补子例程的内部引用以使用它们的实际地址。这是否被视为“自修改代码”取决于术语的使用。
- 进化计算系统,例如遗传编程。
- 隐藏代码以防止逆向工程,例如通过使用反汇编器或调试器。
- 隐藏代码以回避病毒/间谍软件扫描等检测。
- 在某些体系结构中使用重复操作码的滚动模式填充100%的内存,以擦除所有程序和数据,或者烧入硬件。
- 压缩代码以在运行时进行解压缩和执行,例如在内存或磁盘空间有限时。
- 一些非常有限的指令集别无选择,只能使用自修改代码来实现某些功能。例如,“一指令集计算机”机器仅使用减法和负数分支“指令”,无法进行间接复制(类似于C编程语言中的“*a = **b”的等效内容)而不使用自修改代码。
- 更改指令以实现容错
我看到过自修改代码用于以下方面:
通过让程序在运行时编写更多的代码,来进行速度优化
进行混淆以使得反向工程变得更加困难
在以前,由于内存有限,使用自修改代码来节省内存。现在,例如应用程序压缩工具UPX被用来在加载应用程序的压缩图像后解压缩/修改自身代码。
因为它非常酷,有时候这就足够了。
人工智能?
由于Commodore 64寄存器较少,处理器速度只有1Mhz。当您需要读取一个偏移值的内存地址时,修改源代码会更容易。
@Reader:
LDA $C000
STA $D020
INC Reader+1
JMP Reader
那是我最后一次编写自修改代码了 :-)
20世纪60年代的汇编语言使用自修改代码来实现函数调用而不需要堆栈。
《计算机程序设计艺术》第一卷第一版,第182页:
MAX100 STJ EXIT ;Subroutine linkage
ENT3 100 ;M1. Initialize
JMP 2F
1H CMPA X,3 ;M3. Compare
JGE *+3
2H ENT2 0,3 ;M4. Change m
LDA X,3 ;(New maximum found)
DEC3 1 ;M5. Decrease k
J3P 1B ;M2. All tested?
EXIT JMP * ;Return to main program
dap .+1 ;deposit address part of accumulator in (IP+1)
lac xy ;load accumulator with (ADDRESS) [xy is a dummy symbol, just like * above]
ACC := (ACC)
。这种修改相对安全,在古老的架构上是必要的。动态链接是一种自我修改的方式(修补绝对和/或相对跳转位置)...通常由操作系统的程序加载器完成。