JavaScript ASTフックを活用したカスタムメモリ監視プラグインの開発

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サーバーを提供

プラグインアーキテクチャの理解

ツールは拡張可能なプラグインシステムを採用しており、各機能は独立したスクリプトとして実装されます。処理フローは次の通りです。

  1. プロキシがページ内のJSリクエストをキャッチ
  2. Babelを使用してコードを解析し、変数代入時にフック関数を呼び出すように改変
  3. ブラウザ上で登録されたプラグインが、フックを通じてデータを取得・処理

カスタムプラグインの作成手順

新しい監視機能を追加するには、以下の手順に従います。

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リポジトリを参照してください。

タグ: AST javascript Babel proxy Reverse Engineering

5月21日 01:27 投稿