什么是代码洞穴,是否有任何合法用途?

Edd*_*die 25 assembly terminology definition self-modifying codecave

我在StackOverflow问题中第一次遇到这个词" C#理论:将一个JMP写入asm中的编解码器 ".根据维基词典,我看到一个代码洞穴是:

一个未使用的内存块,有人(通常是软件破解者)可以使用它来注入自定义编程代码来修改程序的行为.

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

cha*_*aos 18

人们可能希望故意创建代码洞穴作为使用自修改代码的一部分.

当然,假设一个人疯了.

  • 一定要喜欢编程技术,这些技术虽然完全有效,但却依赖于程序员疯狂...... (5认同)

Unk*_*own 14

代码洞穴通常由编译器创建以进行对齐,并且通常位于函数之间.在结构和跳转之间(在某些体系结构中)也应该存在代码洞穴,但通常不会有任何大量的代码洞穴.

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

我认为理论上,如果你丢失了源代码,你可以通过使用它们修补你的错误程序,并且你的程序不会增大.

编辑

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


Rob*_*edy 12

我已经用过了它们,虽然直到今天我都没有听到过代号洞穴这个词.维基词典定义表明,代码洞穴是破解者在他或她试图破解的可执行文件中发现的东西.你引用的问题不是那样使用它.相反,它建议分配代码洞穴VirtualAllocEx以在目标进程中创建一个全新的内存块.这样就无需在目标中搜索未使用的空间,并且可以保证您有足够的空间放置所有新代码.

最终,我认为"代码洞穴"只是存储运行时生成代码的地方.该代码不必有任何邪恶的目的.在这一点上,代码洞穴的问题变得完全无趣.有趣的部分是在运行时生成代码的原因,以及确保新代码在您需要时运行的技术.


Dus*_*etz 9

一些合法用途:在没有重启的情况下修补实时操作系统二进制文件(MS执行此操作),为防火墙和防病毒程序挂钩低级操作系统功能(文件系统,网络),在没有源代码时扩展应用程序(如刮取低级操作系统调用)到DrawText所以你可以为盲人大声朗读它们)


Dan*_*Dan 7

这里描述的方式让我想起了补丁点 - 一种合法的用法.


Dan*_*anM 5

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