# Bangumi.apk 逆向分析报告

> 目标：`Bangumi.apk`（61,040,771 字节）
> 结论：**伪装成 Bangumi（bgm.tv）官方客户端的灰产"视频聚合 + 广告变现"应用**。
> 其本质是一个服务端远程控制的广告欺诈 App：强制看广告门禁、全广告联盟变现、WebView 模拟点击刷量，并内置设备风控以最大化广告收益。

---

## 目录

1. [文件与签名取证](#一文件与签名取证)
2. [身份伪装](#二身份伪装)
3. [运行链路（执行路径）](#三运行链路执行路径)
4. [本质一：广告变现体系](#四本质一广告变现体系)
5. [本质二：WebView 模拟点击刷广告（Click Fraud）](#五本质二webview-模拟点击刷广告click-fraud)
6. [风控 / 对抗机制](#六风控--对抗机制)
7. [风险行为与安全结论](#七风险行为与安全结论)
8. [证据索引](#八证据索引)

---

## 一、文件与签名取证

| 项 | 值 |
|---|---|
| 文件 | `Bangumi.apk` |
| SHA-256 | `3dec13d69ef7900a1c242a2d917ba04cbaf7ccbe4b8293874aee51e27f70e0e7` |
| 包名 | `com.ydjw.inn` |
| versionCode | `2100` |
| versionName | `2.1.0.0`（模板标识 `v2.1.0.0-shipinapp_release`，"shipinapp" = 视频 App 白标模板） |
| 签名方案 | v1: 不支持 / v2: 支持 / v3: 支持 |
| 签名者 | `CN=ydjw, OU=ydjw, O=ydjw, L=ydjw, ST=ydjw, C=CN` |
| 证书 SHA-256 | `c150a1c9ea7c3c86be45ecf530d19fbb1f5e73630dec8a33b0261930e1b24914` |
| minSdk / targetSdk | 26 / 34 |
| 应用显示名 | `Bangumi` |

---

## 二、身份伪装

- 包名 `com.ydjw.inn` 与 Bangumi 官方无关；签名证书 CN=ydjw，是一家以 "ydjw" 为标识的运营方。
- `app_name = "Bangumi"`（res/values/strings.xml），启动图标为一张肤色系动漫图，并非 Bangumi 官方标识。
- 应用内置文案直接承认其真实属性：
  - `prompt8`："本APP只提供视频检索服务，任何视频资源均采集于互联网搜索，并不提供资源存储，也不参与录制、上传。"
  - `prompt2`："内容展示均由头条搜索和手机浏览器提供"
  - `prompt1`："请用户确认并知晓，所有内容的展示均由手机浏览器提供。"
- 启动页 `activity_loading.xml` 隐藏文本：`APP下载 jcyapp.cn`、`备用下载 jocy.org.cn`（备用下载站）。

---

## 三、运行链路（执行路径）

### 入口：`LoadingActivity`（smali：`smali_classes4/com/ydjw/inn/ui/activity/LoadingActivity.smali`）

1. `initAttr()`：无 `TOKEN` → 静默注册 `POST /api/user/loginUser`；否则 `videoHomePage("")`。
2. 后台 7 秒进度条（handler what=2，每次 100ms 推进，到 7000ms 触发 `goMain()`）。
3. 服务端配置加载：
   - `GET/POST /api/system/loadAdvertisementConfiguration` → `AdsBean`（服务端下发：强制广告数量 `numberOfAds`、开屏图 `openScreenImage`、`statusType`）
   - `POST /api/system/loadingInitialSystemInfo` → `SystemInfoBean`（服务端下发全部广告位：TopOn `appId`、快手 `kuaiAppId`、`rewardedVideoAd`、`splashAd`、`interstitialAd`、`feedAd`、`bannerAd`、`drawAd` 等 placement ID）
   - `initAds()` → `MyApp.initAdSdk()`：初始化 TopOn(`ATSDK.init(context, appId, appKey)`) + 快手 KsAdSDK，并预加载插屏/激励广告。
4. 风控：
   - `SmRiskUtils.getBoxId()`：数美 `SmAntiFraud`（appid `vHWhwSSPW15hIJdyVyHf`）采集设备指纹得到 boxId
   - `MainPresenter.getRisk(boxId)`：`riskSign = MD5("boxId=<id>&stimestamp=<ts>")`，POST JSON `{"boxId":...}` 到
     `https://tksyadmin.tiankongshuyu.cn/api/risk/getStatus`（header：`appName=URLEncode("Bangumi")`、`stimestamp`、`riskSign`）
5. 分流（`NetActivity.getRisk` → `MyApp.isNoRisk = !riskStatus.equals("1")`）：
   - **正常设备**：播放 7 秒开屏广告（`showOpenAds(true, adContainer)`）→ 进入 `AdsActivity6` 强制看广告门禁
   - **风险设备**（root / 模拟器 / 作弊环境）：`goMain()` 直接放行、不投广告

### 门禁：`AdsActivity6`

- 进度条按 `numberOfAds`（服务端下发）推进；`lookAdsSuccess()` 计数 `num`，看满 3 个 → `giftMembership()` → `LOOKADS=true` → 进入 `MainActivity`。

### 主界面：`MainActivity`

- 七个 Tab：动漫 / 视频 / 任务 / 排行 / 搜索 / 游戏 / 我的
- `initAttr()` 调 `initWebAd()` → `WebAdUtil.init()` + `initWebView(webView)`（隐藏 WebView 模拟点击，见第五节）
- 进入条件：`statusType=="3"` 且 `isNoRisk && !LOOKADS && !VIP` → 弹 `MainAdsDialog` 强制看广告

---

## 四、本质一：广告变现体系

### 4.1 强制广告门禁

- `AdsActivity6` / `MainAdsDialog`（非取消对话框）：
  - 文案："快运营不下去了，为了支付高昂的服务器费用，我们不盈利，只是为了活下去，今日起看三个视频广告将体验'永久无广告纯净版'"
  - `MainAdsDialog.addNum()`：`adsNum>=3` → `LOOKADS=true` → `giftMembership()`

### 4.2 播放权限广告

- 每次播放先 `POST /api/user/determineWhetherTheVideoCanBePlayed`；免费次数 `played/max` 用尽 → `oneAd(played)` → `LookAdsDialog`（"已看(n/3)"）→ 强制看激励广告 `showRewardAds("视频",1)`
- 播放链路：
  1. 客户端抓取片源站 HTML（`HttpUtils.getHtml`，UA 伪装 Windows Chrome）
  2. `StringUtils.compressHtml` 压缩后上传 `/api/searchFor/searchEpisodes`、`/api/searchFor/searchPlay`
  3. 服务端解析出真实视频 URL（`searchPlay` 返回 `data` 必须 `startsWith("http")`）
  4. ExoPlayer 播放（含弹幕 `DanmakuView`、DLNA 投屏 `DlnaCastActivity`）

### 4.3 任务 / 金币 / 会员

- `TaskFragment`：签到、补签、领金币（`/api/task/signIn`、`collectingTasks("激励")` 等），等级体系（番境学徒 → 次元之眼 → 星穹典司 → 永世执番 → 无极主宰）
- `prompt11`：签到 1–3 天 20 金币/日 … 30 天 300 金币；补签需看广告
- `MineFragment`：VIP = 看广告兑换的时间限免（`showRewardAds("vip",1)` → `giftMembership`）

### 4.4 广告 SDK 全家桶（Manifest 24 个权限 + 数百组件）

| 包 | SDK |
|---|---|
| `com.anythink` | TopOn 聚合 |
| `com.byazt` / `com.bytedance` / `com.ss.android` | 穿山甲 Pangle（含下载组件 `com.byazt.*`，provider authority `com.ydjw.inn.pangle.servermanager.*`） |
| `com.kwad` / `com.kuaishou` / `com.kwai` | 快手广告 + 快手风控 weapon |
| `com.baidu.mobads` | 百度广告 |
| `com.qq.e` | 腾讯优量汇 / 广点通 |
| `com.meishu` | 美数 |
| `com.beizi` | 倍孜 |
| `com.octopus` | 章鱼（TopOn 适配） |
| `com.umeng.union` | 友盟联盟 |
| `com.smartdigimkt` | SDM（含 Apk 下载/安装组件 `ApkDownloadService`、`ApkFileProvider`、`ApkConfirmDialogActivity`） |
| `com.moge.webutil` | WebAdUtil（模拟点击，见下） |

---

## 五、本质二：WebView 模拟点击刷广告（Click Fraud）

`com.moge.webutil.WebAdUtil`（classes5.dex，`MainActivity.initWebAd()` 调用）：

- 启动即 `POST https://video.pdlcomic.top/api/system/loadBrushAds` 获取推广页 URL；兜底 `http://sm27.iwmls.com/`
- `initWebView()` 在隐藏 WebView 加载推广页后启动定时器：
  - `simulationClick()`：**在随机屏幕坐标构造 `MotionEvent`(ACTION_DOWN / ACTION_UP)，`webView.dispatchTouchEvent()` 派发**，模拟用户点击
  - 随机间隔 `stratTime~endTime`（默认 7–10 秒）、每轮 `clickTimes`（默认随机 5–10 次）、共 `circleMax`（默认 15）轮
  - `circleMaxClick` / `clickPosition` 计数循环
- 结果回传 `https://video.pdlcomic.top/yg-api/advertise/search/insert`（参数 channelCode / oaid / link / invokeNum / appName / serviceKey）

→ 典型**模拟点击刷量**：向广告主虚报点击，属于广告欺诈。

---

## 六、风控 / 对抗机制

- **设备风控**：
  - 数美 `com.ishumei.smantifraud`（`SmAntiFraud`，appid `vHWhwSSPW15hIJdyVyHf`）
  - 快手风控 `com.kuaishou.weapon`（检测 `/sbin/.magisk/`、`/sbin/.core/db-0/magisk.db` 等 root 痕迹）
- **反检测清单**（Manifest `<queries>`）：Magisk、KernelSU、APatch、隐藏应用列表（HMA）、虚拟相机（vcamsx 等）、虚拟定位（fakeloction）→ 判断设备是否"干净"以决定是否投广告
- **Instrumentation 注入**：`MyApp.hookStartActivity()` 反射替换 `ActivityThread.mInstrumentation` 为 `InstrumentationProxy`；`execStartActivity` 拦截 `hap://`、`hnquickapp://`、`hwfastapp://`、`kwai://`、`ksnebula://`、`hapjs.org` 等**快应用拉起**（防广告被快应用劫持）
- **服务端远程控制**：广告位 appId / placement / 强制广告数 / 开屏图 / 更新 APK 全部服务端下发，客户端无本地硬编码

---

## 七、风险行为与安全结论

1. **身份伪装**：冒用 "Bangumi" 品牌、名称与动漫图标，误导用户下载。
2. **强制广告 + 诱导观看**：进 App 前 / 看视频前 / 做任务均强制观看激励广告。
3. **模拟点击刷量**：`WebAdUtil.simulationClick()` 伪造点击 → 广告欺诈。
4. **隐私收集**：`android_id`（作为 `deviceId` 请求头）、OAID（友盟）、数美设备指纹、`READ_PHONE_STATE`、`QUERY_ALL_PACKAGES`、`AD_ID`、剪贴板/定位权限（多为广告与风控 SDK 使用）。
5. **远程安装能力**：`/api/system/versionUpdate` 服务端下发 `versionUrl` + `isMandatory` → `DownloadAppUtils` 下载并 `ACTION_INSTALL_PACKAGE`（`REQUEST_INSTALL_PACKAGES`）→ 可被用于推送任意 APK（恶意更新链）。
6. **内容灰色地带**：内置 R18 提示页与"青少年守护模式"开关，聚合含成人内容的视频资源。

---

## 八、证据索引

### 关键源码/反编译产物

- 完整 Java 反编译：`decompiled/jadx/`（jadx 输出），补充反编译（含 LoadingActivity/MainPresenter 等）：`/tmp/jadx4`、`/tmp/jadx5`、`/tmp/jadx1`、`/tmp/jadx236`
- Smali：`apktool/out/smali*`（apktool 输出）
- DEX：`dex/classes*.dex`（自 APK 提取）

### 关键类

| 类 | 作用 |
|---|---|
| `com.ydjw.inn.ui.base.MyApp` | Application：Instrumentation 注入、友盟/OAID、开/关 App 上报、广告初始化 |
| `com.ydjw.inn.ui.activity.LoadingActivity` | 启动流程：登录 → 广告配置 → 系统信息 → 数美风控 → 分流 |
| `com.ydjw.inn.ui.base.NetActivity` | `getRisk` 判定 `isNoRisk`；`MainPresenter.MainView` 基类 |
| `com.ydjw.inn.presenter.MainPresenter` | 全部后端 API 封装（约 50 个接口） |
| `com.ydjw.inn.net.HttpUtils` | 两个后端：`videoapi.tiankongshuyu.cn` 与 `tksyadmin.tiankongshuyu.cn/api/risk/getStatus` |
| `com.ydjw.inn.ui.activity.ads.AdsActivity6` | 进 App 前强制看广告门禁 |
| `com.ydjw.inn.widget.taku.AdManager` | TopOn(`ATSDK`) 封装，模板 `v2.1.0.0-shipinapp_release` |
| `com.ydjw.inn.view.InstrumentationProxy` | 拦截快应用 scheme |
| `com.moge.webutil.WebAdUtil` | WebView 模拟点击刷量 |
| `com.smartdigimkt.*` | SDM 广告 SDK（statisticslinks.com 域名） |
| `com.byazt.*` | 穿山甲 Pangle 重命名包 |
| `com.ishumei.smantifraud` / `com.kuaishou.weapon` | 数美 / 快手风控 |

### 关键端点

```
https://videoapi.tiankongshuyu.cn           # 主 API（全部 /api/* 接口）
https://tksyadmin.tiankongshuyu.cn/api/risk/getStatus   # 设备风险判定
https://video.pdlcomic.top/api/system/loadBrushAds      # 刷量推广页获取
https://video.pdlcomic.top/yg-api/advertise/search/insert # 刷量点击回传
http://sm27.iwmls.com/                       # WebAdUtil 兜底推广页
jcyapp.cn / jocy.org.cn                      # 备用下载站（启动页隐藏文案）
```

### 关键字符串配置

```
app_name           = Bangumi
channel            = 59
sub_channel_id     = 0
product_id         = 0
um_appkey          = 6854b415bc47b67d838f0c91
sm_appid           = vHWhwSSPW15hIJdyVyHf
aliyun_appkey      = sh702a5cf7hsc8bd90c0a768e6f2b3d6
```

---

*报告生成时间：2026-02-14（沙箱内静态逆向，未联网运行）*
