p-x9/ObjectArchiveKit

GitHub: p-x9/ObjectArchiveKit

Swift 实现的 Unix ar 归档解析库,用于从静态库文件中读取成员与符号元数据。

Stars: 9 | Forks: 1

# ObjectArchiveKit 一个用于解析 Unix `ar` 归档文件(例如像 `.a` 这样的静态库)并读取成员/符号元数据的 Swift 库。 该解析器支持多种由 GNU、BSD、Darwin 和 COFF 等工具链使用的归档布局。 [![Github issues](https://img.shields.io/github/issues/p-x9/ObjectArchiveKit)](https://github.com/p-x9/ObjectArchiveKit/issues) [![Github forks](https://img.shields.io/github/forks/p-x9/ObjectArchiveKit)](https://github.com/p-x9/ObjectArchiveKit/network/members) [![Github stars](https://img.shields.io/github/stars/p-x9/ObjectArchiveKit)](https://github.com/p-x9/ObjectArchiveKit/stargazers) [![Github top language](https://img.shields.io/github/languages/top/p-x9/ObjectArchiveKit)](https://github.com/p-x9/ObjectArchiveKit/) ## 功能 - 解析归档 magic headers(`!\n`、`!\n`、`!\n`) - 枚举归档成员并解析成员名称(包括长名称格式) - 检测归档类型(`gnu`、`gnu64`、`bsd`、`darwin64`、`coff`) - 读取 GNU 符号表(`/`)和字符串表(`//`) - 读取 BSD/Darwin64 符号表(`__.SYMDEF*`)并将符号映射到成员 - 读取 COFF 字符串表条目 ## 安装说明 ### Swift Package Manager 将 `ObjectArchiveKit` 添加到您的 `Package.swift` 依赖项中。 ``` dependencies: [ .package(url: "https://github.com/p-x9/ObjectArchiveKit.git", branch: "main") ] ``` 然后将该 product 添加到您的 target 中。 ``` targets: [ .target( name: "YourTarget", dependencies: [ .product(name: "ObjectArchiveKit", package: "ObjectArchiveKit") ] ) ] ``` ## 使用方法 ### 从文件加载 ``` import Foundation import ObjectArchiveKit let url = URL(fileURLWithPath: "/path/to/libSomething.a") let archive = try ArchiveFile(url: url) print("Magic:", archive.magic) print("Kind:", archive.kind) print("Members:", archive.members.count) ``` ### 枚举成员 ``` for (index, member) in archive.members.enumerated() { print("[\(index)]", member.name(in: archive)) print(" offset:", member.offset) print(" size:", member.header.size) } ``` ### 读取符号表 ``` switch archive.kind { case .gnu, .gnu64: if let table = archive.gnuSymbolTable { print("GNU symbol count:", table.count) if let names = try table.names(in: archive) { for entry in names { print(entry.offset, entry.string) } } } case .bsd: if let table = archive.bsdSymbolTable { print("BSD symbol count:", table.count) for symbol in try table.entries(in: archive) { let name = try table.name(for: symbol, in: archive) ?? "unknown" print(name, symbol.stringOffset, symbol.headerOffset) } } case .darwin64: if let table = archive.darwin64SymbolTable { print("Darwin64 symbol count:", table.count) for symbol in try table.entries(in: archive) { let name = try table.name(for: symbol, in: archive) ?? "unknown" print(name, symbol.stringOffset, symbol.headerOffset) } } case .coff: if let strings = archive.coffStrings { for entry in strings { print(entry.offset, entry.string) } } } ``` ### 解析较大文件中的归档区域 如果归档起始于非零 offset,请使用指定的初始化器: ``` let archive = try ArchiveFile( url: url, headerStartOffset: 0x1000, size: 0x20000 ) ``` ## 示例代码 基本打印风格的示例可在以下位置找到: - [ObjectArchiveKitTests](./Tests/ObjectArchiveKitTests/ObjectArchiveKitTests.swift) ## 许可证 此仓库目前不包含 `LICENSE` 文件。
标签:BSD, COFF, Darwin, DNS 解析, GNU, SPM, Swift库, Unix ar归档, 二进制文件分析, 云安全监控, 元数据读取, 开发工具库, 数据挖掘, 文件解析器, 符号表解析, 跨平台工具链, 逆向工程基础, 静态分析, 静态库解析