FanqieHook

面向番茄小说与红果免费短剧 Android 客户端的 LSPosed 去广告模块,26 个 hook 拦截广告展示。

功能

  • 拦截阅读器广告:底部 banner、视频广告、翻页信息流、文字链接、章节断开处广告
  • 拦截首页与阅读器 TopView 广告
  • 拦截听书信息流 / 贴片广告
  • 拦截短剧暂停广告
  • 拦截红果短剧 banner、贴片、横屏插入广告
  • 拦截红果热启动开屏广告(Activity 级阻断)
  • 拦截评论列表 / 短剧评论、故事插页、创作者广告、短视频进度条插入广告(v0.6.0 新增,见下)
  • 保留用户主动点击的激励视频 / 金币 / 看广告免广告按钮

广告位覆盖(v0.6.0)

BLOCKED_POSITIONS 由 10 项扩至 21 项。名单不是从字符串池猜的,而是对广告闸门 checkAdAvailable(position, source)反向可达性 + 常量流分析——包括 position 作为参数 透传的包装方法——提取出真正流入闸门的 position 常量,再逐个反汇编调用点归类。73532 与 73732 流入闸门的常量集合完全相同(29 个),因此这是长期覆盖缺口而非版本回归。

分类 位置
阅读器 / 首页 splash_adpage_front_adpage_middle_adpage_end_adreader_bannerreader_text_link_adreader_disconnected_adreader_ad_for_sativideo_reader_adseries_pause_ad
v0.6.0 新增 comment_list_adseries_comment_adstory_adcreator_adprocessed_adlandscape_short_series_adlandscape_short_series_pause_adshort_series_adshort_series_banneraudio_info_flow_adaudio_patch_ad
显式保留(用户主动激励) reader_gold_coin_popupvideo_tts_advideo_voice_advideo_reward_gift_advideo_reader_end_urge_update

模块同时会把未分类的广告位记一条日志(每进程每位置一次,仅打日志、不影响返回值), 便于下一轮适配直接从实机数据扩名单:

adb shell su -c 'grep -a "unlisted ad position" /data/adb/lspd/log/modules_*.log'

兼容范围

项目 内容
当前支持 LSPosed Modern API(101+,102 已适配)
已验证应用 番茄小说 com.dragon.read v7.3.7.32(versionCode 73732)红果免费短剧 com.phoenix.read v7.3.7.32(73732);同时保留 v7.3.5.32(73532)双端支持
静态复核结果 73732 番茄 25/26 命中(缺 HongguoBannerServiceImpl 为红果专属);73732 红果 26/26;全部 hook 调用点数量与 73532 一致
实机复核 OnePlus 9R / Android 14 / LSPosed v2.2.0:番茄 7.3.7.32 与红果 7.3.7.32 均通过版本门禁(versionCode=73732),hook 安装成功
Android 8.0(API 26)及以上
作用域 com.dragon.readcom.phoenix.read
模块包名 dev.operit.fanqiehook
模块版本 v0.6.0(versionCode 17)

模块针对 v7.3.7.32 / v7.3.5.32 的运行时结构适配。两个版本共用同一套 hook 实现——73732 未移动任何 hook 目标, 仅混淆参数类型(ti4.hvq4.i)与 DexKit 反查的实现类名(fe3.alf3.a / yb3.a)发生变化, 两者都由既有的版本容错机制自动吸收。应用再次升级后,广告类名、方法名或调用链可能变化,届时需要重新适配。

安装与使用

  1. 安装 LSPosed 框架。
  2. 安装 Release 里的 app-release.apk(或直接在 LSPosed 模块中心安装/更新)。
  3. 在 LSPosed 中启用模块,勾选作用域 com.dragon.readcom.phoenix.read
  4. 强制停止番茄小说 / 红果免费短剧后重新打开。

验证:

adb logcat -s LSPosedLogDaemon:V | grep FanqieHook
# 应看到 "hook installed:" 记录,实际使用时出现 "blocked ad position=..."

模块日志默认写进 LSPosed 自己的日志文件而非 logcat,用这条更准: adb shell su -c 'grep -a FanqieHook /data/adb/lspd/log/modules_*.log | tail -60'

开发者注意:仓库里有两套签名密钥。 CI 发布版用固定 keystore(SHA-1 b5671e7e…), 而本机 ./gradlew :app:assembleRelease 未设 KEYSTORE_PATH 时会回退 ~/.android/debug.keystore (SHA-1 539f6674…)。两者签名不同,不能互相覆盖安装,混装前需先卸载。 对外发布请一律用 CI 产物,否则模块中心老用户会因签名冲突装不上。

