代码之家  ›  专栏  ›  技术社区  ›  Eddie

什么是密码洞穴,有没有合法的用途?

  •  25
  • Eddie  · 技术社区  · 16 年前

    我在stackoverflow问题中第一次遇到这个词” C# Theoretical: Write a JMP to a codecave in asm “我看是根据 Wiktionary ,代码洞穴是:

    一种未使用的内存块,通常是一个软件破解程序,可以用来注入 用于修改程序行为的自定义编程代码。

    我找到正确的定义了吗?如果是这样,代码洞穴是否有合法的用途?

    9 回复  |  直到 16 年前
        1
  •  10
  •   Rob Kennedy    16 年前

    我用过,虽然我从来没听说过这个词 代码洞 直到今天。Wiktionary定义表明代码洞穴是黑客在他或她试图破解的可执行文件中发现的东西。你提到的问题没有用那种方式。相反,它表明代码洞穴正在被分配 VirtualAllocEx 在目标进程中创建一个全新的内存块。这样就不需要在目标中搜索未使用的空间,而且可以保证您有足够的空间来放置所有新代码。

    最终,我想 “代码洞穴”只是存储运行时生成的代码的地方。 . 这段代码不必有任何邪恶的目的。到了那个时候,代码洞穴是什么的问题变得完全没有意思了。有趣的部分是在运行时生成代码的原因,以及确保新代码在需要时运行的技术。

        2
  •  16
  •   chaos    16 年前

    作为使用的一部分,人们可能希望故意创建一个代码洞穴。 self-modifying code .

    当然,假设那个人疯了。

        3
  •  13
  •   Unknown    16 年前

    代码洞穴通常由编译器为 alignment 并且经常大量地位于函数之间。在结构和跳跃之间也应该有代码洞穴(在某些架构中),但通常不会有任何数量的代码洞穴。

    您也可以搜索一块归零的内存,但不能保证程序不会使用它们。

    我认为理论上,如果你丢失了源代码,你可以通过使用它们来修补你的bug程序,这样你的程序就不会增长。

    编辑

    对于你们中的那些人来说,代码洞穴只是用于运行时生成的代码:这是一个不完整的定义。很多时候我在“代码洞穴”中编写了一个数据结构并更新了指向那里的指针,我怀疑我不是唯一这样做的人。

        4
  •  8
  •   Dustin Getz sunsations    16 年前

    一些合法用途 :在不重新启动的情况下修补实时操作系统二进制文件(MS会这样做),为防火墙和防病毒连接低级操作系统功能(文件系统、网络),在没有源代码的情况下扩展应用程序(如将低级操作系统调用刮到drawtext,以便您可以为盲人大声读取它们)

        5
  •  6
  •   Dan    16 年前

    它的描述方式 here 让我想起 patchpoints --合法使用。

        6
  •  4
  •   DanM    16 年前

    不熟悉这个术语,但是热补丁机制可以使用保留空间来存储代码补丁。您钩住有缺陷的函数并将其重定向到新的改进函数。它可以在不关闭关键设备(大型电信交换机)的情况下即时完成。

        7
  •  3
  •   jfclavette    16 年前

    它可以用于在运行时注入代码。它可以用于以静态语言编写自修改代码,前提是操作系统允许您(不设置NX位等)。它有很多用途,但在典型的商业应用程序中你不应该考虑它。

        8
  •  3
  •   James Eichele Bernard Igiri    16 年前

    我觉得这是正确的定义。

    至于合法使用,让我这样说:不要这样做,除非你只是为了试验而进行试验,并且愿意接受结果。

    这类事情不可能 曾经 进入生产代码:

    1. 这是一个巨大的潜在安全问题。如果可以将代码注入内存然后执行代码,那么恶意攻击者理论上可以做任何他们喜欢的事情。
    2. 这是一个代码维护和调试的噩梦。如果最终运行的代码可以在运行时更改,那么几乎不可能跟踪错误和错误。
        9
  •  2
  •   Stephen C. Steel    16 年前

    自修改代码不应被轻视,但有时会带来很大的性能提升。如果你已经编程很长时间了,你可能在没有意识到的情况下使用了它。

    在广泛使用486及更高版本之前,许多PC不包括硬件浮动支持。这让人们在编写涉及浮点的程序时左右为难。如果他们把程序编译成使用在线浮点指令,它将在具有浮点处理器的机器上快速运行,而在没有浮点处理器的机器上则不会。如果他们使用软件浮点模拟编译程序,它将在所有机器上运行,但速度很慢,即使在使用硬件浮点的机器上也是如此。

    许多编译器库对自修改代码使用了一个有趣的技巧。默认行为是在需要浮点操作的地方放置陷阱指令。陷阱处理程序要么模拟软件中的指令,要么检测到它正在具有浮点硬件的计算机上运行,它将通过用适当的硬件浮点指令替换陷阱指令来修改代码并执行它。其结果是在所有机器上运行的软件,在具有浮点硬件的机器上运行的速度几乎与编译代码以直接使用浮点硬件一样快(因为大多数浮点密集型操作都发生在多次执行的循环中)。

    推荐文章