zuhayrb/dexpose
GitHub: zuhayrb/dexpose
一款纯 Go 编写的零依赖 CLI 工具,用于扫描 APK 文件中泄露的密钥与敏感字符串,支持 CI 友好的退出码与 gitleaks 兼容规则。
Stars: 8 | Forks: 0
# Dexpose




一个纯 Go 语言编写的 CLI 工具,用于扫描 APK 文件中泄露的 secrets 和敏感字符串。无需 JVM,无需 jadx,无需运行时依赖——仅需一个单一的静态二进制文件。
```
██████╗ ███████╗██╗ ██╗██████╗ ██████╗ ███████╗███████╗
██╔══██╗██╔════╝╚██╗██╔╝██╔══██╗██╔═══██╗██╔════╝██╔════╝
██║ ██║█████╗ ╚███╔╝ ██████╔╝██║ ██║███████╗█████╗
██║ ██║██╔══╝ ██╔██╗ ██╔═══╝ ██║ ██║╚════██║██╔══╝
██████╔╝███████╗██╔╝ ██╗██║ ╚██████╔╝███████║███████╗
╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝ ╚══════╝╚══════╝
dexpose v0.4.0 — 57 rules loaded
dexpose: scanning target.apk
dexpose: classes.dex: 14203 strings extracted
dexpose: found AKIAIOSFODNN7EXAMPLE in classes.dex [aws-access-key]
dexpose: found AIzaSyBlL7MI-FuPJ3EueRrfB2ClDXFwkwoQrSg in AndroidManifest.xml [google-api-key]
dexpose: target.apk: 2 finding(s)
dexpose: scanned 1 APK(s), 2 finding(s)
```
## 安装
```
go install github.com/zuhayrb/dexpose@latest
```
或者从 [发布页面](https://github.com/zuhayrb/dexpose/releases) 下载预构建的二进制文件:
```
# Linux (amd64)
curl -sL https://github.com/zuhayrb/dexpose/releases/latest/download/dexpose_0.3.0_linux_amd64.tar.gz \
| tar xz
# macOS (arm64)
curl -sL https://github.com/zuhayrb/dexpose/releases/latest/download/dexpose_0.3.0_darwin_arm64.tar.gz \
| tar xz
```
## 用法
```
# 扫描单个 APK
dexpose target.apk
# 扫描 APK 目录,输出为 JSON
dexpose -f json -o results.json ./apks/
# 显示匹配上下文和实时扫描详情
dexpose --context --verbose target.apk
# 自定义 patterns + ignore file
dexpose -p my-rules.toml -i .dexposeIgnore target.apk
# 打印版本
dexpose --version
# 启用详细输出
dexpose -v target.apk
```
### 标志
| 标志 | 简写 | 描述 |
|------|-----------|-------------|
| `--format` | `-f` | 输出格式:`plain`(默认)或 `json` |
| `--output` | `-o` | 将结果写入文件而不是 stdout |
| `--patterns` | `-p` | 自定义 `rules.toml` 的路径 |
| `--ignore` | `-i` | 忽略文件的路径 |
| `--context` | `-c` | 包含每次匹配项周围的字符 |
| `--verbose` | `-v` | 打印扫描进度和每个文件的元数据 |
| `--quiet` | `-q` | 抑制非致命的 stderr 输出 |
| `--version` | | 打印版本信息并退出 |
### 输出格式
**纯文本**(默认)——制表符分隔的行:
```
target.apk classes.dex aws-access-key AKIAIOSFODNN7EXAMPLE
target.apk AndroidManifest.xml google-api-key AIzaSyBlL7MI-FuPJ3EueRrfB2ClDXFwkwoQrSg
target.apk assets/config.json jwt-token eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
```
**JSON**——结构化数组,可通过管道传递给 jq:
```
dexpose -f json target.apk | jq '.[].pattern'
```
```
[
{ "apk": "target.apk", "source": "classes.dex", "pattern": "aws-access-key", "match": "AKIAIOSFODNN7EXAMPLE" },
{ "apk": "target.apk", "source": "AndroidManifest.xml", "pattern": "google-api-key", "match": "AIzaSyBlL7MI-FuPJ3EueRrfB2ClDXFwkwoQrSg" }
]
```
### CI 用法
当存在发现结果时退出代码为 1,干净时为 0:
```
dexpose -f json -o results.json ./release.apk && echo "clean" || echo "secrets found"
```
### 忽略误报
创建一个 `.dexposeIgnore` 文件:
```
[[ignore]]
pattern = "generic-api-key"
[[ignore]]
value = "AKIAIOSFODNN7EXAMPLE"
[[ignore]]
source = "assets/vendor.bundle.js"
```
被抑制的发现结果将从输出和退出代码中排除。
## 扫描内容
在每个 APK 中,dexpose 会检查:
- **DEX 文件** —— `classes.dex`、`classes2.dex` 等(从 DEX 字符串表中提取的单个字符串)
- **AndroidManifest.xml** —— 从二进制 XML 格式解码;资源 ID 引用(例如 `@0x7F010000`)在可用时通过 `resources.arsc` 解析为其字符串值
- **res/values/strings.xml** —— 纯 XML 扫描(存在于 debug APK 中)
- **resources.arsc** —— 扫描编译后的二进制资源表以查找字符串类型的条目(存在于所有 APK 中;在去除了 `strings.xml` 的 release APK 中作为字符串值的主要来源)
- **assets/** —— 所有文件均作为纯文本扫描
## 模式
内置了 57 条涵盖 AWS、Stripe、Slack、Twilio、SendGrid、Mailgun、Google、GitHub、Heroku、DigitalOcean、Azure、Datadog、Terraform Cloud、Shopify、Firebase、JWT token 等的规则。使用与 [gitleaks](https://github.com/gitleaks/gitleaks) 兼容的 `rules.toml` 格式——你可以通过 `--patterns` 加入你自己的 gitleaks 配置。
## 退出代码
| 代码 | 含义 |
|------|---------|
| 0 | 无发现结果 |
| 1 | 存在一个或多个发现结果 |
| 2 | 扫描错误 |
## 开发
```
make build # sync patterns + compile
make test # run tests with race detector
make lint # go vet + staticcheck
make tidy # go mod tidy + verify
make snapshot # local GoReleaser dry run
make sync # copy patterns for go:embed
```
## 安全
根据每个发布版本附带的 SHA-256 校验和来验证下载的二进制文件:
```
sha256sum dexpose
cat checksums.txt
```
## 支持 ☕
如果你觉得 dexpose 有用,请考虑支持开发:
- **BTC**: `bc1qarlskqtdq4wsdudecktv6g7zqv5jv52at9k5uk`
- **ETH/ERC-20**: `0x03d42691a1f0d9af62899813e1f3937da0f6039b`
- **SOL/SLP**: `J9jneBCAW8NaoSj5KekxLyxBcYbzNq3F2Wshdar7FHdf`
## 许可证
MIT 许可证——详情请参阅 [LICENSE](LICENSE)。
标签:EVTX分析, Go, LNA, Ruby工具, StruQ, 文档结构分析, 日志审计, 目录枚举, 移动安全