p-x9/ObjectArchiveKit
GitHub: p-x9/ObjectArchiveKit
Swift 实现的 Unix ar 归档解析库,用于从静态库文件中读取成员与符号元数据。
Stars: 9 | Forks: 1
# ObjectArchiveKit
一个用于解析 Unix `ar` 归档文件(例如像 `.a` 这样的静态库)并读取成员/符号元数据的 Swift 库。
该解析器支持多种由 GNU、BSD、Darwin 和 COFF 等工具链使用的归档布局。
[](https://github.com/p-x9/ObjectArchiveKit/issues)
[](https://github.com/p-x9/ObjectArchiveKit/network/members)
[](https://github.com/p-x9/ObjectArchiveKit/stargazers)
[](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归档, 二进制文件分析, 云安全监控, 元数据读取, 开发工具库, 数据挖掘, 文件解析器, 符号表解析, 跨平台工具链, 逆向工程基础, 静态分析, 静态库解析