BinFlip/gobin
GitHub: BinFlip/gobin
一个 Rust 静态分析库,用于从 Go 编译二进制文件(含去符号文件)中提取函数名、模块依赖、类型描述符等运行时元数据。
Stars: 0 | Forks: 0
# gobin
用于 Go 编译二进制文件的静态分析库。
此 crate 提取了 Go 运行时嵌入在每个二进制文件中的元数据:
函数名、源文件路径、Go 版本、模块依赖、构建设置以及类型描述符。
所有这些信息在去除符号 (`-ldflags="-s -w"`) 后依然保留,因为运行时在执行时需要它们。
## 快速开始
```
use gobin::GoBinary;
let data = std::fs::read("some_go_binary").unwrap();
if let Some(bin) = GoBinary::parse(&data) {
println!("Go version: {}", bin.go_version().unwrap_or("unknown"));
println!("Functions: {}", bin.function_count().unwrap_or(0));
for f in bin.functions() {
println!(" {}", f.name);
}
}
```
## 解析内容
- 针对 ELF、Mach-O、PE 和 WebAssembly 二进制文件的**格式检测**
- **Build ID** 提取(ELF note + 原始文本段标记)
- **Build info** blob:Go 版本、模块路径、依赖项、构建设置(GOOS、GOARCH、VCS 信息)
- **pclntab**(PC/line 表):函数名、源文件路径、行号、入口偏移量
- **类型描述符**:通过 `.typelink` 节或遍历 moduledata 获取 `abi.Type` 结构体,并解析参数/字段类型名
- **接口表** (itabs):链接器证明的每一个 `(interface, concrete type)` 对
- **`//go:embed` 资产**:嵌入的文件路径和字节(适用于已去除符号的二进制文件及所有格式)
- 从 `moduledata.inittasks` 获取的**包初始化顺序**
- **FIPS-140 模式**(`GOFIPS140`)和 `__go_fipsinfo` 完整性校验和
- **模块供应链细节**:`replace` 指令和 `go.sum` 哈希
- 从 pclntab 头字段(`minLC`、`ptrSize`)推断**架构**
- **置信度评分**:高(结构证明)、中(版本字符串)、低(启发式)
支持 Go 1.16 到 1.27,包括 Go 1.27 ("V5") moduledata 布局,该布局移除了
`typelinks`/`itablinks` 切片并以内联方式存储接口表。
## 示例工具
包含的 `dump` 示例可生成 Go 二进制文件的完整元数据转储:
```
cargo run --example dump -- path/to/go_binary
```
## 免责声明
Go 二进制文件格式由 Go 编译器和运行时源代码
(`src/runtime/`、`src/internal/abi/`、`src/cmd/link/`)定义。
此 crate 中的结构布局和字段语义源自跨版本的 Go 源码树,
包括用于 V5 moduledata 布局的 Go 1.27 开发树。
pclntab 格式在各版本中保持稳定,具有用于版本检测的明确定义的 magic
number,但未来的 Go 版本可能会引入更改。
## 许可证
Apache-2.0
标签:AI工具, Go语言, Rust, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 元数据提取, 可视化界面, 程序破解, 网络流量审计, 进程保护, 逆向工程, 通知系统, 静态分析