通过「代码片段指纹」在 GitHub 上反查某个软件/数据包的上游发布者或同源仓库。适用于:逆向一个 App 后,想知道有没有人传过它的源码或同源数据,尤其是敏感内容在国内管控下难以直接访问时的溯源。

核心思路

不要搜一个模糊的大词,而要采样高区分度、只有这套东西才会出现的指纹,再用 GitHub Code Search API 批量检索,看哪些仓库命中。命中同一个指纹越多,越是同源。

指纹的优先级(从强到弱)

  1. 作者/团队专属命名:作者拼音、笔名、团队名。例:CSS/JS 文件名里的 huangbide(黄彼得拼音)、署名「伯特利」。
  2. App 唯一 ID:uni-app 的 __UNI__CB5EFE4、manifest 里的 appid、spaceId 等。几乎全局唯一,命中即同源。
  3. 写死的密钥/常量:加密 key(43hw8fhu11b35123)、内嵌 URL、token。这类最强,但通常搜不到(没人会传密钥)。
  4. 独有文件名/命名模式:daindex.htm、buindex.htm 这类自定义文件名;hf_<书卷>_<章>.html 的编号模式。
  5. 目录名映射:逆向时拿到的目录结构(Lee8/Nee/cxxl/smdj8/...),若某仓库脚本里出现逐字一致的目录名映射表,即为强证据。
  6. 中文专有书名:圣经真理365、倪柝声文集、初信喂养系列 等。注意这类词会命中大量泛相关仓库,需结合第 5 类判同源。
  7. 原始域名:从 App 二进制/JS 里提取的下载域名(download.bibletruth01.cn)。命中即同源或同一作者,但通常已死。

操作步骤

  1. 提取指纹:本地 grep 采样独有文件名、中文书名、CSS/JS 命名、域名、ID。
  2. 确认工具与速率:GitHub Code Search API 必须带 token(匿名会 401)。用 gh auth status 确认已登录;gh api rate_limit --jq '.resources.code_search' 看配额(未认证是 10 次/分钟)。
  3. 批量搜索:gh api "search/code?q=<urlencoded>",每轮间隔 6–8 秒控制速率。用 --jq 只输出 total_count 和命中仓库/路径,别拉全量。
  4. 深挖命中仓库:用 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