【问题标题】:Is there any real application being self modifying code?是否有任何真正的应用程序正在自我修改代码?
【发布时间】:2011-11-29 19:53:41
【问题描述】:

网络上很少有示例演示如何编写自修改代码。但它们只是示例。我想知道是否有任何真正的应用程序正在自我修改代码。谢谢!

【问题讨论】:

  • 你对自我修改代码有什么不明白的?
  • 就像link 上定义的一样。据我了解,自修改代码会在运行时更改其原始代码。

标签: self-modifying


【解决方案1】:

首先想到的是病毒、木马等。

自我修改代码使防病毒应用程序更难将您的应用程序识别为恶意应用程序。

另一个使用自修改代码的区域是genetic programming

还有一个Wikipedia article 涵盖了您的问题。

【讨论】:

  • 是的,我看到有一个列表。如果你知道什么程序是自修改代码,请告诉我。我将不胜感激。 :-)
  • 那么您想了解示例应用程序吗?
【解决方案2】:

“自修改代码”也可以指 Java 中的字节码修改。这被许多框架使用,如 Guice、JPA、EJB 和 Web 容器以及几乎所有 AOP(面向方面​​编程)框架。 基本上,它们会在 JVM 加载和执行字节码之前对其进行修改。所有这些框架都试图向类添加行为,而无需手动编写横切关注点。事务控制、依赖注入、范围或上下文注入是常见的嫌疑犯。

【讨论】:

  • 感谢您的回复。但我正在寻找本机二进制,它是自我修改代码,不像 JVM。
【解决方案3】:

我可以参考其他架构吗?因为,当您使用较弱的系统(如嵌入式应用程序)时,通常会使用 SMC,因为可供程序运行的 RAM 数量有限。

另外,维基百科有一个相当不错的list

【讨论】:

  • 当然。如果你能说出它的名字,那就更好了。 :-)
  • N64 的 MIPS 架构。 z80 架构较旧的 ARM 架构。它的工作方式是将程序加载到 RAM 中,以便它可以运行。然后,当您的程序运行时,您将跳转到代码的前面部分并写入它们。大多数情况下,这是您需要从非 RAM 存储中加载一段新代码的情况,但也有特殊用例。例如,您可能有一段 RAM 每帧都流式传输到音频,但它是代码块的一部分,因此它会不断被修改以流式传输新声音。
  • 请记住,大多数优化都是针对空间而非速度的。给定一个 4 GB 的 RAM 空间,你真的不需要担心它。上面引用的大多数系统都有 4 MB 或更少的内存。我所指的特定 z80 实现(TI 计算器)只有 8000 字节的 RAM 可用于任何给定正在运行的程序,因此节省空间很重要。
【解决方案4】:

我知道一个包含自我修改代码的程序(用作保护方案),如果输入了正确的密码,它的作用是自行解密,并且解密的代码在将打开的文件保存到磁盘方面起着重要作用,这个程序名为“WinHEX”。您可以在调用虚拟保护的正上方找到 SMC 代码,如果输入正确的密码,程序会调用写入进程内存 api 来解密该部分,并最终将文件保存到磁盘。

【讨论】:

    【解决方案5】:

    动态语言运行时 (DLR) 使用自修改代码来优化给定呼叫站点的常见类型。

    假设您正在.NET 之上编写一种动态类型语言,并且您的语言中的源代码如下:

    x + y
    

    现在,在静态类型语言中,xy 的类型可以在编译时确定——比如 xyints,那么 x + y 将使用IL“添加”指令。

    但在动态类型语言中,此分辨率可能每次都不同。下一次,xy 可能是字符串,在这种情况下,此调用站点的值解析将使用 String.Concat。但是解决使用哪个 IL 的成本可能非常高。事实上,如果在调用站点的第一次点击中xy 是一对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 languagesDLR design documentationDLR project

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 2012-01-19
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 2012-06-23
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多