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架构, 中高交互蜜罐, 二进制加壳, 云资产清单, 代码混淆, 内存映射, 客户端加密, 恶意软件开发, 文件加壳, 病毒技术, 自解压, 逆向工程