.NET アセンブリを使用したランサムウェア手法の解明:EXE と DLL アセンブリ
で パート 1 このシリーズでは、マルウェアが使用するいくつかの手法を検討しました。 ランサムウェア 具体的に。これまで見てきたように、ダウンローダー、ドロッパー、ローダーなどの個々の技法だけでなく、エンコーディングや暗号化も、すべて正規のプログラム可能な機能であり、 .Net (ドットネット)ソフトウェアフレームワークおよびその他の多くのプログラミングフレームワークとコード言語。以下は、前の記事で説明したいくつかのテクニックをまとめたものです。
この2番目の記事では、Microsoftのフレームワークを通じてアセンブリの基礎を調べます .Net。アセンブリの違い (EXE と DLL) とその関係についてさらに掘り下げます。これにより、C# プログラミングコードのような初期の高レベルコードからこれらの機能が最終的にどのように実行されるかがわかります。前回の記事で紹介したコードを使用して、これらの違いと関係を探ります。
マイクロソフト.Net とは何ですか?
マイクロソフト .Net は、複数のプログラミング言語をサポートし、さまざまなオペレーティングシステムを対象とするように設計されたソフトウェア開発フレームワークです。C# (C sharpと発音) のようなサポート対象のプログラミング言語は、(アンマネージコードやネイティブコードとは対照的に) マネージコードと呼ばれるものとしてコンパイルされ、実行されます。これを実現するには、 .Net コードをターゲットプラットフォームに直接実行するのではなく、専用の仮想マシンで実行します。この仮想マシンは、と呼ばれます。 .Net 共通言語ランタイム (CLR)。C#、VB.Net、F# などのさまざまなプログラミング言語のコンパイルまたはアセンブルされたコードを最終的に実行する共通の仲介手段と考えることができます。 .Net サポートする。以下の例は、前の記事の C# プログラミング言語コードを示しています。
マネージコードとは、上記の高水準の C# プログラミング言語コードや F# や VB.Net などの他のコードが、まず中間言語 (IL) にコンパイルされることを意味します。上記の C# 高レベルコードは、下図の中間言語命令にコンパイルされます。このコードは、低レベルのアセンブリプログラミング構文に似ています。
次に、この中間言語(IL)は、関連するマシンプラットフォームを対象としたネイティブコードまたはマシンコードにさらにコンパイルされます。このコンパイルは別の人が行います。 .Net ジャストインタイム (JIT) コンパイラと呼ばれるコンポーネント。
ネイティブコードまたはマシンコードは、特定のコンピューターのプロセッサ (CPU) が理解できる一連の命令 (0 と 1) です。この最後のステップは、JIT も含む共通言語ランタイム (CLR) によって管理されます。CLR は .Net ランタイム環境または仮想マシン。Java は、中間ランタイムの概念を使用するもう 1 つのソフトウェアフレームワークです。Java 仮想マシンと同様に、Java 仮想マシンを構成する主要な要素でもあります。 .Net プラットフォーム非依存。 .Net プログラミングコードは中間のCLRによって管理され、コンピューターのCPUによって直接実行されないため、コードはマネージコードと呼ばれます。
でのマネージコードの利点 .Net 自動メモリ管理とガベージコレクションです。つまり、開発者は C や C++ コードの場合のように、システムリソースを節約するためにコード内のコンピューターメモリの割り当てや割り当て解除について心配する必要がありません。で .Net、割り当て解除されたメモリを処理するために定期的に実行されるガベージコレクタがあります。また、プログラマーが必要に応じて呼び出すこともできます。以下の図は、のアーキテクチャを示しています。 .Net 応用。
対照的に、非-.Net VB6、C、C++ などのコンパイラは、上位レベルのコードをターゲットプラットフォーム (OS および CPU) のマシンコードに直接コンパイルします。そのため、生成される実行ファイルまたはコードのアセンブリは、コンパイラーのターゲットマシンプラットフォームに関連付けられます。これはアンマネージコードまたはネイティブコードとも呼ばれます。アーキテクチャは異なりますが、アセンブリのコード、特にネイティブコードで開発された DLL を使用することは可能です。 .Net-と呼ばれる機能による管理アプリケーション 相互運用マーシャリング (プラットフォーム呼び出し)。その例としては、ネイティブの Windows オペレーティングシステム DLL や、C++ で記述されたコードなどの外部ライブラリがマネージドで参照されている場合が挙げられます。 .Net 一部の低レベルのオペレーティングシステム機能を有効にするアプリケーション。この場合、 .Net それ自体は、Windows オペレーティングシステムが依存するネイティブ DLL の安全なラッパーと考えることができます。ネイティブ DLL の多くは、実際には C++ で記述されています。
.Net アセンブリとは何ですか?
マイクロソフトは説明します .Net アセンブリを 1 つのデプロイメントユニットとして使用します。つまり、アセンブリとは、互換性のある任意の形式にコンパイル (アセンブル) された、さまざまな種類のコードと関連ファイルの集まりであるということです。 .Net ターゲットプラットフォーム。実行は次の方法で行われます。 .Net 共通言語ランタイムWindows オペレーティングシステムのアセンブリの例としては、実行ファイル (.exe)、クラスライブラリまたはダイナミックリンクライブラリ (.dll) ファイルがあります。
以下のサンプルコードイメージをさらに掘り下げてみると、左側に C# 実行アセンブリが、右側に C# DLL (クラスライブラリとも呼ばれる) アセンブリコードが表示されます。実行コードは DLL ファイルを参照し、実行中に DLL コードから特定のメソッド (関数) を呼び出します。これらの参照と呼び出しは、下の図で強調表示されています。この 2 つのコードの詳細は、この記事の後半で説明します。また、この連載では、この組み合わせが悪意のある目的にどのように使用されるかについても説明します。
次の例では、実行コードで DLL ファイルを手動で参照します。つまり、DLL とそのメタデータに関する関連情報、およびコード (モジュール、クラス、メソッドで構成される) は、実行コードのコンパイル時に参照されます。
共有ライブラリとして、DLL コードを単独で直接実行することはできません。コードの観点から見ると、DLL には実行元となるメインのエントリポイント関数がないため、実行可能 (.exe) コードのようにスタンドアロンコードとして実行できないためです。例として、以下のエラーメッセージは、クラスライブラリまたは DLL ファイルをコンパイラから直接実行しようとした場合の結果を示しています。
一方、実行可能なコードには、実行が開始されるメインのエントリポイント関数またはメソッドがありますが、DLL は主に他のアセンブリによって参照されるコードブロックのライブラリであるため、実際にはメインのエントリポイント関数は必要ありません。
一度参照すると、対象となる DLL ファイル内の特定のコードを呼び出して実行できます。前の記事で示したように、以下のコード例 (EXE と DLL) でもこの点を繰り返し説明しています。
実行可能なアプリケーションが実行され、参照した DLL からコードを呼び出して、次の図に示す出力を生成します。
この簡単なプログラムはその方法を示しています .Net EXE や DLL などのアセンブリは一緒に使用できます。
上記の DLL コードには、入力ごとに 2 つのパラメーター (名前と年齢) を受け取り、その情報を使用して挨拶メッセージを表示するメソッド (関数) があります。一方、実行コードは、コマンドラインからユーザーが入力した名前と年齢の詳細を受け取り、その情報を引数または入力として DLL メソッドに渡すコードを実行します。DLL コードからのメッセージは、EXE アプリケーションがユーザーから収集した情報を使用してコンソール画面に表示されます。
.NET アセンブリの分析
実行ファイルで静的解析を実行すると、実行用にインポートされた DLL やその他のコンポーネントのさまざまな参照が表示されます。実行アセンブリは、独自のカスタム DLL に加えて、以下に関連する追加の DLL もインポートします。 .Net そのものなど mscorlib これは基本コード (クラス、型など) を含むDLLで、プログラムをスムーズに実行するために必要なものです。
弊社のコード開発環境 Visual Studio では、以下の使用状況を確認できます。 mscorlib いずれかのデータ型 (この場合は、 ひも から システム. ストリング に .Net)。これにより、ビルトインが明らかになります .Net そのタイプの由来となるアセンブリ mscorlib 以下に示すように。
文字列は、ユーザーが入力して表示されて戻されるテキストが格納されるプログラミング用語のデータ型です。また、この静的解析から、DLL に「」という名前が付いていることもわかります。Dontnet_Assembly。」これは「」を含むカスタム DLL ですメッセージ表示方法」メソッドは、ユーザーが詳細を入力した後にメッセージを表示します。
この例では、プログラムが実行を開始する前に、すべてのコードのコンパイル中にカスタム DLL を手動で参照してロードしました。実行ファイルの実行中に DLL を参照することもできます。これは、コードのコンパイル中に目的の DLL にアクセスできない場合に特に便利です。この処理はリフレクションと呼ばれ、これによって検証が可能になります .Net アセンブリ (メタデータと属性)、およびアセンブリに含まれるコード (モジュール、クラス、メソッド、プロパティ) をプログラムの実行時に使用することもできます。この手法は、リフレクティブ DLL インジェクション攻撃と呼ばれる悪意のために微調整することもできます。
.Net アセンブリ (実行ファイルおよびクラスライブラリ) も、アセンブリと中間言語 (IL) コードに関するメタデータを含むマニフェストファイルで構成されます。これらを組み合わせることで、共通言語ランタイムは、実行可能な互換性のあるプラットフォーム上でアセンブリを実行できます。 .Net。下の画像は、EXE と DLL の 2 つのアセンブリの IL アセンブリ命令とマニフェスト構造を示しています。マニフェストファイルには、に関するメタデータが含まれています。 .Net バージョン番号、説明などのアセンブリ
これで、基本的な理解ができたはずです .Net ソフトウェアフレームワーク、それに関連するアセンブリ、およびそれらがどのように相互作用するか。
次回の記事では、これまでに説明し、学んだ手法と機能を1つの悪意のあるランサムウェア実行ファイルにまとめます。
さらに詳しく イルミオゼロトラストセグメンテーションがランサムウェア侵害の封じ込めにどのように役立つかについて説明します。