zuhayrb/dexpose

GitHub: zuhayrb/dexpose

一款纯 Go 编写的零依赖 CLI 工具,用于扫描 APK 文件中泄露的密钥与敏感字符串,支持 CI 友好的退出码与 gitleaks 兼容规则。

Stars: 8 | Forks: 0

# Dexpose ![Go 版本](https://img.shields.io/badge/go-1.26%2B-blue) ![发布](https://img.shields.io/github/v/release/zuhayrb/dexpose) ![构建](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg) ![许可证](https://img.shields.io/github/license/zuhayrb/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, 文档结构分析, 日志审计, 目录枚举, 移动安全