HOWTO · Csharp

C# でコードを難読化する

この記事では、ハッカーが読み取ったり理解したりできないように、C# でコードを難読化する方法について説明します。

このページの内容

この記事では、C# でコードを難読化する方法を紹介します。プロセスを支援できるさまざまな方法といくつかのツールを使用します。

ほとんどの非.Net コンパイラは、ネイティブ CPU 命令を含むバイナリプログラムを発行します。これは、分解、逆コンパイル、およびリバースエンジニアリングが非常に困難です。

ただし、C# やマネージ C++ などのすべての.Net コンパイラは、MSIL(Microsoft Intermediate Language Format)でコンパイルされたプログラムを提供します。

この形式では、クラス名、フィールド、メソッド、プロパティ、設定などのソフトウェアに関する多くの高レベルの情報だけでなく、実際のコードも豊富な構造で保持されます。

その結果、.Net アセンブリからこの情報を抽出するために、さまざまな逆コンパイラと逆アセンブラが作成されました。

C# でのコードの難読化の意味

実行可能ファイルを変更してハッカーには役に立たないが、完全に機能し続ける手法は、コード難読化として知られています。

プロシージャはメソッドステートメントまたはメタデータを変更する場合がありますが、プログラムの出力には影響しません。

C# でのコードの難読化

コードの難読化は、階層化された防御を提供するために連携して機能するいくつかの多様なアプローチで構成されています。これは、中級レベルの命令を発行する C# のような言語で特に役立ちます。

C# コードをハッカーが解釈しにくくするのに役立つ難読化ツールがいくつかあります。

  • .NET リアクター
  • Eazfuscator.NET
  • バベル
  • ConfuserEx

C# でこれらのツールを使用して難読化を実装するためのアプローチ

コードを誰にも理解できないようにするためのいくつかのアプローチがあります。それらのいくつかについては、次の段落で説明します。

C# で難読化の名前を変更

この手法は、メソッドと変数の名前を変更します。逆コンパイルされたソースを人間が理解するのは困難ですが、プログラムの実行には影響しません。

新しい名前は、アルファベット、数字、印刷できない文字や見えない文字など、さまざまなスキームを採用している場合があります。

名前のスコープが異なる限り、オーバーロードすることができます。ほとんどの C# 難読化ツールは、基本的な変換として名前の難読化を採用しています。

難読化の名前を変更する前の元のソースコード:

public class Data {
  public int age;
  public Data(int age) {
    this.age = age;
  }
}

名前変更の難読化が実装されたソースコード。

public class a {
  public int b;
  public a(int b) {
    this.b = b;
  }
}

C# での文字列暗号化

文字列は、適切に管理され、適切に実行されたコードの一部としてすぐに識別できます。

メソッドと変数の名前が変更された場合でも、文字列参照は、バイナリ内の文字列参照をチェックすることにより、重要なコード領域を見つけることができます。

これには、ユーザーが表示できるすべてのメッセージが含まれます。これは、この形式の攻撃に対するバリアを提供します。

文字列の暗号化は、実行可能ファイル内の文字列を暗号化しますが、必要な場合にのみ実際の値を返します。

文字列暗号化前の元のソースコード:

Console.WriteLine("Encrypt this");

文字列暗号化が実装されたソースコード。

Console.WriteLine("x%$&#@");

C# のコードのアンチデバッグ

攻撃者がデータを変更したり、重要なコンポーネントの機能を盗もうとしたりすると、おそらくリバースエンジニアリングとデバッグから始まります。

専門家やハッカーはツールを使用してコードを 1 行ずつ分析します。難読化ツールは、アプリケーションの自己保護を介してそれを識別できます。

デバッガーを使用すると、重要なデータを破棄したり、ランダムなクラッシュをトリガーしたり、特定のアクションを実行したりする可能性があります。

IT セキュリティの専門家は、アンチデバッグツールを使用して、ハッカーが攻撃の一部としてデバッグアプリケーションを使用しているかどうかを検出できます。

ハッカーは、アンチデバッグツールを利用して、デバッグツールを使用してコードに適用している変更を判別するタイミングを特定できます。

C# のコードの改ざん防止

難読化ツールは、アプリケーションの自己保護をそれに注入できます。改ざんが発見された場合、プログラムをシャットダウンしたり、機能を制限したり、ランダムにクラッシュしたり(クラッシュの原因を隠すため)、その他の特定のアクションを実行したりできます。

また、発見された改ざんを通知するメッセージをサービスに送信する場合もあります。

C# でのダミーコードの挿入

プログラムのロジックに影響を与えないが、逆コンパイラーを壊したり、リバースエンジニアリングされたコードを理解しにくくしたりするコードを実行可能ファイルに挿入します。

C# でのバイナリリンク/マージ

この変換は、複数の入力実行可能ファイル/ライブラリを 1つ以上の出力バイナリに結合します。

リンクは、特に名前の変更やトリミングと組み合わせると、アプリケーションのサイズを最小限に抑えるのに役立ちます。

また、展開を容易にし、ハッカーがアクセスできる情報の数を最小限に抑えることができます。