已验证

  • 番茄侧与红果侧 hook 全部安装成功(含 DexKit 反查实现类:番茄 fe3.a/lf3.a、红果 yb3.a
  • 实测拦截:阅读器 banner、视频广告、翻页信息流广告、听书贴片广告、红果开屏与短剧 banner 广告
  • v0.4.0 修正 ExperimentUtil.p0()p()(p0 在 73532 中不存在),q0() 确认为横屏插入广告开关
  • v0.5.0 新增 73732:DEX 级复核 26 个目标类/方法签名、逐 hook 的调用点数量比对、位置字符串存在性复核
  • v0.5.0 修复版本门禁:Android 14 上两条反射路径全部失败会让门禁静默放行(FAIL_OPEN), 现改为自行解析宿主 APK 的二进制 AndroidManifest.xml(ApkVersion.kt),实机读到 versionCode=73732
  • v0.6.1 修正开屏链路:此前按红果的 Activity 路径实现,实测番茄走的是 SplashActivity 而非 OpeningScreenADActivity,故补上 BrandTopViewDisplayStrategy.c()enableSeriesFeedTopViewAd() 两道闸门

免责声明

仅供学习研究,绕过广告可能违反番茄小说 / 红果《用户协议》。

Releases

9/11/2026, 2:32:00 PM

更新内容:
v0.6.1 - 修正番茄开屏广告的链路假设,并补上品牌开屏闸门

  • 问题:v0.1.0~v0.6.0 的「开屏阻断」是按红果的 Activity 路径做的
    (NsAdImpl#openOpeningScreenAdActivity → OpeningScreenADActivity)。实机取证发现番茄根本不走这条路
    热启动时启动的是 com.dragon.read/.pages.splash.SplashActivity,且全程不调用
    checkAdAvailable("splash_ad"),所以「Activity 阻断 + 位置过滤」两层对番茄品牌开屏都是空的
    —— 日志会显示 hook installed,但广告照旧
  • 静态取证:NsAppNavigator 接口的唯一实现类是 com.dragon.read.component.j(不是 NsAdImpl);
    NsAdImpl#openOpeningScreenAdActivity 方法体内为 new Intent(ctx, OpeningScreenADActivity.class) +
    startActivity,即它只管红果那条 Activity 路径
  • 新增 hook:
    • BrandTopViewDisplayStrategy.c(AbsActivity)Z → false —— 品牌开屏真正的展示决策
      (反汇编可见其依次校验 Activity 未 finishing、有网络、非基础模式、checkAdAvailable("splash_ad","Brand"))
    • NsAdImpl.enableSeriesFeedTopViewAd()Z → false —— 系列 / 单列 TopView 开屏总开关
  • 新增 4 个只打日志、不改变行为的探针(SplashActivity#onCreateBrandTopViewDisplayStrategy#a/#b
    component.j#openOpeningScreenAdActivity),用于在实机日志里定位实际执行的开屏链路;
    SPLASH_PROBE 开关控制,确认链路后再关闭
  • 状态:修复已发出,但实机效果尚待确认;探针保留在 v0.6.1 内以便下一轮定位

Built from 5a9324e7f27dba2e12aae59f818987eb448aa5b7

Assets

1

9/11/2026, 1:23:55 PM

更新内容:
v0.6.0 - 拦截覆盖优化:按常量流证据扩充广告位名单(73532 / 73732 通用)

  • 缺口来源:对 checkAdAvailable(position, source)反向可达性 + 常量流分析
    (含 position 作为参数透传的包装方法),提取出真正流入广告闸门的全部 position 常量,
    再逐个反汇编调用点判断「被动广告位」还是「用户主动激励」
    • 结论:73532 与 73732 流入闸门的常量集合完全相同(29 个),属长期覆盖缺口,不是 73732 回归
  • BLOCKED_POSITIONS 由 10 项扩至 21 项,新增 11 个已确认为被动广告位的位置:
    • comment_list_ad(评论列表原生广告频控)、series_comment_ad(短剧评论广告)
    • story_ad(故事/短篇插页)、creator_ad(创作者广告)
    • processed_ad(短视频进度条插入广告,埋点名 pos=progress_ad)
    • landscape_short_series_adlandscape_short_series_pause_ad(横屏短剧插入/暂停)
    • short_series_adshort_series_banner(短剧信息流与 banner)
    • audio_info_flow_adaudio_patch_ad(听书信息流/贴片)
  • 新增 PRESERVED_POSITIONS 白名单,显式保留用户主动激励/金币入口:
    reader_gold_coin_popupvideo_tts_advideo_voice_advideo_reward_gift_ad
    video_reader_end_urge_update
  • 新增「未分类广告位发现日志」(LOG_UNLISTED_POSITIONS=true,每进程每位置仅记一次,仅打日志不改变返回值):
    广告位命名由服务端下发、版本间可能静默增加,该日志让每台设备都能为下一轮适配提供真实数据
  • 实机验证(OnePlus 9R / Android 14 / LSPosed v2.2.0,番茄 7.3.7.32):
    blocked ad position=creator_ad source=AT via lf3.a.checkAdAvailable —— 新增位置实测生效

Built from 68cbb647a510a887a8f806c8526683a21524bd0d

Assets

1

8/30/2026, 8:57:18 AM

更新内容:
v0.4.0 - 适配番茄小说 7.3.5.32(versionCode 73532)

  • 全量复核 24 个 hook 目标类与方法签名,与 73532 APK 逐一比对全部命中
  • 唯一缺失类 HongguoBannerServiceImpl 为红果专属,番茄侧预期 WARN 跳过,不影响功能
  • SUPPORTED_VERSION_CODES 同步升至 73532(com.dragon.read 已实测验证;com.phoenix.read 同基线待 APK 复核)

Built from 622a53a8a3e340bbb6d3b89f46c3a465cc69f70f

Assets

1

8/25/2026, 4:25:02 PM

更新内容:
v0.3.0 - 红果短剧 + 开屏广告拦截
新增红果短剧广告拦截(banner、贴片、横屏插入)与热启动开屏广告 Activity 级阻断
作用域覆盖 com.dragon.read 与 com.phoenix.read
番茄侧与红果侧 hook 全部安装成功;红果开屏、短剧 banner/贴片广告消失
安装:LSPosed -> 模块 -> 勾选 FanqieHook -> 作用域选 com.dragon.read 与 com.phoenix.read

Built from 56541c5986d89f50627f981528286f6ab09fb0a8

Assets

1

8/23/2026, 1:52:57 PM

番茄小说去广告模块 — 听书广告拦截 + DexKit 深度防线

  • 目标应用com.dragon.read v7.3.3.32(versionCode 73332)
  • 框架:LSPosed IT v2.1.1+(KernelSU / ZygiskSU)
  • 作者:afwfv

新增

  • 听书广告拦截:hook NsAdImpl.enableRequestAudioInfoFlowAd() / enableRequestAudioPatchAd()(v73332 smali 5248-5302),dex xref 验证 BsAudioAdService 仅由 NsAdImpl 调用,无绕过路径

修复

  • DexKit native 库加载:DexKit 2.0.4 自身从不调用 System.loadLibrary,LSPosed 注入进程中 libdexkit.so 无人加载导致 UnsatisfiedLinkError。现在 ClassResolver 在首次 DexKitBridge.create() 前显式加载(System.loadLibrary → 模块 APK 提取双策略)
  • 恢复 h83.a#checkAdAvailable 深度防线 hook(此前因 DexKit 加载失败静默缺失)

拦截的广告位

reader_banner(阅读器底部 banner)、video_reader_ad(阅读器视频广告)、splash_ad(开屏)、page_front_ad / page_middle_ad / page_end_ad(阅读页头/中/尾)、reader_text_link_ad(阅读器文字链接)、reader_disconnected_ad(章节断开处)、reader_ad_for_sati(激励位)、topview_main / topview_reader(首页/阅读器 TopView)、series_pause_ad(短剧暂停广告)、听书信息流/贴片广告(本版新增)

用户主动点击的激励视频 / 金币 / 看广告免广告按钮不会被屏蔽。

安装

  1. 装 LSPosed(KernelSU / ZygiskSU + LSPosed IT)
  2. adb install -r FanqieHook-v0.2.0-release.apk
  3. LSPosed Manager → 模块 → 勾选 FanqieHook → 作用域选 com.dragon.read
  4. 强制停止番茄,重新打开

验证

adb logcat -s LSPosedLogDaemon:V | grep FanqieHook

应看到 17 行 hook installed:(含 audio-info-flow-ad / audio-patch-ad / position-filter:h83.a

实测环境

POCO dada / HyperOS 2 / Android 16 + LSPosed IT v2.1.1,17/17 hook 安装成功;听书贴片广告、翻页信息流广告实机确认消失。

Assets

1

8/22/2026, 5:23:46 AM

番茄小说去广告模块 — 首个正式版

  • 目标应用com.dragon.read v7.3.3.32(versionCode 73332)
  • 框架:LSPosed IT v2.1.1+(KernelSU / ZygiskSU)
  • 作者:afwfv

拦截的广告位

reader_banner(阅读器底部 banner)、video_reader_ad(阅读器视频广告)、splash_ad(开屏)、page_front_ad / page_middle_ad / page_end_ad(阅读页头/中/尾)、reader_text_link_ad(阅读器文字链接)、reader_disconnected_ad(章节断开处)、reader_ad_for_sati(激励位)、topview_main / topview_reader(首页/阅读器 TopView)、series_pause_ad(短剧暂停广告)。

用户主动点击的激励视频 / 金币 / 看广告免广告按钮不会被屏蔽。

安装

  1. 装 LSPosed(KernelSU / ZygiskSU + LSPosed IT)
  2. adb install -r FanqieHook-v0.1.0-release.apk
  3. LSPosed Manager → 模块 → 勾选 FanqieHook → 作用域选 com.dragon.read
  4. 强制停止番茄,重新打开

验证

adb logcat -s LSPosedLogDaemon:V | grep FanqieHook

应看到 14 行 hook installed: + 实际使用时 blocked ad position=…

实测环境

POCO dada / HyperOS 2 / Android 16 + LSPosed IT v2.1.1 (7842),14/14 hook 安装成功。

Assets

1