
DataDomeは、実際に行っている処理を隠すために、独自のVMをバンドルに埋め込んでいます。興味が湧いて分解してみました。同じようなリバースエンジニアリングパズルに興味がある方のために、ここで共有します。
DataDomeは、高度に難読化されたJavaScriptバンドルをブラウザに送信します。その中にはカスタム仮想マシンが含まれており、実際のフィンガープリンティングロジックを独自のバイトコード形式にコンパイルし、実行時にそのVM内で実行します。これは、執筆時点での最新バージョンの分析です。
このリポジトリにはDataDomeのコードは一切含まれておらず、私自身の解析とツールのみが含まれています。
使用する前に、下部にある注意事項をお読みください。
バイトコードを読み解けるようになると、いくつかの点が際立ちます。
文字列の暗号化。 すべての文字列は、バイトコードの先頭にある単一の暗号化ブロブに格納されています。各文字列は実行時に、テーブルヘッダーに埋め込まれたシードと組み合わせたエントリごとのXORキーを使用してデコードされます。そのため、生のバイトを読んでも、シードが分からなければ何もわかりません。
S-boxテーブルが至るところに。 バイトコードの最初の約20KBは、ほぼすべてPUSH_N_IMM + ARRAY_FROM_STACKシーケンスで構成され、256バイトのルックアップテーブルを構築しています。これらはS-boxであり、おそらく収集したシグナルを送信前にハッシュ化するための独自の暗号やAESラウンドに使用されます。
文字列をデコードした後に実際に確認できるフィンガープリンティングシグナル:
このプロジェクトは、カスタムVMによる難読化が実際にどのように機能するかについての好奇心を満たすためにのみ存在します。これはリバースエンジニアリングの学習教材であり、ボット検出を回避するためのツールではありません。
この知識をどう使うかは、あなた次第です。