/
Ransomware Containment

.Net アセンブリを使用したランサムウェア手法の謎を解き明かす: EXE vs. DLL アセンブリ

このシリーズの パート1 では、マルウェア、特に ランサムウェア で使用されるいくつかの手法を検討しました。これまで見てきたように、ダウンローダー、ドロッパー、ローダー、エンコーディング、暗号化などのこれらの個々の技術はすべて、 .Net (ドットネット)ソフトウェアフレームワークや他の多くのプログラミングフレームワークやコード言語によって提供される正当でプログラム可能な機能です。以下は、前回の記事で説明したいくつかのテクニックのコラージュです。

この 2 番目の記事では、Microsoft .Net のフレームワークを使用してアセンブリの基礎を調べていきます。アセンブリ (EXE vs. DLL) とそれらの関係の違いをさらに深く掘り下げ、C# プログラミング コードなどの初期の高レベル コードからこれらの機能が最終的にどのように実行されるかを可能にします。前回の記事で紹介したコードを使用して、これらの違いと関係を探ります。

Microsoft .Netとは何ですか?

Microsoft .Net は、複数のプログラミング言語をサポートし、さまざまなオペレーティング システムを対象とするように設計されたソフトウェア開発フレームワークです。C# (C シャープと発音) などのサポートされているプログラミング言語は、(アンマネージ コードやネイティブ コードとは対照的に) マネージ コードと呼ばれるものとしてコンパイルされ、実行されます。これを実現するために、 .Net はターゲット プラットフォームに直接ではなく、専用の仮想マシンでコードを実行します。この仮想マシンは、 .Net 共通言語ランタイム (CLR) と呼ばれます。これは、 .Net がサポートする C#、VB.Net、F# など、さまざまなプログラミング言語からコンパイルまたはアセンブルされたコードを最終的に実行する共通の仲介者と考えることができます。次の例は、前の記事の C# プログラミング言語コードを示しています。

マネージ コードとは、上記の高水準 C# プログラミング言語コードと、F# や VB.Net などの他のコードが最初に中間言語 (IL) にコンパイルされることを意味します。上記の C# 高レベル コードは、次の図に示す中間言語命令にコンパイルされます。このコードは、低レベルのアセンブリ プログラミング構文に似ています。

この中間言語 (IL) は、関連するマシン プラットフォームを対象とするネイティブ コードまたはマシン コードにさらにコンパイルされます。このコンパイルは、Just-In-Time (JIT) コンパイラと呼ばれる別の .Net コンポーネントによって行われます。

ネイティブコードまたはマシンコードは、特定のコンピューターのプロセッサ(CPU)が理解する一連の命令(0と1)です。この最後の手順は、JIT も含む共通言語ランタイム (CLR) によって管理されます。CLR は、 .Net ランタイム環境または仮想マシンです。Java は、中間ランタイムの概念を使用する別のソフトウェア フレームワークです。Java 仮想マシンと同様に、これは .Net プラットフォームを独立させる主要な部分です。.Net コードは、プログラミング コードが中間 CLR によって管理され、コンピューターの CPU によって直接実行されないため、マネージ コードと呼ばれます。

.Net のマネージ コードの利点は、自動メモリ管理とガベージ コレクションです。これは、開発者が、たとえば C または C++ コードの場合のように、システム リソースを節約するために、コード内のコンピューター メモリの割り当てと割り当て解除について心配する必要がないことを意味します。.Net には、割り当て解除されたメモリを処理するために定期的に実行されるガベージ コレクターがあります。必要に応じてプログラマーが呼び出すこともできます。次の図は、 .Net アプリケーションのアーキテクチャを示しています。

