0%
毅种循环

模块 14 - Payload 存放 - .text 段

恶意软件开发课程 - Payload 存放 - .text 段


模块 14 - Payload 存放 - .text 段#

[!IMPORTANT] 本知识库声明

本知识库由本人整理自互联网 MalDev Academy 泄露资源,并由本人手动翻译为中文,过程中增加了大量关键技术提示实践心得

  1. 内容完整性:并未修改任何核心代码与技术逻辑,仅做汉化与注释加强。
  2. 版权归属:原始知识产权归原作者/官方所有。
  3. 支持正版:本仓库仅供内部学习交流,如果您有经济能力,请务必支持正版课程
  4. 权利申诉:如相关内容侵犯了您的权益,请联系我,我将立即核实并删除。

Payload 存放 - .text 段#

简介#

在上一个模块中,我们讨论了如何将 payload 存储在 .data.rdata 段。本模块将介绍如何将 payload 存储在 .text 段中。

.text 段#

将变量保存在 .text 段不同于将其保存在 .data.rdata 段,因为这不仅仅是声明一个普通变量的问题。相反,你必须明确指示编译器将其保存在 .text 段中,如下面的代码片段所示。

[!IMPORTANT] 📚 知识扩展 - 编译器指令详解

代码中使用了两个重要的编译器指令:

  1. #pragma section(".text")
    • 这是一个预处理器指令,告诉编译器创建或使用名为 .text 的节
    • #pragma 是编译器特定的指令,不同编译器可能有不同的行为
  2. __declspec(allocate(".text"))
    • 这是 MSVC 特定的扩展,用于指定变量应该分配到哪个节
    • const unsigned char 确保数据被标记为常量

为什么需要这样做?
正常情况下,const 数组会自动放入 .rdata 段(只读数据段),但我们通过这些指令强制编译器将其放入 .text 段。

在这里,我们告诉编译器将 Text_RawData 变量放置在 .text 段而不是 .rdata 段。.text 段的特殊之处在于它存储具有可执行内存权限的变量,允许它们被直接执行,而无需修改内存区域的权限。这对于大约小于 10 字节的小型 payload 非常有用。

使用 PE-Bear 工具检查从上述代码片段编译的二进制文件,可以发现 payload 位于 .text 区域。

图片
图片


总结#

  • .text 段用于存储可执行代码,默认具有执行权限
  • 使用 #pragma section(".text")__declspec(allocate(".text")) 可以将数据强制放入 .text
  • 这种方法适用于小型 payload,可以避免调用 VirtualProtect 等可疑 API
  • 对于较大的 payload,应该使用 .rsrc 段或其他存储方法