
Fermion, an electron wrapper for Frida & Monaco.
Fermion は、frida-node と monaco-editor をラップする electron アプリケーションです。単一の UI を通じて Frida スクリプトのプロトタイピング、テスト、調整を行うための完全に統合された環境を提供します。Monaco の統合により、Visual Studio Code に期待されるすべての機能(Linting、IntelliSense、キーバインディングなど)が利用できます。さらに、Fermion は Frida API 用の TypeScript 言語定義を備えているため、Frida スクリプトを簡単に作成できます。
名前の由来: フェルミオンは、電子のような素粒子の場合もあれば、陽子のような複合粒子の場合もあります。フェルミオンには、すべてのクォークとレプトン、およびそれらが奇数個組み合わさってできたすべての複合粒子(すべてのバリオンや多くの原子・原子核など)が含まれます。
リポジトリをダウンロードし、ターミナルで Fermion フォルダーに移動します。そこで、以下の環境変数を設定します。
# Windows
set npm_config_runtime=electron
set npm_config_target=21.0.0
# Linux / OSX
export npm_config_runtime=electron
export npm_config_target=21.0.0
その後、以下で Fermion の実行に必要なパッケージをインストールします:
npm install
完了したら、次のコマンドで Fermion を実行できます:
npm start
上記の手順を完了し、ターミナルで次のコマンドを実行します:
# Windows
electron-packager . --icon .\src\images\fermion-ico.ico
# Linux
electron-packager . --icon ./src/images/fermion-ico.png
# OSX
electron-packager . --icon ./src/images/fermion-ico.icns
x64 Windows および Linux 向けの最新のビルド済み Fermion は、releases から入手できます。
Fermion に問題の内容と解決方法を示すメッセージが表示されます。ただし、一般的には、Fermion または Frida Server を root として実行するか、次のコマンド sudo sysctl kernel.yama.ptrace_scope=0 を実行してください。Q: Fermion の独自バージョンを新しいバージョンの Frida/Electron に対してビルドしたいのですが、現在存在する prebuild を確認するにはどうすればよいですか?
ELECTRON_TARGETS_DEFAULT と ELECTRON_TARGETS_FREEBSD でそれぞれデフォルトのビルドバージョンを確認できます。Q: Monaco エディターで使用される型定義を確認/変更/更新したいのですが、どうすればよいですか?
node_modules/@types/frida-gum/index.d.ts にあります。Q: なぜ trace は安定しないんだよ (╯°□°)╯︵ ┻━┻
hot pointer をトレースしている場合や、トレースが数千ノードのグラフを生成している場合、trace window がデータの受信中にラグる可能性があります。また、あらゆる種類のトレースと同様に、プロセスの不安定化 / クラッシュ / フリーズを引き起こす可能性があります。以下に、Fermion の動作例を示します。この例では kernel32!ReadFile を計測しています。

Fermion は、オートコンプリート、リンティング、Frida API シンボルサポートを備えています。

Fermion は、device コンテキストメニューを使用して Frida サーバーに接続し、リモートアプリケーションをデバッグできます。USB デバッグや、genymotion などのエミュレーターを介したモバイルアプリケーションへのアタッチなど、多くの場合、Fermion はサーバーを自動的に利用可能として認識します。ただし、IP と Port の組み合わせを使用してリモートサーバーを指定することも可能です。

Fermion は、スレッドの CALL tracing を組み込みでサポートしています。

これは、期待どおりに動作しない場合があります。pointer または module/Symbol の組み合わせを定義すると、トレーサーはその場所に attach し、thread がその場所で実行されるたびに、そのスレッドが戻るまでに実行するすべての CALL 命令のトレースを開始します。つまり、実行ごとに異なるグラフが生成される可能性があり、関数が行っているすべてを確認できない場合もあります(たとえば、関数内で別のスレッドが生成された場合など)。

Fermion は、これらのトレースを dot を使用して Graphviz SVG 形式に変換し、それを探索できるようにします。これは、探索的な作業を行う際に時々役立つ機能です(関数は何をするのか?その実行はどのくらい複雑か?)。とはいえ、これは Fermion の上に構築した prototype 機能であり、本番環境により適したものにするには、もう少し改良が必要でしょう。
Fermion には、Frida の JavaScript API の組み込みドキュメントもあります。他の誰もがそうであるように、私もすべての動作を常に覚えているわけではないため、アプリ内にドキュメントがあればブラウザーウィンドウを開く必要がなくなります。

バージョン固有の変更の詳細については、changelog を参照してください。
Fermion をワークフローに組み込んで便利だと感じた場合は、プルリクエストの作成、バグレポートの提出、アプリケーションを改善するための機能リクエストを行うことをお勧めします。私は正確には Node 開発者ではないので、誰かがコンポーネントの一部を最適化したり作り直したりする方法を見つけてくれるはずです。
Frida v15.0+ に統合された新機能を活用するようにデバイスマネージャーを拡張する。いくつか特別なお礼を述べたいと思います!