概要
- AI時代 においても、AST変換やブラウザ指紋・アンチボット対策に情熱を注ぐ筆者の話
- 手動での スクリプト解析 作業の非効率さを解決するための独自ツール開発記
- JavaScriptフック やChrome DevTools Protocol(CDP)活用による自動化アプローチ
- OOPIF(Out-of-Process IFrame) への対応や、アンチボットの検知回避の課題
- 実際の 逆コンパイル作業 効率化と検出回避テクニックの紹介
逆コンパイラ向けブラウザの開発記
- AI技術が進化 する中でも、AST変換・ブラウザ指紋・アンチボット回避に強い関心
- これまでの 手動解析作業 (スクリプト抽出・デオブスク化)が非効率で課題
- Webcrackやdeobfuscate.ioなどの 既存ツール ではエンドツーエンドでの効率化に限界
- 万能ツール(スイスアーミーナイフ) 的なブラウザ開発を決意
MVP開発とJavaScriptフック
- 最初のアイデアは ブラウザ拡張 での実装
- 例: Array.prototype.push のフックで全呼び出しをロギング
- オリジナル関数を保存し、ラッパーでログ+本来の動作維持
- Chrome Devtoolsで 関数フックの挙動 を確認
Content Scriptの限界と回避策
- Chromeの Content Script は独立した環境で動作し、ページ本体には影響しない制約
<script>タグを直接ページに挿入する案も検討- Chrome DevTools Protocol(CDP) の活用で根本解決を目指す
CDPによる早期スクリプト注入
- Page.addScriptToEvaluateOnNewDocument でページスクリプトより先にフックを注入可能
- Electron を使い、UI・IPC・デモアプリのPoCを迅速作成
- 任意のグローバル関数やプロパティの 監視・偽装 が容易に
UI実装とCanvas Fingerprint対策
- electron-browser-shell をベースにアドレスバー・タブ・サイドバーを追加
- サイドバーで フックされた関数イベント をリアルタイム表示
- Canvas API (toDataURL等)やWebGL、フォントプローブなどもフック
- これらの情報を可視化し、必要に応じて キャンバスの再現 も可能
OOPIF(アウトオブプロセスiframe)問題
- Cloudflare Turnstile等の OOPIF 内ではフックが機能しない課題
- CDPのTarget.attachedToTarget イベントで新たなターゲット(iframe等)を検知
- セッションIDを取得し、 iframe内部にもフックを注入 して解決
フック検知と検出回避
- アンチボットは ランタイムパッチ検知 (例:Function#toString)で対策
- フック関数の
toString結果やnameプロパティ等で 改変を見抜かれるリスク toStringやtoString.toString等を 偽装 しても新たな検知ベクトルが発生- パッチの脆弱性 とイタチごっこ状態
まとめ
- 逆コンパイル・リバースエンジニアリング 効率化のための専用ブラウザ開発の実践例
- CDP やElectron、関数フック技術の応用
- アンチボット検出回避 の難しさと、常に進化する攻防の現状
- 今後も 自動化・可視化・検知回避 の継続的な工夫が必要
すごく興味深い、ありがとう!フィンガープリンティングの部分について、JShelterブラウザ拡張機能(https://jshelter.org/)との違いを説明してもらえる?デモ動画でやったように、https://demo.fingerprint.com/playground で確認してみたんだけど(FirefoxでJShelterを使って)、フィンガープリンター検出レポートが出てきたよ。内容はこんな感じ:{ "fpd_evaluation_statistics": [ { "title": "Navigator.prototype.plugins", "type": "resource", "resource": "get", "group": "BrowserProperties", "weight": 0, "accesses": 0 }, { "title": "MediaDevices.prototype.enumerateDevices", "type": "resource", "resource": "call", "group": "BrowserProperties", "weight": 1, "accesses": 2 }, [...] } でも、実際にブラウザが何を生成したのかを表示する方法がないみたい。これが自分のブラウザを作る理由だったの?それとも、JShelterを拡張して同じことができるのかな?