Android APK逆向实战:zlib如何从官方应用还原Z-Library EAPI接口

  • CLI
  • 开发工具
  • MCP 服务
  • AI 技能

【免费下载链接】zlib

一个 Z-Library 命令行工具,支持图书搜索、下载、发送到 Kindle,支持 AI Agent 集成。 如需提交 Issue 或 PR,请前往 https://github.com/heartleo/zlib

项目地址: https://gitcode.com/heartleo/zlib
点击查看 免费下载

zlib 是一个 Z-Library 命令行工具:搜索图书、下载文件、发送到 Kindle,全部在终端里完成。由于 Z-Library 的 EAPI 接口没有任何官方文档,zlib 项目在开发中用 JADX 反编译了官方 Android APK,直接从代码里还原出 EAPI 接口定义,再逐条与真实服务器响应交叉验证。本文完整复盘这套 APK 逆向还原接口的实战方法。

zlib Z-Library 命令行工具的功能横幅:终端内搜索、下载图书并发送到 Kindle

为什么要逆向 APK 找接口?

EAPI(Electron API,Z-Library 移动端使用的接口)有几个绕不开的麻烦:

  • 没有官方文档:端点、参数、返回结构全都"藏在"客户端里;
  • 网页端不稳定:部分域名对非浏览器请求会进入 DiamWall 重定向循环,而移动端的 EAPI 往往还能正常工作;
  • 接口随时会变:上游可能改字段、改认证,甚至关闭域名。

在这种情况下,官方 Android 应用就是最好的"活文档"——它声明了完整的接口路径、HTTP 方法和参数结构,比抓包更系统,比零散的网络博客更权威。zlib 正是沿着这条思路,把逆向结果沉淀成了 EAPI 文档 和完整的客户端实现。

用 JADX 反编译 APK 的标准姿势

逆向过程记录在 docs/android-api-research.md,核心步骤只有三步:

  1. 锁定目标版本:官方 Android 包为 com.positron_it.zlib,versionName 1.11.4。由于 latest.apk 是可变下载地址,下载后先记录 SHA-256 校验值,保证可复现;
  2. 用 JADX 导出关键类:API 全部定义在 com.positron_it.zlib.data.ZLibApi 这一个类里,直接单类导出即可:
jadx --single-class 'com.positron_it.zlib.data.ZLibApi' --single-class-output 'ZLibApi.java' 'zlibrary.apk'
  1. 读懂 Retrofit 注解:Z-Library 的 App 使用 Retrofit 框架,每个方法的注解里直接写着路径和参数,例如:

    功能方法参数
    登录POST /eapi/user/loginemail、password、auth_token
    搜索POST eapi/book/searchmessage、yearFrom、yearTo、languages[]、extensions[]、e、page、limit、order
    图书详情GET /eapi/book/{id}/{hash}路径参数 id、hash
    下载链接GET /eapi/book/{id}/{hash}/file文件经动态 URL 二次 GET 流式下载

这就是逆向接口最省力的地方:一个类的注解 ≈ 一整份接口清单。

还原出的 EAPI 接口矩阵

ZLibApi 一共声明了 37 个方法。按功能归类后,核心矩阵如下(完整矩阵见 docs/android-eapi-deep-dive.md):

类别端点说明
会话POST /eapi/user/login登录;响应中取回 remix_userkey 作为后续凭证
搜索POST /eapi/book/search表单提交关键词、年份、语言、格式、排序
图书GET /eapi/book/{id}/{hash}、/formats、/similar详情、可用格式、相似图书
下载GET /eapi/book/{id}/{hash}/file生成下载链接,二进制文件从动态地址流式获取
书架GET /eapi/user/book/downloaded、/eapi/user/book/saved下载历史与收藏夹,均支持 order,page,limit
推荐GET /eapi/book/most-popular、/recently、/eapi/user/book/recommended热门、新书、个性化推荐
账户GET /eapi/user/profile、/eapi/info/domains账户信息、下载配额、可用域名列表
元信息GET /eapi/info/languages、/extensions、/plans语言、格式、套餐规则

