JavaScript ASTフックによるブラウザ内変数監視の仕組みとプラグイン拡張
ast-hook-for-js-RE は、AST(抽象構文木)ベースのフック技術を用いて、実行中のJavaScriptコードに動的に監視ロジックを挿入するオープンソースツールです。このアプローチにより、特定の変数や関数の値の変化をリアルタイムでキャプチャでき、暗号化パラメータの生成経路を特定する逆解析タスクにおいて非常に有効です。本稿では、独自の監視プラグインを作成する手順について解説します。
開発環境の準備
まず、以下のツールがインストールされていることを確認してください。
- Node.js v14 以降
- npm パッケージマネージャー
- Chrome ブラウザ(プロキシテスト用)
プロジェクトをローカルにクローンし、依存関係をインストールします。
git clone https://gitcode.com/gh_mirrors/as/ast-hook-for-js-RE
cd ast-hook-for-js-RE
npm install
主要コンポーネントの役割
システムは主に以下のライブラリで構成されています。
- @babel/core:JavaScriptコードをASTに変換
- @babel/generator:変更後のASTを元のコード形式に戻す
- anyproxy:HTTP通信を中継し、JSファイルを改変して送信
- express:検索用APIサーバーを提供
プラグインアーキテクチャの理解
ツールは拡張可能なプラグインシステムを採用しており、各機能は独立したスクリプトとして実装されます。処理フローは次の通りです。
- プロキシがページ内のJSリクエストをキャッチ
- Babelを使用してコードを解析し、変数代入時にフック関数を呼び出すように改変
- ブラウザ上で登録されたプラグインが、フックを通じてデータを取得・処理
カスタムプラグインの作成手順
新しい監視機能を追加するには、以下の手順に従います。
1. プラグインファイルの作成
src/components/global-assign-hook-component/plugins ディレクトリ内に新規ファイルを作成します。例:
// src/components/global-assign-hook-component/plugins/variable-tracker.js
function variableTracker(currentValue, valueType) {
// 文字列型のみを対象
if (valueType === 'string') {
const timestamp = new Date().toISOString();
console.log(`[Tracker] String captured: "${currentValue}" at ${timestamp}`);
}
}
// フックコールバックキューに登録
if (window.cc11001100_hook && window.cc11001100_hook.hookCallback) {
window.cc11001100_hook.hookCallback.push(variableTracker);
}
2. プラグインの登録
プラグインマネージャーに新しく作成したファイルを追加します。
// src/components/global-assign-hook-component/core/plugins-manager.js
const pluginsNames = [
"string-put-to-db-plugins.js",
"search-strings-db-plugins.js",
"eval-hook-plugins.js",
"variable-tracker.js" // 追加
];
3. 動作確認
以下のコマンドでサーバーを起動し、ブラウザのプロキシ設定を localhost:10086 に変更します。
node src/proxy-server/proxy-server.js
node src/api-server/api-server.js
任意のWebページにアクセスし、DevToolsのコンソールで出力を確認します。
高度なプラグイン例
より実践的なユースケースとして、特定のパターンを持つデータを検出するプラグインを紹介します。
メールアドレス検出プラグイン
// email-detector-plugin.js
function detectEmail(value) {
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (typeof value === 'string' && emailPattern.test(value)) {
console.warn('[Privacy Alert] Email address observed:', value);
}
}
window.cc11001100_hook.hookCallback.push(detectEmail);
XHRリクエスト監視
// xhr-monitor-plugin.js
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
this.addEventListener('load', function() {
console.log('[XHR Monitor] Request completed:', method, url);
});
return originalOpen.apply(this, arguments);
};
トラブルシューティング
- プラグインが動作しない場合:ファイル名のスペルミスや、
hookCallbackへの登録漏れがないか確認してください。 - DOM操作が必要な場合:
document.readyStateをチェックするか、DOMContentLoadedイベントを利用して適切なタイミングで処理を行ってください。 - 設定の永続化:
localStorageを使用して、ユーザーごとのフィルタ条件などを保存できます。
今後の拡張可能性
このフレームワークは、以下のような機能追加にも対応可能です。
- GUI制御パネルの実装
- 変数の履歴トレース機能
- 外部分析ツールとの連携(SIEMなど)
WTFPLライセンスのもとで公開されており、コミュニティへの貢献も歓迎されています。詳細はGitHubリポジトリを参照してください。