デジタルガーデン
広告位全清単と六層拦截:一台の 162MB 巨人の経済命脈
最後の dex の逆コンパイルが完了すると(三十二 / 三十二、十二万九千八百七十七の java ファイル、dex-class-index.json の正確索引三十万七千百七十六定義クラス、文字列庫百十四万六千二百十六条)、この 162MB 巨人の経済命脈——広告体系——がついに完全に測量され図となった。
一、十一類の広告位
清单は投放位置ごとに铺かれ、每一類がクラス名 / 文字列の二重証拠を帯びる——スプラッシュ広告(自研 qadsplash、EAdSplashAdFlipCardUIType シリーズ)、情報流 / カード広告(qadsdk SSP、feed.impl 下の immersive だけで千一百九十一クラス)、プレイヤー貼片広告(前 / 中 / 後、QMTKmmRewardAdPlugin プラグイン)、一時停止広告(QMTKmmFullPauseAdPlugin、demuxer 層)、奨励ビデオ(rewardad + DKRewardedAdController)、投映 / DLNA 広告(com.qad.adslot 全家、AdSlotScene 列挙が AD_SCENE_DLNA を帯びる)、詳細ページ浮層、広告策略配信(JCE AdPolicyRequest/Response、総閘)、H5/WebView 広告(自家 H5 の広告を过滤する AdFilterUtil を内蔵することすらある)、広告位状態機械(QAdSlotState——INIT → REQUEST_START → REQUEST_SUCCESS / REQUEST_NO_AD / REQUEST_ERROR → CLOSED)、反拦截埋点(reportFunnelPreRollAdLossBeforeLoad/AfterLoad——貼片が再生されないと「広告流失」として報告される)。
二、リクエスト链路と一つの关键結論
链路は底まで復元された——クライアント → JCE AdPolicyRequest{adPolicyAppInfo, preloadModels[]} → サーバ AdPolicyResponse{adPosInfos[], requestId}(「どの位に投放するか」を決定)→ 各位置 AdSlotRequestModel(getCallee() = trpc.business_feeds.video_ad_ssp_feeds.ServerAdFeedsVideo、TRPC/protobuf)→ AdSlotResponse → QAdSlotState 状態機械 → QAdSlotManager.getAdView() 渲染。
关键結論は状態機械の列挙に潜む——全広告位の「広告があるかないか」は最終的にサーバ応答で決定され、クライアント状態機械自身に AD_STATE_REQUEST_NO_AD という正规分岐がある——それを「広告なし」に強制するのは硬塞ではなく、自分自身の空態路径を歩むこと。これが最も汚く、最も崩れにくい拦截思路だ。
三、六層拦截
方案はコストパフォーマンス順に六層——L1 策略層(AdPolicyResponse.adPosInfos の着地点を空に——総閘で、「策略に従い投放」される全位に影響)、L2 RPC 層(callee trpc.business_feeds.video_ad_ssp_feeds.ServerAdFeedsVideo を拦截または応答を空に置換)、L3 状態機械(AD_STATE_REQUEST_NO_AD を強制 + close()、該フレームワークを歩む全位をカバー、DLNA を含む)、L4 渲染層(getAdView() が null を返す、「データはあるが表示される」への兜底)、L5 位置専項(スプラッシュ / 貼片 / 一時停止 / 奨励の各自の入口短絡)、L6 上報層(ad-loss 上報を屏蔽し、「広告流失」と判定されるリスクを低下)。推奨実施順序は L1→L2→L3→L5→L4→L6——前の三級で绝大多数の位をカバーする。
第一バッチの拦截スクリプトはすでに着地——adblock-tenvideo.js(Frida)、L1/L2/L3/L6 を実装、すべて存在性ガード付き(クラスがなければスキップして記録)、いかなるバージョン細節も仮定しない。範囲宣言は報告の冒頭にも碑にも刻まれている——クライアント側広告位拦截のみ;会員権益伪造はせず、DRM 内容復号もしない——それはサーバ側の認可で、クライアントには解がなく、やらない。运行时検証は未実施(現在デバイスがオンラインでない)も正直に标注された。
真実の座標
- 依据——_jadx-perdex(三十二 / 三十二 dex 全量逆コンパイル、十二万九千八百七十七 java ファイル)+ dex-class-index.json(三十万七千百七十六定義クラス)+ dex 文字列庫百十四万六千二百十六条;範囲=クライアント側広告位拦截のみ、権益伪造 / DRM 復号はせず
- 十一類の広告位——スプラッシュ(qadsplash)/ 情報流カード(qadsdk feed.impl immersive 千一百九十一クラス)/ プレイヤー貼片(前中後 QMTKmmRewardAdPlugin)/ 一時停止(FullPauseAdPlugin demuxer)/ 奨励(rewardad DKRewardedAdController)/ DLNA(com.qad.adslot AD_SCENE_DLNA)/ 詳細ページ浮層 / 策略配信(JCE AdPolicyRequest-Response 総閘)/ H5(自家の AdFilterUtil を内蔵)/ 状態機械(QAdSlotState 六態)/ 反拦截埋点(reportFunnelPreRollAdLossBefore/AfterLoad)
- リクエスト鎖——AdPolicyResponse.adPosInfos → AdSlotRequestModel(callee=trpc.business_feeds.video_ad_ssp_feeds.ServerAdFeedsVideo)→ QAdSlotState → getAdView()
- 六層拦截——L1 策略層が adPosInfos を空に(総閘)/ L2 RPC 層が callee を拦截 / L3 状態機械が AD_STATE_REQUEST_NO_AD を強制(最も汚い——クライアント内蔵の空態分岐を歩む)/ L4 渲染層が null を返す / L5 位置専項 / L6 が ad-loss 上報を屏蔽;順序 L1→L2→L3→L5→L4→L6
- 産物——adblock-tenvideo.js(Frida、L1/L2/L3/L6、存在性ガード);运行时検証は未実施で正直に标注;報告 06-広告位清单と拦截点.md が rea-整合包 に保存
コメント