zlib 终端界面首页,展示基于 EAPI 的搜索、收藏、历史、Kindle 投递等命令

数据模型也写在类里

Retrofit 方法上标注的响应模型(ZLibBooksListing、ZLibBook、ZLibPagination 等)等于把 JSON 结构也交代了,例如:

  • ZLibBook:id、hash、title、author、year、extension、filesizeString、cover、description 等;
  • ZLibPagination:current、total_pages 等分页字段;
  • ZLibBookFormats:每个格式带独立的 id、hash、extension——换格式不是改扩展名,而是换 ID/Hash 对。

模型细节与调用行为对比表见 docs/android-eapi-deep-dive.md 的"Data models and call behaviour"一节。

排序参数 order:逆向出的隐藏功能

APK 的搜索排序对话框会把选项下标传进一个数组,再经 BooksRepo.Query.order 注入搜索表单。逆向还原出的 8 个取值:

UI 含义order 取值
热门popular
最佳匹配bestmatch
最新上架date
书名 A–Z / Z–AtitleA / title
年份year
文件大小(大→小 / 小→大)filesize / filesizeA

实测同一查询下 8 个值各返回不同的 ID 排序,于是 zlib 直接把它做成了 search --order 参数。注意收藏夹和下载历史用的是另一套 7 值排序(saved_date、downloaded_date 等),不能与搜索排序混用——这也是纯逆向阅读能看出来的坑。

APK 声明与 zlib 源码交叉验证

还原出的接口并不是抄一遍就完事。zlib 把每个端点与客户端源码逐条对齐:

zlib 使用 EAPI 接口在终端中搜索图书的实际效果

交叉验证同时确立了三条安全红线,都写在 docs/android-api-research.md 中:

  1. APK 常量永不复制进源码:反编译出的固定授权头、设备信息只是"声明",是否必需必须由服务器响应证明;
  2. 域名单白:APK 里打包的域名只是出厂默认值,不能绕过 zlib 的域名白名单与重定向凭证剥离逻辑;
  3. GET 也可能改状态:/save、/unsave、/delete 等端点虽用 GET 却会变更账户状态,绝不能当作只读请求缓存或重试。

逆向的边界:声明不等于实测

这是整份研究最有价值的部分——把"APK 声明"与"真实服务器行为"分开标注:

  • GET /eapi/book/recently:声明返回图书列表,实测只回 success=1 而没有 books,于是 recently 被暂缓;
  • GET .../formats:模型完整,但实测 6 本书全部返回空数组,CLI 只能如实展示"无其他格式";
  • POST /eapi/user/login:个别账户会被单独拒绝(Authorization failed),而同一账户用 Cookie 导入后 EAPI 完全正常——说明登录端点被单独管控,zlib 因此保留了 zlib login --cookies 的 Cookie 导入通道;
  • GET /eapi/info/domains:返回 5 个候选域名,但并非"全球可用清单",仍须 zlib doctor 逐一探测。

一句话总结方法论:反编译给出地图,实测验证道路,两者都要留痕。

小结

zlib 的这次 APK 逆向把"无文档接口"变成了可维护的工程资产:JADX 单类导出 Retrofit 注解 → 整理端点/参数/模型矩阵 → 逐条与服务器实测对照 → 落入 Go 客户端与安全边界。完整的端点矩阵、模型表和排序行为对比,都可以直接阅读仓库内两份研究文档:

  • CLI
  • 开发工具
  • MCP 服务
  • AI 技能

【免费下载链接】zlib

一个 Z-Library 命令行工具,支持图书搜索、下载、发送到 Kindle,支持 AI Agent 集成。 如需提交 Issue 或 PR,请前往 https://github.com/heartleo/zlib

项目地址: https://gitcode.com/heartleo/zlib
点击查看 免费下载

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

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值