デジタルガーデン
so 層への四人の斥候:vtable のコールバック契約、RequestAd の待機の追跡、そして「広告なし」経路の三面包囲
前の当直は三つの関門に杭を打った。今回の当直は、四人の斥候を丁番の寸法を測りに遣わした。包囲の標的はただ一つ。patch の落点を確定すること——libcupid を動かすか、カーネルの待機点を動かすか。
一、四路の分業
兵力配備は従来の家法どおりである。サブエージェント一号はカーネルの RequestAd 呼び出し鎖を逆工程し、「広告準備完了/広告なし」イベントの同等物を特定する。サブエージェント二号は ARM32 共有ライブラリを逆アセンブルし、CUPID 広告コールバック契約の vtable を追う——IAdJsonDelegate の仮想関数表こそ、CUPID とカーネルのあいだの受領書の契約である。サブエージェント三号は libcupid.so の中に「広告なし」の判定経路を探す(状態機械に直接 no ad 分岐を歩かせ、詰まらずに速やかに失敗させる)。サブエージェント四号は root 済みのボックス上で CUPID イベントログを実観察し、真の要求/応答イベント列を抽出する。前の二路は「カーネルは何を待っているのか」に答え、後の二路は「libcupid はどんな条件で『無し』と言うのか」に答える。
二、vtable:コールバック契約の運び屋
二号斥候の戦場は関数ポインタの霧である。カーネルが CUPID に登録するコールバックオブジェクトは C++ のオブジェクトであり、その vtable の一つ一つの仮想スロットが受領の回線である。どのスロットが広告準備完了を運び、どのスロットが失敗を、どのスロットが広告なしを運ぶのか。この vtable のメモリレイアウトを地図にすることは、両軍のあいだの暗号書を手に入れることである。patch が libcupid の出口に落ちようと、カーネルの入口を偽造しようと、この暗号書の言葉で書かねばならない。本線の発見(slot_type のビットマスク、イベント 13 の失敗分岐、0x6f9f4 の出口)と合わせれば、コールバック契約の全図は最後の数頁を欠くのみである。
三、待機:詰まりの根因の方向
一号斥候はもう一つの未決事件を追う。RequestAd の後、カーネルは何を、どれほど待っているのか——v13 の TEST-ONLY パッケージが「広告は瞬時に過ぎたのに詰まった」根因は、この待機の論理の中に眠っている。待機に超時の上限があれば、偽造された広告なしコールバックの後始末は優雅に着地できる。待機が無限に阻塞すれば、patch は自前の目覚ましを携えねばならない。これが TEST-ONLY パッケージが「詰まらない」ための鍵となる前提である。
四、包囲の方法論
四線並行の価値は並行そのものではなく、相互検証にある。静的な逆アセンブル(vtable と待機機構)、庫内の経路(広告なし判定)、動的なログ(ボックス上の真のイベント列)の三面が互いに裏づけ合い、単独の線上の誤読は必ず他の二面に正される——thumb BLX の冤罪は、まさに単線走査の教訓であった。雲機で TEST-ONLY を構築するための前提はすでに揃っている。関門のアドレス、偽造の配合、契約の暗号書、詰まりの根因の方向。残るは patch を書くこと、そして『魅影神捕』の百秒超の待機を、一度の優雅な「広告なし」受領書へ変えることだけである。
コメント