
実行ファイルからブロートを除去するためのGUIおよびCLIツールです。

Debloat は、肥大化した実行ファイルから余分なゴミを取り除くための GUI および CLI ツールです。
ここでいう余分なゴミとは、サンドボックスへの投入を防ぐためにバイナリに追加される 100〜800 MB のジャンクバイトを指します。このジャンクの追加手法は、バイナリの「膨張 (inflating)」または「増量 (pumping)」と呼ばれます。Debloat は現在、最も一般的な 10 種類の膨張手法に対応しています。
Python で構築されているため、このアプリケーションは他のワークフローにも簡単に組み込むことができます。現在、debloat は CCCS の AssemblyLine と CERT Polska の MWDB で使用されています。
このプログラムは Windows、MacOS、Linux 向けにコンパイルできます。GUI と CLI のオプションは最小限に抑えられています。可能な限りシンプルにすることを意図しており、プログラム内のロジックがさまざまなユースケースを自動的に処理します。
コンパイル済みバイナリは Releases に同梱されています。
debloat は pip install debloat でインストールできます。CLI を起動するには debloat を、GUI を起動するには debloat-gui を使用します。
上級ユーザー向けに、Debloat は他のスクリプトにインポートして、処理関数を個別に呼び出すこともできます。
Debloat の GUI は、可能な限り直感的に使えることを目指しています。 起動したら、肥大化したファイルをテキストバーにドラッグ&ドロップし、「Process file」ボタンを押すだけです。 スクロールするテキストボックスに技術情報が出力され、ブロートが取り除かれたファイルは元のファイルがあったディレクトリに書き込まれます。 簡単に聞こえますか? 実際に簡単です!
ファイルの処理には数秒かかります。

pip install debloat でインストールした後、debloat コマンドを使用します。
debloat は 2 つの引数を受け取れます。最初の引数は必須で、ブロートを除去するファイルを指定します。2 つ目の引数は任意で、出力先を指定します。出力先が指定されない場合、元のファイルと同じディレクトリに書き込まれます。
GUI は、debloat-gui コマンドを使用して CLI から起動することもできます。
まだです。 最近の分析によると、debloat は肥大化したファイルから 97.8% の確率でジャンクを除去できます。
以前のバージョンでは、debloat が誤ってバイナリを削除しすぎてしまうことがありました。"--last-ditch" スイッチを使用しない限り、そのようなことはもうありません。このスイッチが必要になった場合は、追加分析のためにサンプルを共有することを検討してください。このオプションは GUI にも追加されました。機能的には、オーバーレイがある場合、そのオーバーレイ全体を削除します。ジャンクのパターンが見つからない場合にこれが必要になることがあります。これは、圧縮があまり効かないサンプルで最もよく見られるケースです。
署名付き PE の末尾に追加されたブロート。
下の画像では、ブロートが実行ファイルの末尾に追加されています。

署名付きまたは署名なしのパック済み実行ファイル。
下の画像では、パック後にブロートが実行ファイルに追加されています。

署名付き実行ファイルの PE の .rsrc セクションにブロートが含まれている場合。
下の画像では、ブロートが .rsrc セクション内にあると特定され、PE から削除されています。

PE セクション内にブロートが追加されているケース。
下の画像では、ブロートが [0] という名前の PE セクションに含まれています。

実行ファイルが Nullsoft Scriptable Installer System 実行ファイル (NSIS、別名 Nullsoft) であるケース。
これらの exe は 1 つ以上のファイルを含む可能性のあるインストーラです。含まれるファイルが悪意を持つ場合もあれば、そうでない場合もあります。(攻撃者が単にファイルサイズを大きくするためだけにファイルを追加することもあります。) インストーラ内のすべてのファイルは新しいディレクトリに展開されます。このディレクトリにはインストーラのスクリプトも含まれており、どのファイルが悪意を持つ可能性があるかを判断するために参照できます。
下の画像では、Malcat がこの実行ファイルを NSIS インストーラとして識別しています。

このツールが機能しないユースケースもあります。ただし、詳細を公表する前に、それらを解決する予定です。
肥大化した実行ファイルを簡単に処理できるツールは限られているようです。私が最もよく見かけるのは、ディスクイメージからのバイナリ復元を目的とした「foremost」と「pecheck」の 2 つです。
Foremost は、ジャンクバイトが null (0x00) の場合に最適に機能し、バイナリに偽造または本物の署名がある場合はうまく機能しません。ファイルからブロートを除去する用途は、本来の目的ではありません。
Pecheck は 14 年以上にわたって開発されており、わかりにくいコマンドラインオプションがいくつかあります。ブロートされたコンテンツを除去するオプションは、このスクリプトの主な機能ではありません。署名付き実行ファイルを処理するには、Pecheck を別のツール (disitool) と組み合わせる必要があります。私の経験では、pecheck が混乱して、元の肥大化した実行ファイルの 2 倍のサイズの実行ファイルを返すこともあります。これらすべての要因は、少数のバイナリを処理する場合には問題ないように思えますが、バイナリと手法の数が増えるにつれて、ブロートの除去に特化したツールが必要になります。
Binary Refinery は素晴らしいツールです。これは、コマンドライン版の CyberChef を目指して書かれました。どちらのツールも素晴らしいのですが、どちらにも、ユーザーがどの公式を適用すべきかを知っておく必要があるという欠点があります。
バイナリからブロートを除去する確実な手動方法はありますが、これらの方法は退屈で、すべてのアナリストがこのスキルを持っているわけではありません。このツールは、手動でブロートを除去する方法を知っておく必要があるという負担を取り除きます。さらに、より大規模な処理が可能になります。このスクリプトで使用されている原則により、自動化が望まれる場合には、より大規模な処理が可能になります。
お使いのプラットフォームに適したビルドコマンドに従ってください。ビルドコマンドの主な違いは、アイコンの形式です。
MacOS
pyinstaller --onefile --noconsole --additional-hooks-dir=./hook --icon=debloat.icns gui.py
Windows
pyinstaller --onefile --noconsole --additional-hooks-dir=./hook --icon=debloat.ico gui.py
Linux
pyinstaller --onefile --noconsole --icon=debloat.ico --collect-all tkinterdnd2 gui.py
debloat Discord への参加を検討してください。
Binary Refinery の作者である Jesko Hüttenhain 氏に大きな敬意を表します。NSIS の抽出は、彼による NSIS ファイル形式のリバースエンジニアリングに基づいています。まだの方は Binary Refinery をチェックしてみてください。
バッチ処理: ディレクトリ内のすべてのファイルを処理し、レポートを生成します。
debloat の外部で処理メソッドを使用するためのサポートの強化。
解凍せずにブロートを除去するためのサポート。