GitHub 指纹检测定位同源发布者 (Code Fingerprinting for Provenance)
通过「代码片段指纹」在 GitHub 上反查某个软件/数据包的上游发布者或同源仓库。适用于:逆向一个 App 后,想知道有没有人传过它的源码或同源数据,尤其是敏感内容在国内管控下难以直接访问时的溯源。
核心思路
不要搜一个模糊的大词,而要采样高区分度、只有这套东西才会出现的指纹,再用 GitHub Code Search API 批量检索,看哪些仓库命中。命中同一个指纹越多,越是同源。
指纹的优先级(从强到弱)
- 作者/团队专属命名:作者拼音、笔名、团队名。例:CSS/JS 文件名里的
huangbide(黄彼得拼音)、署名「伯特利」。 - App 唯一 ID:uni-app 的
__UNI__CB5EFE4、manifest 里的appid、spaceId 等。几乎全局唯一,命中即同源。 - 写死的密钥/常量:加密 key(
43hw8fhu11b35123)、内嵌 URL、token。这类最强,但通常搜不到(没人会传密钥)。 - 独有文件名/命名模式:
daindex.htm、buindex.htm这类自定义文件名;hf_<书卷>_<章>.html的编号模式。 - 目录名映射:逆向时拿到的目录结构(
Lee8/Nee/cxxl/smdj8/...),若某仓库脚本里出现逐字一致的目录名映射表,即为强证据。 - 中文专有书名:
圣经真理365、倪柝声文集、初信喂养系列等。注意这类词会命中大量泛相关仓库,需结合第 5 类判同源。 - 原始域名:从 App 二进制/JS 里提取的下载域名(
download.bibletruth01.cn)。命中即同源或同一作者,但通常已死。
操作步骤
- 提取指纹:本地
grep采样独有文件名、中文书名、CSS/JS 命名、域名、ID。 - 确认工具与速率:GitHub Code Search API 必须带 token(匿名会 401)。用
gh auth status确认已登录;gh api rate_limit --jq '.resources.code_search'看配额(未认证是 10 次/分钟)。 - 批量搜索:
gh api "search/code?q=<urlencoded>",每轮间隔 6–8 秒控制速率。用--jq只输出total_count和命中仓库/路径,别拉全量。 - 深挖命中仓库:用 git tree API(
/git/trees/main?recursive=1,不受 code search 限速)看完整文件树、README、PRODUCT.md、转换脚本,确认是不是真同源,而不是泛相关。
判定同源的标准(避免误判)
- 逐字一致的目录名/文件名映射表(最强):别的仓库脚本里出现和你逆向结果完全相同的一串命名,基本锁定同源。
- 但命名相似 ≠ 同源:2021 年的
spiritual-books-app用了RCV注解体系,和本地DD/yp/caidankais不是一套,虽同名「属灵书报」也只是泛相关。 - 下游再发布者常把原始大文件 gitignore 掉,只留转换脚本和 manifest,所以「仓库里没有原始 HTML」不代表他不是同源。
实战案例(2026-08)
逆向「属灵书报」App(uni.UNICB5EFE4)后溯源:
- 确定同源:
zhao-zg/books——其process_html_books.py里SERIES_MAP的目录名(Lee8/Nee/cxxl/smdj8/zsrm365/books)与本地 doc 目录逐字一致,是拿到同一批资源的再发布者。 - 原始上游已死:本地 JS 里的
download.bibletruth01.cn/mp4.manatruth.tk均解析到198.18.0.2(代理 fake-IP,已被污染/阻断),web.archive.org 也无快照。 - 泛相关(非同源):
gitter-badger/spiritual-books-app(2021 老项目)、clover2024/spiritual-app(橄榄山,内容在 COS)、rosemeaddistrict/dailyreading等。
要点
- 搜指纹不搜语义:独有命名 > 通用书名。
- 强证据是「逐字一致的目录映射表 / 写死的 ID / 专属命名」,不是「命中同一个中文词」。
- 管控环境下原始域名大概率已死(fake-IP 污染、无快照),溯源靠的是下游仓库残留的脚本和命名。
本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/General