対照的に、VB6、C、C++ などの非 .Net コンパイラは、高レベルのコードをターゲット プラットフォーム (OS および CPU) のマシン コードに直接コンパイルします。したがって、結果のコードの実行可能ファイルまたはアセンブリは、コンパイラのターゲットマシンプラットフォームに関連付けられます。これは、アンマネージ コードまたはネイティブ コードとも呼ばれます。アーキテクチャは異なりますが、アセンブリのコード、特にネイティブ コードで開発された DLL を .相互運用マーシャリング (プラットフォーム呼び出し) と呼ばれる機能によるネット管理アプリケーション。この例としては、ネイティブ Windows オペレーティング システム DLL や、マネージ .Net アプリケーションで参照される C++ で記述されたコードなどの外部ライブラリを使用して、一部の低レベルのオペレーティング システム機能を有効にすることが挙げられます。この場合、 .Net 自体は、Windows オペレーティング システムが依存するネイティブ DLL の安全なラッパーと考えることができ、その多くは実際には C++ で記述されています。

.Net アセンブリとは何ですか?

Microsoft では、 .Net アセンブリを 1 つの展開単位として説明しています。つまり、アセンブリは、互換性のある .Net ターゲット プラットフォームで実行できる何らかの形式にコンパイル (アセンブル) された、さまざまな種類のコードと関連ファイルのコレクションです。実行は によって行われます。Net の 共通言語ランタイム。Windows オペレーティング システムのアセンブリの例としては、実行可能ファイル (.exe) やクラス ライブラリまたはダイナミック リンク ライブラリ (.dll) ファイルがあります。  

以下のサンプル コード イメージを詳しく調べると、左側に C# 実行可能アセンブリ、右側に別の C# DLL (クラス ライブラリとも呼ばれます) アセンブリ コードが表示されます。実行可能コードは DLL ファイルを参照し、実行中に DLL コードから特定のメソッド (関数) を呼び出します。これらの参照と呼び出しは、次の図で強調表示されています。両方のコードの詳細については、この記事の後半で説明します。また、このシリーズでは、この組み合わせが悪意のある目的にどのように使用できるかも示します。

後続の例では、DLL ファイルが実行可能コードで手動で参照されます。これは、DLL とそのメタデータに関する関連情報、およびコード (モジュール、クラス、およびメソッドで構成される) が、実行可能コードのコンパイル時に参照されることを意味します。

共有ライブラリとして、DLL コードを単独で直接実行することはできません。コードの観点から見ると、これは、DLL には実行元のメイン エントリ ポイント関数がないため、実行可能 (.exe) コードが設定されているようにスタンドアロン コードとして実行できないためです。例として、次のエラー メッセージは、クラス ライブラリまたは DLL ファイルをコンパイラから直接実行しようとした場合の結果を示しています。

一方、実行可能コードには、実行が開始されるメイン エントリ ポイント関数またはメソッドがありますが、DLL は主に他のアセンブリによって参照されるコード ブロックのライブラリであるため、メイン エントリ ポイント関数は実際には必要ありません。

参照されると、DLL ファイル内の目的の特定のコードを呼び出して実行できます。前回の記事で示したように、以下のコード例 (EXE と DLL) では、この点が繰り返し述べられています。  

実行可能アプリケーションが実行され、参照した DLL からコードを呼び出して、次の図に示す出力を生成します。

この単純なプログラムは、EXE や DLL などの .Net アセンブリを一緒に使用する方法を示しています。

上記の DLL コードには、入力ごとに 2 つのパラメーター (名と年齢) を受け取り、この情報を使用して挨拶メッセージを表示するメソッド (関数) があります。一方、実行可能コードは、コマンド ラインから名と年齢のユーザー入力の詳細を受け取り、その情報を引数または入力として DLL メソッドに渡すコードを実行します。DLL コードからのメッセージは、EXE アプリケーションがユーザーから収集した情報を使用してコンソール画面に戻されます。

.Net アセンブリの分析

実行可能ファイルに対して静的分析を実行すると、実行用にインポートされた DLL やその他のコンポーネントのさまざまな参照が表示されます。独自のカスタムDLLに加えて、実行可能アセンブリは、基本コード(クラス、型など)を含み、プログラムをスムーズに実行するために必要なDLLである mscorlib など、.Net 自体に関連付けられた追加のDLLもインポートします。

