したがって、スナップショットが合理的にモダンなバージョンによって作成された場合、おそらく[正しく]解析することはありません。それでも、試してみたい場合は、少なくとも#3の修正が必要です。
darter 、DARTスナップショット内のデータを完全に解析できるPythonモジュールです(つまり、リリースフラッターアプリのlibapp.soファイル)。
特徴:
app.soまたは.snapshotファイルからブロブを自動的に抽出します。解析された情報でできることの例:
注:これは、バイナリ(つまりアーキテクチャに依存する)スナップショットを解析するためのものであることに留意してください。 .dillファイルと一部の.snapshotファイルにはカーネルASTが含まれています。これはまったく異なる形式であり、現在はdarterによってサポートされていません。 [もっと詳しく知る]
コードのほとんどはゼロ依存関係ですが、以下を除きます。
parse_elf_snapshot(...)はpyelftoolsが必要です
darter.asmモジュール(組み立てられたコードを分析するため)には、キャップストーン(およびそのPythonバインディング)が必要です
darter自体は単なるモジュールであり、スタンドアロンプログラムやCLIはありません。
それを使用する推奨される方法は、ノートブックに含めることと、解析されたデータで再生することです。
解析されたデータの基本的なウォークスルーのために、Jupyterをインストールし、 1-introductionノートブックを開きます。次に、より興味深い使用例を含む2-playgroundに向かいます。
スナップショットを分析する前に、最初に既知のスナップショット(つまり、自分自身を構築した、またはコードを持っていることを)でプレイすることを強くお勧めします。
パーサーはまだ初期段階にあり、すべての場合には機能しません。
このパーサーは、 1ef83b86aeのDART-SDKに基づいて書かれていました。スナップショット形式はVMの内部です。メモリに表示されるオブジェクトの一部を捨てます。 VM(アーチ、コンパイルフラグ)がどのようにコンパイルされているかを知る必要があります。フォーマットには標準仕様(AFAIK)がないため、バージョン間で頻繁に変更できます。
支援や寄付は大歓迎です。
データセクションと指示セクション(およびオプションではベース)が与えられます。
OneByteString 、 CodeSourceMap 、 Instructionsなど)。情報は可能な限り解析されて返されるため、操作が簡単になります。後方参照も追跡されるため、特定のオブジェクトがどこから参照されているかを簡単に知ることができます。
darter 、「VM」スナップショットと「隔離」の両方(私たちが気にするもの)の両方を解析できます。
darter.asmモジュールは、コンパイルされたコードを分解し、分析します。これは、高レベルのバイテコードを取得しないため、AOTスナップショットにとって重要です。
DART/FLUTTERリバースエンジニアリングを初めて使用する場合は、この紹介を最初に読むことをお勧めします:https://mrale.ph/dartvm/
Snapshotシリアル化に関する関連コードはruntime/vm/clustered_snapshot.ccおよびruntime/vm/raw_object.hにあります。
infoディレクトリには追加情報もあります。