orcastor/unpack
GitHub: orcastor/unpack
一款用于识别并解包常见 PE 加壳、辅助逆向与恶意软件分析的 Go 语言工具。
Stars: 55 | Forks: 7
# Unpack:一个用于解包PE文件的工具与库
[English](README.md) | [中文](README_zh.md)
## 简介
Unpack 是一个使用 Go(Golang)编写的强大且通用的库,旨在分析和解压可执行文件,特别是那些使用各种 PE(Portable Executable)加壳工具打包的文件。被加壳的可执行文件通常用于混淆代码的真实性质,使得安全研究人员和防病毒软件更难分析和理解程序的行为。
Unpack 的主要目标是检测加壳的存在,识别所使用的加壳类型,并在可能的情况下解压可执行文件到其原始形式,以便更容易地分析和理解程序的功能。
## 背景
多年来,可执行文件加壳工具一直是网络安全领域的主流。它们既用于合法目的(如保护知识产权),也用于恶意目的(如隐藏恶意软件)。能够解压这些可执行文件对于需要分析和理解潜在有害软件行为的安全专业人员来说至关重要。
## 支持的加壳工具
Unpack 目前支持检测和解压以下常见的 PE 加壳工具:
- [x] UPX(基础支持)
- [x] ASPack
- [x] FSG
- [x] Themida(基础支持)
- [x] WinUpack
- [x] Petite
- [x] PESpin
- [x] Armadillo
- [x] PECompact
- [x] NSPack
- [x] MPRESS
请注意,上述列表并非详尽无遗,Unpack 会持续更新以支持新的和新兴的加壳工具。
## 多层加壳支持
Unpack 支持检测和解压多层加壳的可执行文件。这意味着如果一个文件被多个加壳工具层层包裹(例如:ASPack -> UPX),Unpack 可以:
1. **自动检测所有层**:递归检测每一层的加壳类型
2. **逐层解压**:从外层到内层依次解压
3. **记录解压历史**:跟踪每一层的加壳信息和版本
### 使用示例
```
package main
import (
"fmt"
"github.com/orcastor/unpack"
// Import drivers package to register all supported packers
_ "github.com/orcastor/unpack/drivers"
)
func main() {
// Recursively unpack all layers (default max depth 10)
result, err := unpack.UnpackAll("packed.exe")
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
// Print unpacking history
fmt.Println("Unpacking history:")
for _, layer := range result.History {
fmt.Printf(" Layer %d: %s (version %d)\n",
layer.Layer, layer.PackerName, layer.Version)
}
// Use unpacked data
// result.ReaderAt contains the final unpacked file data
}
```
## 注册加壳工具
要使用 Unpack,你需要注册你想要支持的加壳工具有两种方式:
**选项 1:一次性导入所有加壳工具(推荐)**
```
import _ "github.com/orcastor/unpack/drivers"
```
这将自动注册所有支持的加壳工具。
**选项 2:导入特定加壳工具**
```
import (
_ "github.com/orcastor/unpack/upx"
_ "github.com/orcastor/unpack/aspack"
// ... import other packers as needed
)
```
这允许你只包含你需要的加壳工具,从而减小二进制文件体积。
## API 参考
#### `Unpack(path string, maxDepth int) (*UnpackResult, error)`
递归解压,支持多层加壳。
- `path`:要解压的文件路径
- `maxDepth`:最大解压深度,用于防止无限递归,0 表示无限制
- 返回:包含解压数据和历史信息的 `UnpackResult`
#### `UnpackAll(path string) (*UnpackResult, error)`
递归解压所有层,默认最大深度为 10 层。
#### `UnpackResult` 结构
```
type UnpackResult struct {
ReaderAt io.ReaderAt // Unpacked data
History []LayerInfo // Unpacking history, records information for each layer
}
type LayerInfo struct {
PackerName string // Packer name
Version int // Version number
Layer int // Layer number (from outer to inner, starting from 1)
}
```
## 命令行使用
Unpack 可以作为命令行工具使用,用于检测加壳类型、检查复合加壳并尝试解压可执行文件。以下是使用方法:
### 构建命令行工具
要构建命令行工具,请运行:
```
go build -o unpack.exe ./cmd/unpack
```
或在 Linux/macOS 上:
```
go build -o unpack ./cmd/unpack
```
### 安装
要将 Unpack 作为库安装,可以使用以下命令:
```
go get github.com/orcastor/unpack
```
### 命令
#### 检测加壳
检测可执行文件中使用的加壳工具:
```
unpack detect
```
**示例:**
```
unpack detect packed.exe
```
**输出:**
```
Packer detected: UPX (version 3)
File: packed.exe
```
如果未检测到加壳:
```
No packer detected in: packed.exe
```
#### 解压可执行文件
解压可执行文件。工具会自动检测并解压所有层的加壳。
**基础用法:**
```
unpack unpack
```
**带自定义输出文件:**
```
unpack unpack -o output.exe
```
**带自定义最大深度:**
```
unpack unpack -depth 5
```
**标志位:**
- `-o string`:输出文件路径(默认:`_unpacked.exe`)
- `-depth int`:最大解压深度(0 = 无限制,默认:10)
**示例:**
```
# 使用默认设置解包(输出:packed_unpacked.exe)
unpack unpack packed.exe
# 解包到指定输出文件
unpack unpack -o unpacked.exe packed.exe
# 使用无限深度解包
unpack unpack -depth 0 packed.exe
# 使用 3 层限制深度解包
unpack unpack -depth 3 packed.exe
```
**输出示例:**
```
Unpacking: packed.exe
Output: packed_unpacked.exe
Unpacking history:
Layer 1: ASPack (version 2)
Layer 2: UPX (version 3)
Successfully unpacked to: packed_unpacked.exe
```
#### 版本信息
显示版本信息:
```
unpack version
```
#### 帮助信息
显示帮助信息:
```
unpack help
```
或:
```
unpack -h
unpack --help
```
## 贡献
欢迎对 Unpack 贡献代码!如果你发现了尚未支持的新加壳工具,或对现有代码有改进建议,请提交拉取请求或在 GitHub 仓库中创建问题。
## 许可证
Unpack 在 MIT License 许可下发布。Feel free to use, modify, and distribute this software as you see fit.
标签:Armadillo, ASPack, DAST, EVTX分析, FSG, Golang, Go语言, MPRESS, NSPack, PECompact, PESpin, Petite, PE解包, Themida, UPX, VPS部署, WinUpack, 云资产清单, 反编译辅助, 可执行文件解压, 多层脱壳, 安全编程, 恶意软件分析, 日志审计, 程序破解, 端点检测与响应, 网络安全, 脱壳工具, 自动化脱壳, 软件分析, 逆向工程, 隐私保护