コード開発環境Visual Studioでは、mscorlibの起源をデータ型の1つ(この場合は.Net System.String の 文字列)で追跡することで、 mscorlib の使用を確認できます。これにより、次に示すように、その型の由来である組み込み の .Net アセンブリ ( mscorlib ) が明らかになります。

文字列は、ユーザーが入力して表示されたテキストが格納されるプログラミング用語のデータ型です。静的分析から、「DLL_dontNet_Assembly」という名前のDLLもわかります。これは、ユーザーが詳細を入力した後にメッセージを表示する「DisplayMsgMethod」メソッドを含むカスタムDLLです。

この例では、プログラムの実行を開始する前に、すべてのコードのコンパイル中にカスタムDLLを手動で参照してロードしました。実行可能ファイルの実行中に DLL を参照することもできます。これは、コードのコンパイル中に目的の DLL にアクセスできない場合に特に役立ちます。このプロセスはリフレクションと呼ばれ、. Net アセンブリ (メタデータと属性) を調べたり、プログラムの実行時にその中に含まれるコード (モジュール、クラス、メソッド、およびプロパティ) を使用したりすることができます。この手法は、リフレクティブ DLL インジェクション攻撃として知られる悪意のある攻撃に対して微調整することもできます。

.Net アセンブリ (実行可能ファイルとクラス ライブラリ) は、アセンブリに関するメタデータを含むマニフェスト ファイルと中間言語 (IL) コードで構成され、これらを組み合わせることで、共通言語ランタイムは .Net を実行できる互換性のあるプラットフォームでアセンブリを実行できます。次の図は、2 つのアセンブリ (EXE と DLL) の IL アセンブリ命令とマニフェスト構造を示しています。マニフェスト ファイルには、バージョン番号、説明など、 .Net アセンブリに関するメタデータが含まれています。

これで、 .Net ソフトウェア フレームワーク、それに関連するアセンブリ、およびそれらが相互にどのように相互作用できるかについて、基本的な理解が得られるはずです。

次の記事では、これまでに説明し、学んだ手法と機能を 1 つの悪意のあるランサムウェア実行可能ファイルにまとめます。

イルミオゼロトラストセグメンテーションがランサムウェア侵害の封じ込めにどのように役立つかについて詳しく学びましょう

関連トピック

No items found.

関連記事

ランサムウェアの世界的なコスト調査:数字が教えてくれること
Ransomware Containment

ランサムウェアの世界的なコスト調査:数字が教えてくれること

攻撃者が運用の中断にどのように移行しているか、予防だけでは不十分な理由、ゼロトラストとマイクロセグメンテーションがランサムウェアの影響をどのように封じ込めているかをご覧ください。

ランサムウェアの封じ込めにはファイアウォールが十分ではない理由
Ransomware Containment

ランサムウェアの封じ込めにはファイアウォールが十分ではない理由

ファイアウォールが脅威に追いつくのに遅すぎる理由と、マイクロセグメンテーションがランサムウェア封じ込めの鍵となる理由を発見してください。

イルミオでClopランサムウェア攻撃を阻止する方法
Ransomware Containment

イルミオでClopランサムウェア攻撃を阻止する方法

Clopランサムウェアの亜種がどのように動作するか、そしてイルミオがマイクロセグメンテーションで組織が攻撃を封じ込めるのにどのように役立つかをご覧ください。

.Net アセンブリを使用したランサムウェア手法の謎を解く: 5 つの主な手法
Ransomware Containment

.Net アセンブリを使用したランサムウェア手法の謎を解く: 5 つの主な手法

.Net ソフトウェア フレームワークを使用した 5 つのランサムウェア手法について説明します。

IllumioでLockBitランサムウェア攻撃を封じ込める方法
Ransomware Containment

IllumioでLockBitランサムウェア攻撃を封じ込める方法

LockBitランサムウェアがどのように動作し、2022年夏にIllumio Zero Trust SegmentationがLockBitランサムウェア攻撃をどのように封じ込めたかをご覧ください。

違反を想定します。
影響を最小限に抑えます。
レジリエンスを高めます。

ゼロトラストセグメンテーションについて詳しく知る準備はできていますか?