LilBoooopp/woody_woodpacker

GitHub: LilBoooopp/woody_woodpacker

通过劫持 ELF64 PT_NOTE 段并注入自解压 stub,实现对 .text 节的 LZSS 压缩与 RC4 加密,使加壳二进制在运行时透明还原的打包工具。

Stars: 1 | Forks: 0

# woody_woodpacker ELF 文件 ├── ELF 头 (元数据:入口点、架构、指向表的偏移量) ├── Program 头 (段 — 告诉 OS 加载器要映射哪些内容到内存中) ├── Section 头 (告诉链接器/调试器关于 .text、.data 等的信息) └── 原始数据 (两种视图都指向的实际字节) ## 关键段类型 当内核加载 ELF 时,它会读取 program 头并将段映射到内存中。重要的类型如下: * PT_LOAD — 唯一真正被映射到内存中的类型。每个可执行文件至少有两个:一个是 R-X(代码),另一个是 RW-(数据)。 * PT_NOTE — 最初旨在保存构建元数据(编译器版本、OS ABI 信息)。内核会读取它,但在运行时并不需要它。如果你破坏了它的内容,程序仍然可以正常运行。 * PT_PHDR — 指向 program 头表本身。 ## 入口点 ELF 头包含一个 `e_entry` 字段 — 一个虚拟内存地址,告诉内核:“跳转到这里开始执行。”它通常指向 `.text` 中的 `main`(或者更准确地说,指向 `_start`)。 如果你将 `e_entry` 更改为指向其他地方... 执行就会从那里开始。 ## 注入技术 1. 找到 PT_NOTE,它对于运行来说无关紧要(元数据、版本等) 2. 将 stub 注入到这个已分配的节中 3. 将 program 头条目从 PT_NOTE 更改为具有 R-X 权限的 PT_LOAD 4. 现在更改 `e_entry`(程序起始地址)以解密 stub。 * 内核将 stub 加载到内存中,因为它认为这是 PT_LOAD * 执行从 stub 开始 * stub 解密/解压缩后,跳转到原始二进制文件的入口点。 # 修改前: ``` ┌─────────────┐ │ ELF Header │ e_entry → 0x401000 (original _start) ├─────────────┤ │ PT_LOAD │ 0x400000, R-X (code) │ PT_LOAD │ 0x600000, RW- (data) │ PT_NOTE │ (build metadata, unused at runtime) ├─────────────┤ │ .text │ original code │ .note │ useless bytes └─────────────┘ ``` # 修改后: ``` ┌─────────────┐ │ ELF Header │ e_entry → 0xc000000 (YOUR STUB) ├─────────────┤ │ PT_LOAD │ 0x400000, R-X (code, now encrypted) │ PT_LOAD │ 0x600000, RW- (data) │ PT_LOAD ◄───┤ 0xc000000, R-X (was PT_NOTE, now your stub) ├─────────────┤ │ .text │ encrypted+compressed bytes │ stub code │ decrypt → decompress → jump to 0x401000 └─────────────┘ ```
标签:DNS 反向解析, e_entry修改, ELF64, ELF劫持, ELF打包器, LZSS压缩, PT_NOTE注入, RC4加密, Stub注入, x86_64架构, 中高交互蜜罐, 二进制加壳, 云资产清单, 代码混淆, 内存映射, 客户端加密, 恶意软件开发, 文件加壳, 病毒技术, 自解压, 逆向工程