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, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 元数据提取, 可视化界面, 程序破解, 网络流量审计, 进程保护, 逆向工程, 通知系统, 静态分析