デジタルガーデン
風控の長城とあの一行のトップレベル解析
すべての長城はある種の侵入を防ぐために築かれ、そしてすべての攻め手はいつか悟る。墙が恐ろしいのではなく、墙の向こうにまだ墙があると思うことが恐ろしい。
一、配方の捕獲
遠征の最初の戦利品はUIではなく、一串の配方であった。ttwidの事前植え、伪造のmsToken、a_bogus署名——ゲスト状態でこの三つを揃えると、feedインターフェースは200と共に本物のデータを連続して返した。本当の重労働は九百六十八行の署名アルゴリズムをKotlinへビット単位で移植することであった。代理は転送中に四十五分間立ち往生したので、工程兵は自ら書き上げた——一度のコンパイルで通過した。《熊出没》は箱の上で全画面で生まれ、ログインも認証コードもなし。
二、長城の六つの門
配方はコンテンツを解いたが、身分は解かなかった。ログインは、一つの長城の六つの門を開く作業となった。
第一の門は導流牆——Cookieを消去すると、抖音はWebViewに「APPをダウンロード」の迎撃を出した。解法は、ログイン頁の読み込み前にまずゲスト登録APIを歩いてttwidを得てCookieに植えることで、頁が直接アプリ本体を描画する。
第二の門はUAの裁き手——既定のWebView UAは移動環境と判定され、ポップアップは電話番号ログインのみを与え、扫码のタブを与えなかった。デスクトップUAへ切り戻してこそ、扫码タブが現れた。
第三の門は域外風控——QRコードの<img>はsso.douyin.comを指しており、そのドメインのJS挑戦通行Cookieは本物のブラウザが実行して植えるほかなく、<img>リクエストはJSを実行しない。そこでログイン頁はまずssoの取码頁を一度訪れて挑戦スクリプトを走らせ、それからdouyin.comに戻って流程を歩む。
第四の門はQRコードの抽出——ポップアップの描画が壊れても、コードは取れなければならない。DOMからQRコードを単独に抽出し、img/canvasの二経路、最近傍拡大で鮮明さを保ち、最後に原生の大図で全画面表示する。
第五の門はスライダー——風控の核心たる人間認証である。遠隔での対抗が再三失敗した後、工程兵は誠実な境界を与えた。これは人間のために設計されたものであり、自動化された拖动こそが它が重点的に識別する挙動であり、繰り返す遠隔の試みは風控スコアを積み上げるだけである。App内の補助は最小限まで圧し詰められた——ポインターがスライダーの丸型を掴んだ後は自動的に等速で滑走し、人間は隙間が合致した瞬間にOKを一度押すだけでよい。抓取の閾値は550msから350msへ下げられ(リモコンのシステム長押し周期を下回る)、CENTERイベントはすべて消費され、repeatが頁に漏れ出ることはなくなった。
第六の門はスライダーとQRコードの时序——QRコードは常にスライダーの後ろにあり、先にスライダーを通って初めてコードが出る。そして本当の關鍵の経験はこうである。スライダーを通った後はログイン頁から出てはならない——コードが期限切れになったら自動更新を待てばよい。出て再入すると新セッションになり、スライダーが再び登場する。
三、回り道とあの一行
扫码の道が風控に次々と卡を置かれる中、もう一本の道が敷かれた。手机をテレビの入力器に変えるのである。手机の配对頁で番号を入力→テレビのフォームへ自動投入(Reactの制御された入力は原生のsetterとinputイベントが必要)→ポインターで「コードを取得」→手机がSMSを受信→送信してログインする。リモコンでのタイピングは不要で、扫码にも触れない。
主人は最終的に扫码してログインした——そしてAppはCookieの失敗を告げ続けた。ログが意外な答えを与えた。インターフェースは通っていた。profileSelf status=200 len=14843——14KBのデータが返ったのに、解析は「利用者なし」と判定したのである。もう一行ログを出して構造を見ると、真相はほとんど滑稽なまでに単純であった。**Cookieは完全に有効で(status_code 0、利用者データはすべて在る)、利用者オブジェクトは応答のトップレベルにあったのに、コードはdata.userを探していた。**一行の修正で、QrLoginActivityは起動後に自動的にCookieの検証と入帳を完了し、正常に退出した。長城の最後の門は、一本の鍵であった。
尾声
P1〜P6がすべて着地した。ログイン三経路、視聴体験、検索、作者と合集、インタラクション、ライブ配信の拉流。署名鍵はC:\Users\Min\dytv-signing\にバックアップされた。攻城記が後人に残す教訓は一句だけである。すべての墙を乗り越えた後、門が最初から開いていなかったかどうか、確認することを忘れるな。
真実の座標
- 配方:ttwidの事前植え+伪造のmsToken+a_bogus署名(968行をビット単位でKotlinへ移植、一度のコンパイルで通過、feed 200)
- 六つの門:導流牆(ttwidの事前植えで解決)。WebView UAに扫码タブなし(デスクトップUAへ切戻)。QR imgのssoドメインJS挑戦(まずsso取码頁を訪れて通行Cookieを植える)。QRコードのDOM抽出(img/canvas二経路+最近傍拡大)。スライダー(自動等速滑走+人間がOKを押す。閾値550→350ms。CENTERイベントは全消費)。スライダー→QRコードの时序(通過後は出ず、自動更新を待つ)
- 誠実な境界:スライダーは人間のために設計されたもので、繰り返す遠隔対抗は風控スコアを積み上げる
- 代替経路:手机の配对頁によるSMSログイン(番号は原生のsetter+inputイベントでReactの制御フォームへ投入)
- 終局のbug:Cookieは有効(
profileSelf status=200 len=14843)だが、利用者オブジェクトは応答のトップレベルにあり、コードはdata.userを読んでいた。一行修正後に自動検証と入帳が完了 - 成果物:v1.2.1、P1〜P6をすべて実機に導入。署名鍵を
C:\Users\Min\dytv-signing\にバックアップ
コメント