sebafvs/carcass

GitHub: sebafvs/carcass

一款静态解析 PE 文件元数据的轻量级红队分析工具,聚焦头、导入、导出与段信息。

Stars: 1 | Forks: 0

``` ▄████▄ ▄▄▄ ██▀███ ▄████▄ ▄▄▄ ██████ ██████ ▒██▀ ▀█ ▒████▄ ▓██ ▒ ██▒▒██▀ ▀█ ▒████▄ ▒██ ▒ ▒██ ▒ ▒▓█ ▄ ▒██ ▀█▄ ▓██ ░▄█ ▒▒▓█ ▄ ▒██ ▀█▄ ░ ▓██▄ ░ ▓██▄ ▒▓▓▄ ▄██▒░██▄▄▄▄██ ▒██▀▀█▄ ▒▓▓▄ ▄██▒░██▄▄▄▄██ ▒ ██▒ ▒ ██▒ ▒ ▓███▀ ░ ▓█ ▓██▒░██▓ ▒██▒▒ ▓███▀ ░ ▓█ ▓██▒▒██████▒▒▒██████▒▒ ░ ░▒ ▒ ░ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ░▒ ▒ ░ ▒▒ ▓▒█░▒ ▒▓▒ ▒ ░▒ ▒▓▒ ▒ ░ ░ ▒ ▒ ▒▒ ░ ░▒ ░ ▒░ ░ ▒ ▒ ▒▒ ░░ ░▒ ░ ░░ ░▒ ░ ░ ░ ░ ▒ ░░ ░ ░ ░ ▒ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ v1.0.0 ``` Windows CLI 工具,用于对 PE(Portable Executable)文件进行静态分析。Carcass 在不执行二进制文件的情况下解析并暴露 PE 内部信息 — `headers`、`imports`、`exports` 和 `sections`。专为红队成员、恶意软件分析人员和逆向工程师打造,是一个无需依赖、可直接放置在任意 Windows 主机上的快速工具。 ## 目录 - [概述](#overview) - [使用场景](#use-cases) - [构建](#building) - [模块](#modules) - [headers](#headers) - [imports](#imports) - [exports](#exports) - [sections](#sections) - [参数与标志](#arguments--flags) - [使用示例](#usage-examples) - [输出示例](#output-examples) ## 概述 Carcass 从磁盘读取 PE 文件并在内存中完全静态地解析它 — 不执行、不注入、除 Windows SDK 外无运行时依赖。它被设计为独立的模块,每个模块针对 PE 格式的特定部分进行处理: | 模块 | 解析内容 | | -------- | ----------------------------------------------------------------- | | `headers` | DOS 头、NT 头、文件头、可选头 | | `imports` | 导入地址表(IAT)— DLL 与函数名 | | `exports` | 导出地址表(EAT)— 命名导出、仅序号导出与转发导出 | | `sections` | 段表 — 虚拟/原始大小、权限、香农熵 | 所有输出默认写入 `stdout`。`imports` 与 `exports` 模块支持通过 `-o` 输出 JSON。 ## 使用场景 **红队 / 攻击前侦察** - 识别目标二进制文件导入的 API,了解其功能能力 - 发现进程注入原语(`VirtualAlloc`、`WriteProcessMemory`、`CreateRemoteThread`)、凭证访问 API(`LsaOpenPolicy`、`SamConnect`)或网络行为指示 - 检查 DLL 是否暴露了可被劫持或代理的函数 **恶意软件分析 / 初步分类** - 在沙箱中执行前快速了解未知二进制文件 - 通过段熵识别打包或混淆 - 查找转发导出(常用于恶意加载器重定向) - 将导入导出转储为 JSON 并输入管道或跨样本 grep **逆向工程** - 在打开反汇编器前确认入口点、镜像基址与架构 - 枚举目标 DLL 的导出以便调用或挂钩 - 验证段布局是否与反汇编器显示一致 ## 构建 Carcass 面向 Windows 平台,需要 Windows SDK 提供 PE 结构体定义(`windows.h`),无其他外部依赖。 **MSVC(推荐)** ``` cl main.c parser.c imports.c exports.c sections.c /Fe:carcass.exe /link /out:carcass.exe ``` **MinGW / GCC(Windows)** ``` gcc main.c parser.c imports.c exports.c sections.c -o carcass.exe -lm ``` ## 模块 ### headers 解析 PE 头链并打印各层的关键字段。 **读取内容:** - **DOS 头** — `e_magic`(必须为 `MZ` / `0x5A4D`)与 `e_lfanew`(指向 NT 头的偏移) - **NT 头** — `PE\0\0` 签名,用于确认这是有效的 PE 文件 - **文件头** — 目标架构(`x86` / `x64`)、段数量、编译时间戳、特性标志 - **可选头** — 入口点 RVA、镜像基址、段/文件对齐、镜像大小、子系统类型(GUI 或控制台) **为何对侦察重要:** 编译时间戳可指示构建时间(尽管可被伪造)。镜像基址表明其期望加载位置。入口点 RVA 是执行起点。子系统标志表明是否会产生可见窗口。 ### imports 遍历导入地址表,列出二进制文件所依赖的每个 DLL 及其导入的函数名或序号。 **读取内容:** - 每个 `IMAGE_IMPORT_DESCRIPTOR` 条目(每个 DLL 一个) - 对每个 DLL:原始首个跳转表(OFT),若为空则回退至首个跳转表(FAT)(常见于加壳或绑定二进制) - 每个 `IMAGE_IMPORT_BY_NAME` 条目(命名导入)或原始序数值(仅序号导入) **标志:** - `--clean` — 从输出中过滤 `api-ms-win-*` 与 `ext-ms-*` API 集转发器 DLL(这些是 Windows 内部抽象层,在寻找有意义的攻击面指示时会产生噪声) - `-all` — 显式显示全部模式,覆盖 `--clean` - `-o ` — 以 JSON 格式写入文件而非标准输出 **为何对侦察重要:** 导入表是 PE 中最具信号的部分之一,可快速识别行为特征。导入 `VirtualAllocEx`、`WriteProcessMemory`、`CreateRemoteThread` 的二进制文件很可能执行进程注入;`CryptEncrypt` 或 `BCryptEncrypt` 结合 `FindFirstFile` 提示类似勒索软件行为;`WNetAddConnection` 或 `InternetOpenUrl` 揭示网络能力。 ### exports 遍历导出地址表,覆盖 PE 格式支持的三种导出情况: - **命名导出** — 按名称与序号导出的函数 - **仅序号导出** — 仅通过序号导出、无名称(显示为 `[unnamed / ordinal-only]`) - **转发导出** — RVA 指向导出目录自身,将调用重定向至另一 DLL 中的函数(显示为 `Forwarded to: DLL.FunctionName`) **读取内容:** - `IMAGE_EXPORT_DIRECTORY` 中的 DLL 名称、函数总数与命名导出计数 - 三个并行数组:函数 RVA、名称 RVA、名称-序号映射 - 构建从序号索引到名称的反向映射,遍历所有函数槽位以捕获原始代码遗漏的仅序号项 **标志:** - `-o ` — 以 JSON 格式写入输出 **为何对侦察重要:** 针对 DLL 进行劫持或代理时,需要完整的导出列表(包括仅序号项),否则加载器会失败。转发导出可告诉你实际实现在其他位置。 ### sections 枚举段表并计算每段磁盘原始字节的香农熵。 **读取内容:** - 每个 `IMAGE_SECTION_HEADER` 条目 - 虚拟大小、虚拟地址、原始大小、原始偏移、特性标志 - 从文件缓冲区读取原始段字节并计算香农熵(范围 0.0–8.0) - 从特性字段解码 `R`、`W`、`X` 内存权限标志 **熵范围:** | 范围 | 解释 | | ----------- | -------------------------------- | | 0.0 – 1.0 | 几乎为空或高度重复(如零填充的 BSS) | | 4.0 – 6.5 | 常规编译代码或数据 | | 7.0 – 7.2 | 压缩资源、密集数据表 | | 7.2 – 8.0 | 加密或打包的强指示 | **为何对侦察重要:** 段中的高熵(尤其是 `.text` 段)或命名异常段是二进制文件被加壳或代码加密的强指示。具备 `W` 与 `X` 权限(`RWX` 或 `-WX`)的段是典型的 shellcode staging 区或自修改代码标志。 ## 参数与标志 ``` carcass [flags] ``` | 参数 | 描述 | | ---------- | ------------------------------------------------------------ | | `module` | 可选值:`headers`、`imports`、`exports`、`sections` | | `target` | PE 文件路径(`.exe`、`.dll`、`.sys` 等) | | 标志 | 模块 | | ---------- | ------------------------------------------------------------ | | `--clean` | imports | 过滤 `api-ms-win-*` 与 `ext-ms-*` 转发器 DLL | | `-all` | imports | 显示全部 DLL(含转发器条目) | | `-o ` | imports、exports | 以 JSON 格式写入文件而非标准输出 | ## 使用示例 ``` # 解析二进制文件的 PE headers carcass headers malware.exe # 列出所有 imports carcass imports malware.exe # 列出 imports,过滤掉 Windows API set 噪声 carcass imports malware.exe --clean # 将所有 imports 转储为 JSON 以进行进一步处理 carcass imports malware.exe -o imports.json # 将清理后的 imports 转储为 JSON carcass imports malware.exe --clean -o imports.json # 列出 DLL 的所有 exports carcass exports target.dll # 将 exports 转储为 JSON carcass exports target.dll -o exports.json # 枚举具有熵和权限的 sections carcass sections malware.exe ``` ## 输出示例 **`headers`**
标签:C/C++, DAST, PE分析, T1007, T1055, T1602, Windows, Windows工具, 事务性I/O, 云安全监控, 云资产清单, 依赖-free, 便携式可执行文件, 动态分析, 可执行文件分析, 客户端加密, 导入表, 导出表, 恶意软件分析, 数据展示, 文件头解析, 文档结构分析, 流量嗅探, 红队, 节表, 逆向工程, 静态分析