使用ROP和硬件断点隐藏内存痕迹。
作者:Sec-Labs | 发布时间:
项目地址
https://github.com/Kudaes/RustChain
描述
该工具是使用ROP链和硬件断点来隐藏内存痕迹的简单概念验证。ROP链将在睡眠期间(即调用Sleep函数时)更改主模块内存页面的保护级别为N/A。有关此内存扫描逃避技术的更详细信息,请查看原始项目Gargoyle。仅适用于x64架构。
其思想是在kernel32!Sleep中设置硬件断点并添加一个新的顶级过滤器来处理异常。当调用Sleep时,之前设置的异常过滤器函数将被触发,允许我们调用ROP链,而无需使用传统的函数钩子。这样,我们避免在与众所周知的dll相关的进程中留下奇怪和不寻常的私有内存区域。
ROP链简单地调用VirtualProtect()将当前内存页面设置为N/A,然后调用SleepEx,最后恢复RX内存保护。
该过程的概述如下:
- 我们使用SetUnhandledExceptionFilter来设置一个新的异常过滤器函数。
- 使用SetThreadContext来在kernel32!Sleep上设置硬件断点。
- 我们调用Sleep,触发硬件断点并将执行流程引导到我们的异常过滤器函数。
- ROP链从异常过滤器函数中调用,允许将当前内存页面保护级别更改为N/A。然后调用SleepEx。最后,ROP链恢复RX内存保护,正常执行继续进行。
这个过程无限循环重复。
如图所示,主模块的内存保护在睡眠时更改为N/A,从而避免了寻找具有执行权限页面的内存扫描。

编译
由于我们使用LITCRYPT插件来混淆字符串字面值,因此在编译代码之前需要设置环境变量LITCRYPT_ENCRYPT_KEY:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="你的超级秘密密钥"
之后,只需编译代码并运行工具:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
限制
该工具只是一个概念验证,为了完全实用,还应该实现一些额外的功能。该项目的主要目的是学习如何实现ROP链并将其集成到Rust中。因此,只有在按照原样使用时,该工具才能正常工作,如果尝试以其他方式使用(例如将其编译为dll并尝试反射加载和执行),则可能会出现故障。
致谢
- @thefLinkk 对他的DeepSleep项目的启发,促使我创建了这个工具。
标签:工具分享, 思路分享, 学习笔记, 主机安全