- 网络安全
- 应用安全
- 密码学
- CLI
【免费下载链接】HackBrowserData
Extract and decrypt browser data, supporting multiple data types, runnable on various operating systems (macOS, Windows, Linux).
本文以 HackBrowserData 仓库根目录的 CLAUDE.md 为骨架,系统梳理这个跨平台浏览器数据提取与解密 CLI 工具(基于 Chromium 系浏览器与 Firefox,macOS 额外支持 Safari)的开发环境、构建命令、Windows 端 Chrome App-Bound Encryption(ABE)载荷集成方案,以及贯穿全仓的代码约定与依赖约束。读完本文,你将掌握如何在本仓库中用 Go 1.20 完成单平台与交叉编译、运行测试与 lint、构建带 ABE 载荷的 Windows 二进制,并理解make payload/make build-windows/-tags abe_embed的底层机制,以及为何仓库在依赖选择上有诸多"刻意为之"的钉版。
安全声明:本项目仅用于安全研究与防御性用途,禁止生成可用于未授权访问的代码。所有安全研究必须在法律边界内以合乎道德的方式进行(见 CLAUDE.md)。
一、项目概览:CLI 工具与"纯 Go + 按平台裁剪"的总体设计
HackBrowserData 是一个命令行安全研究工具,用于在 Windows、macOS、Linux 上提取并解密浏览器数据。从 README.md 可知,它支持导出密码、历史记录、Cookie、书签、信用卡、下载记录、localStorage、sessionStorage 与扩展数据,且支持 Chromium 系浏览器、Firefox(三平台)与 Safari(macOS);同时支持"跨主机解密":在原始主机导出主密钥,在任意分析师主机上离线解密数据副本。
从源码结构看,browser/browser.go 定义了核心抽象Browser接口(BrowserName/UserDataDir/Profiles/Extract/CountEntries),并按引擎拆分为browser/chromium、browser/firefox、browser/safari三个子包;CLI 入口位于 cmd/hack-browser-data/main.go,基于 cobra 实现,未指定子命令时默认执行dump。
CLAUDE.md 对仓库的关键约束做了三条顶层说明:
- 安全边界:仅供安全研究与防御用途,禁止生成用于未授权访问的代码。
- Go 版本钉版:必须使用 Go 1.20 构建(以保留 Windows 7 支持),不得使用 Go 1.21+ 的新特性(如
log/slog、slices、maps、cmp包)。 - 架构定位:CLI 直接调用
browser.DiscoverBrowsersWithKeys(),不提供根级库 API(详见下文"关键约束")。
二、Go 1.20 钉版:为什么必须守住这条底线
CLAUDE.md 在 Project Overview 中强调:必须用 Go 1.20 构建,以支持 Windows 7;Go 1.21+ 的特性(log/slog、slices、maps、cmp)一律不得使用。这一约束在仓库中有多处可验证的佐证:
- go.mod 首行即声明
go 1.20。 - .golangci.yml 明确注释:
copyloopvar、intrange、modernize、perfsprint等 lint 检查依赖 Go 1.22+,需在 Go 版本约束解除后再启用。 - 依赖钉版(见 CLAUDE.md 的 Key Constraints):
modernc.org/sqlite被钉在v1.31.1,因为 v1.32+ 要求 Go 1.21;golang.org/x/text计划在后续重构中移除(改用 3 字节 UTF-8 BOM),目前仍以 indirect 依赖形式存在于 go.mod。
因此,任何涉及模块操作(go mod tidy、go mod verify)或新增依赖的改动,都必须确保不把go指令顶到 1.21+。CLAUDE.md 给出的做法是在 macOS 上显式切换到 go@1.20 环境:
export GOROOT=$(brew --prefix go@1.20)/libexec && export PATH=$GOROOT/bin:$PATH go mod tidy go mod verify三、开发命令全解析:构建、交叉编译、测试、lint、格式化与拼写
CLAUDE.md 将日常开发命令集中列为 Development Commands,以下逐条展开,并结合 Makefile 与源码说明其行为。
3.1 构建与交叉编译
# 构建当前平台二进制(模块操作请使用 go@1.20) go build ./cmd/hack-browser-data/ # 交叉编译 GOOS=windows GOARCH=amd64 go build ./cmd/hack-browser-data/ GOOS=linux GOARCH=amd64 go build ./cmd/hack-browser-data/与 README 的 Building from source 一致,普通构建无需特殊工具链。cmd/hack-browser-data包内按平台拆分入口:main_windows.go 与 main_others.go(通过构建标签选择),负责configureDoubleClickMode()等平台差异化逻辑。
仓库同时提供 Makefile 封装:
build: $(GO) build -o $(GOEXE) ./cmd/hack-browser-data build-windows: GOOS=windows GOARCH=amd64 CGO_ENABLED=0 + -tags abe_embed ... clean: payload-clean && 删除 $(GOEXE) $(GOEXE).exe其中make build-windows是唯一会内嵌 ABE 载荷的 Windows 构建路径(详见第五节)。
3.2 测试
go test ./... go test -v ./... -covermode=count -coverprofile=coverage.out仓库的测试覆盖三个引擎(chromium / firefox / safari)的每个数据类别提取器,例如 browser/chromium/extract_cookie_test.go、browser/firefox/extract_password_test.go、browser/safari/profile_test.go,以及解密管线专项测试 browser/chromium/decrypt_v20_test.go(ABE v20)。测试规范见 .golangci.yml:测试文件豁免dupl、funlen、gosec、errcheck、lll、goconst等过严检查。
CLAUDE.md 的 Code Conventions 对测试写法有两条硬性约定:
- 文件系统相关测试一律使用
t.TempDir()(避免手工建目录/清理); - 数据库相关测试使用
go-sqlmock(避免依赖真实 SQLite 文件)。
3.3 Lint、格式化与拼写
# Lint(要求 golangci-lint v2) golangci-lint run # 格式化:gofumpt 比 gofmt 更严格 gofumpt -l -w . goimports -w -local github.com/moond4rk/hackbrowserdata . # 拼写检查 typos.golangci.yml 声明version: "2"并指定run.go: "1.20"。启用 linter 覆盖五个层次:
- 默认必备:
errcheck、govet、staticcheck、ineffassign、unused; - Bug 检测:
errorlint、gosec、sqlclosecheck、nilerr、bodyclose、durationcheck、errchkjson、exhaustive、forcetypeassert; - 代码质量:
revive、gocritic、goconst、misspell、testifylint、whitespace等; - 复杂度:
gocognit(min-complexity 30)、nestif(min-complexity 5); - 格式器(formatters):
gofumpt(开启 extra-rules)+goimports(local-prefixes 指向github.com/moond4rk/hackbrowserdata)。
其中gosec的排除项(.golangci.yml)本身就是解密原理的侧写:G401(SHA1)用于 Chromium PBKDF2 密钥派生、G405/G502(DES/3DES)用于 Firefox 解密、G501(md5)保持禁用,而 G204 是 macOS 调用security命令所需。
格式规范同时约束注释宽度:注释按 140 列换行,与.golangci.yml中lll.line-length: 140(.golangci.yml)保持一致。
拼写检查由 .typos.toml 配置,其中extend-exclude排除了go.mod、go.sum,并允许Readed、Sie、Encrypter等工具误报词。
四、Chrome ABE Payload(仅 Windows):背景、架构与构建
这是 CLAUDE.md 篇幅最重、也最能体现仓库技术深度的部分。以下结合 RFC-010 与其源码展开。
4.1 背景:Chrome 127+ 的 App-Bound Encryption
Chrome 127+ 在 Windows 上引入了 App-Bound Encryption(ABE):用于解密 v10 时代 Cookie/密码的Local State密钥不再是用户绑定的 DPAPI blob,而是应用绑定的 blob——只有合法的chrome.exe/msedge.exe/brave.exe进程才能通过elevation_service的 COM RPC(IElevator::DecryptData)解开(见 RFC-010)。
关键约束是:elevation_service会校验调用方——调用进程的主可执行文件必须是位于Program Files且由浏览器厂商签名的合法浏览器二进制。因此发起 COM 调用的代码必须运行在chrome.exe/msedge.exe/brave.exe进程内部,普通的 Go 进程即使提权也会被拒绝(RFC-010)。
4.2 架构:反射式注入 + 自研 C 载荷
RFC-010 给出了端到端流程(RFC-010):
- Go 侧在
browser/chromium.Extract()中通过masterkey.Retrievers选择密钥检索器:V10用DPAPIRetriever,V20用ABERetriever;后者读取Local State提取APPB前缀 blob,并经注册表 App Paths 解析浏览器 exe 路径。 - 读取内嵌载荷
abe_extractor_amd64.bin(约 75 KB,通过//go:embed打入),准备远程 Bootstrap 参数块与 5 个函数指针,并经debug/pe查找Bootstrap的原始文件偏移(非 RVA)。 CreateProcessW(browser.exe, CREATE_SUSPENDED)以挂起方式拉起浏览器进程,依次执行VirtualAllocEx(RW 写载荷)、WriteProcessMemory、VirtualProtectEx(改为 RX)、FlushInstructionCache、再分配 Scratch 与参数内存,最后CreateRemoteThread在载荷的 Bootstrap 偏移处启动远程线程。浏览器主线程永不恢复,因此不会创建任何 Chromium UI,也无需--user-data-dir隔离来绕过ProcessSingleton。- 远程线程在浏览器进程内运行自研的反射式 DLL 加载器(C 编写的
Bootstrap),调用载荷DllMain,最终拿到 32 字节主密钥交还 Go 侧;其余 v20 AES-GCM 解密、SQLite 遍历、JSON 输出全部由 Go 完成。
CLAUDE.md 特别强调:crypto/windows/abe_native/下的 C 源码全部为第一方代码(无 vendored C),RFC-010 第 9.2 节解释了为何否决了 Stephen Fewer 的反射加载器(RFC 中对比为:自研 C 约 280 行 vs Fewer 2012 版 vendored C 约 500 行,见 RFC-010)。
4.3 构建命令与-tags abe_embed机制
make payload # 构建 DLL(需要 zig:brew install zig) make build-windows # 交叉编译 hack-browser-data.exe 并内嵌载荷 make gen-layout # 依据 bootstrap_layout.h 重新生成 Go 布局常量 make payload-clean # 清理 crypto/*.bin其实现细节可分别追溯到 crypto/windows/abe_native/Makefile.frag(构建产物、flag 与gen-layout两步式 cgo -godefs 流程)与 Makefile(build-windows导出GOOS=windows GOARCH=amd64 CGO_ENABLED=0,并以-tags abe_embed -trimpath -ldflags="-s -w"构建)。
构建标签双文件机制(CLAUDE.md 明确提到的//go:embed切换点)位于crypto/windows/payload/:
- embed_windows.go:构建标签为
windows && abe_embed,通过//go:embed abe_extractor_amd64.bin内嵌真实载荷,Get(arch)目前仅支持amd64; - stub_windows.go:构建标签为
windows && !abe_embed,Get直接返回错误abe: payload not embedded in this build (rebuild with -tags abe_embed; arch=...)。
这意味着:默认go build链接的是桩实现,当真正需要 ABE 时会在运行时快速失败并给出明确提示——不涉及 Windows ABE 的贡献者完全不需要安装 zig(见 CLAUDE.md)。只有make build-windows(或手动加-tags abe_embed)才会产出具备 Chromium 127+ ABE Cookie 完整解密能力的hack-browser-data.exe,与 README.md 的 Windows ABE 构建说明一致。
make gen-layout的目的在于保持 C 头文件 bootstrap_layout.h 与 Go 布局常量(crypto/windows/abe_native/bootstrap/下的layout.go、layout_gen.go)的单一事实来源同步:它用CC="zig cc" go tool cgo -godefs生成临时文件、gofmt 后发布,先写临时文件再格式化,避免 cgo 失败时通过空 stdin 静默产出空文件(见 Makefile.frag);make gen-layout-verify则用git diff --exit-code校验布局未过期。
4.4 兼容性契约
RFC-010 第 1.1 节给出契约表(RFC-010),可概括为:
| 组件 | 契约 |
|---|---|
| Go 工具链 | 1.20(钉版;Go 1.21+ 放弃 Windows 7) |
| Windows 宿主 | Win10 1909+(PE 加载器 + UCRT) |
| Chrome 系浏览器 | v127+(ABE 引入版本) |
| zig 工具链 | 0.13+(make payload使用,实际调用zig cc) |
| 目标架构 | 仅 x86_64(x86 / ARM64 为未来工作) |
五、代码规范(Code Conventions)
CLAUDE.md 用一节列出全仓统一的编码约定,逐条落地如下:
- 平台代码用构建标签隔离:
_darwin.go、_windows.go、_linux.go后缀。可验证于 browser/browser_darwin.go、crypto/crypto_windows.go(//go:build windows,DPAPI 解密委托给utils/winapi以复用同一处 Crypt32.dll syscall 声明)等文件。 - C 载荷为第一方代码:
crypto/windows/abe_native/全部自研,不引入 vendored C。 - 错误处理:一律
fmt.Errorf("context: %w", err)包裹,绝不使用_ =吞掉错误;.golangci.yml的errorlint与errcheck(含check-type-assertions: true)就是这套约定的强制执行器。 - 日志分级:
log.Debugf用于记录级诊断,log.Infof用于面向用户的状态输出,log.Warnf用于意外但可预期的情况;提取方法应返回错误,而不是在方法内打日志。日志实现见 log/logger.go(Debug 级附带文件:行号,其余级别输出[DBG]/[INF]/[WRN]/[ERR]/[FTL]标签),级别定义见 log/level.go。CLI 侧--verbose通过log.SetVerbose()打开 Debug 输出(cmd/hack-browser-data/main.go)。 - 命名:遵循 Go 惯例,如
Config而非BrowserConfig、Extract而非BrowsingData。 - 注释宽度:140 列换行(与
lll.line-length一致)。 - 测试:文件系统测试用
t.TempDir(),数据库测试用go-sqlmock。 - 架构文档:设计决策集中存放于
rfcs/(仓库现有 13 份 RFC,覆盖项目架构、Chromium/Firefox/Safari 数据存储与加解密、密钥检索机制、CLI 与输出设计、Windows 锁定文件绕过、ABE 集成、跨主机 CLI 重设计等主题)。
一个值得注意的实践:macOS 的 keychain 密码处理遵循"惰性解析 + 优雅降级"——browser/browser_darwin.go 中resolveKeychainPassword优先用--keychain-pw旗标,否则仅在 stdin 为 TTY 时提示输入,并先经keychainbreaker.TryUnlock验证;任何失败都回退为"仅导出元数据"并打Warnf,绝不携带已知错误的凭据继续解密。
六、关键约束(Key Constraints)汇总
CLAUDE.md 结尾的 Key Constraints 是对仓库边界的高度浓缩,也是贡献者最容易踩坑之处:
modernc.org/sqlite钉在 v1.31.1:v1.32+ 要求 Go 1.21,升级会破坏 Go 1.20 契约(go.mod 可验证当前版本)。golang.org/x/text将在重构中移除:改用 3 字节 UTF-8 BOM(当前仍以 indirect 依赖存在,见 go.mod)。- 不采用
pkg/+internal/目录结构:保持扁平简单,browser/、crypto/、cmd/、log/、masterkey/、output/、types/、utils/平铺在根下。 - 不提供根级库 API:CLI 直接调用
browser.DiscoverBrowsersWithKeys()(browser/browser.go),该函数在DiscoverBrowsers之上注入各平台凭据(macOS keychain 密码、Chromium 密钥检索器),使返回的 Browser 实例可直接执行Extract;元数据类命令(如list)则用不注入凭据的DiscoverBrowsers以避免 macOS 弹密码提示。
七、如何在仓库中进行一次合规的改动:端到端工作流
综合以上各节,一个遵循仓库纪律的改动流程是:
- 确认环境 Go 版本为 1.20(必要时按第二节的方式切换 GOROOT),不引入 Go 1.21+ 特性,不动
go.mod的go指令与modernc.org/sqlite版本。 - 按平台拆分代码:平台相关实现放
_windows.go/_darwin.go/_linux.go,使用构建标签;仅 Windows ABE 相关改动需关注crypto/windows/abe_native/与make gen-layout。 - 编码时遵循第五节约定:错误必须
%w包裹、日志按 DBG/INF/WRN/ERR 分级、注释 140 列、命名用Config/Extract风格。 - 提交前依次执行
gofumpt -l -w .、goimports -w -local github.com/moond4rk/hackbrowserdata .、golangci-lint run、typos、go test ./...;涉及模块变更时补go mod tidy && go mod verify(全程 go@1.20)。 - 涉及 Windows 交付时,用
make payload && make build-windows产出带 ABE 能力的hack-browser-data.exe,并可用make payload-verify校验载荷导出符号Bootstrap存在(Makefile.frag)。
八、延伸阅读
CLAUDE.md 将架构细节全部指向rfcs/目录,本文的深化内容与之互为印证,推荐按序阅读:
- RFC-001 项目架构
- RFC-003 Chromium 加密(v10/v11/v20 密文版本) —— 配合 crypto/version.go 的
DetectVersion前缀判定(v10/v11/v12/v20/无前缀 DPAPI)阅读效果更佳 - RFC-006 密钥检索机制(Retriever / ChainRetriever)
- RFC-009 Windows 锁定文件绕过
- RFC-010 Chrome ABE 集成(本文第四节的主要依据)
- RFC-013 CLI 重设计与跨主机解密 —— 对应
dumpkeys/archive/restore三个跨主机子命令,其用法与参数表见 README.md
本文所有命令均需在仓库根目录执行;仓库为只读,请勿以修改仓库内容作为验证方式。涉及构建 ABE 载荷时请自行安装 zig 0.13+,并以
make payload为入口。
- 网络安全
- 应用安全
- 密码学
- CLI
【免费下载链接】HackBrowserData
Extract and decrypt browser data, supporting multiple data types, runnable on various operating systems (macOS, Windows, Linux).
相关推荐
Spinnaker 单仓库(Monorepo)开发指南:架构、构建、测试与代码规范全解析
Spinnaker 单仓库(Monorepo)开发指南:架构、构建、测试与代码规范全解析 Spinnaker 是一个开源的多云持续交付平台,用于以高速度和高置信
后端DevOps云原生微服务Zotero 源码仓库开发指南:构建、测试、架构分层与代码规范全解析
Zotero 源码仓库开发指南:构建、测试、架构分层与代码规范全解析 导读 本文以 Zotero 桌面端源码仓库根目录的 CLAUDE.md https://l
桌面应用科研AudioKit 仓库开发指南:基于 CLAUDE.md 的构建、架构、测试与代码规范全解析
AudioKit 仓库开发指南:基于 CLAUDE.md 的构建、架构、测试与代码规范全解析 导读 :本文以 AudioKit 仓库根目录的 CLAUDE.md
音频处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考