☰
HackBrowserData 仓库开发指南:Go 1.20 构建、Chrome ABE 载荷与代码规范全解析
2026/10/4 1:25:55 网站建设 项目流程
  • 网络安全
  • 应用安全
  • 密码学
  • CLI

【免费下载链接】HackBrowserData

Extract and decrypt browser data, supporting multiple data types, runnable on various operating systems (macOS, Windows, Linux).

项目地址:https://gitcode.com/gh_mirrors/ha/HackBrowserData
点击查看免费下载

本文以 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 对仓库的关键约束做了三条顶层说明:

  1. 安全边界:仅供安全研究与防御用途,禁止生成用于未授权访问的代码。
  2. Go 版本钉版:必须使用 Go 1.20 构建(以保留 Windows 7 支持),不得使用 Go 1.21+ 的新特性(如log/slog、slices、maps、cmp包)。
  3. 架构定位: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):

  1. Go 侧在browser/chromium.Extract()中通过masterkey.Retrievers选择密钥检索器:V10用DPAPIRetriever,V20用ABERetriever;后者读取Local State提取APPB前缀 blob,并经注册表 App Paths 解析浏览器 exe 路径。
  2. 读取内嵌载荷abe_extractor_amd64.bin(约 75 KB,通过//go:embed打入),准备远程 Bootstrap 参数块与 5 个函数指针,并经debug/pe查找Bootstrap的原始文件偏移(非 RVA)。
  3. CreateProcessW(browser.exe, CREATE_SUSPENDED)以挂起方式拉起浏览器进程,依次执行VirtualAllocEx(RW 写载荷)、WriteProcessMemory、VirtualProtectEx(改为 RX)、FlushInstructionCache、再分配 Scratch 与参数内存,最后CreateRemoteThread在载荷的 Bootstrap 偏移处启动远程线程。浏览器主线程永不恢复,因此不会创建任何 Chromium UI,也无需--user-data-dir隔离来绕过ProcessSingleton。
  4. 远程线程在浏览器进程内运行自研的反射式 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 是对仓库边界的高度浓缩,也是贡献者最容易踩坑之处:

  1. modernc.org/sqlite钉在 v1.31.1:v1.32+ 要求 Go 1.21,升级会破坏 Go 1.20 契约(go.mod 可验证当前版本)。
  2. golang.org/x/text将在重构中移除:改用 3 字节 UTF-8 BOM(当前仍以 indirect 依赖存在,见 go.mod)。
  3. 不采用pkg/+internal/目录结构:保持扁平简单,browser/、crypto/、cmd/、log/、masterkey/、output/、types/、utils/平铺在根下。
  4. 不提供根级库 API:CLI 直接调用browser.DiscoverBrowsersWithKeys()(browser/browser.go),该函数在DiscoverBrowsers之上注入各平台凭据(macOS keychain 密码、Chromium 密钥检索器),使返回的 Browser 实例可直接执行Extract;元数据类命令(如list)则用不注入凭据的DiscoverBrowsers以避免 macOS 弹密码提示。

七、如何在仓库中进行一次合规的改动:端到端工作流

综合以上各节,一个遵循仓库纪律的改动流程是:

  1. 确认环境 Go 版本为 1.20(必要时按第二节的方式切换 GOROOT),不引入 Go 1.21+ 特性,不动go.mod的go指令与modernc.org/sqlite版本。
  2. 按平台拆分代码:平台相关实现放_windows.go/_darwin.go/_linux.go,使用构建标签;仅 Windows ABE 相关改动需关注crypto/windows/abe_native/与make gen-layout。
  3. 编码时遵循第五节约定:错误必须%w包裹、日志按 DBG/INF/WRN/ERR 分级、注释 140 列、命名用Config/Extract风格。
  4. 提交前依次执行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)。
  5. 涉及 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).

项目地址:https://gitcode.com/gh_mirrors/ha/HackBrowserData
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询