dnSpyの使い方!.NETアプリのソースコード丸見え

.NETアプリとdnSpyセキュリティ
Photo by Markus Spiske on Unsplash

JavascriptやBATファイルでは記載時点で可視化されているので、秘密情報を埋め込むことはないかと思いますが、コンパイラを経て作成されたバイナリモジュールでは何となく情報が隠蔽されている様に見えてしまいがちです。
ですが、.NETアプリでは簡単にソースコードが見えてしまうことをdnSpyを使って紹介します。

スポンサーリンク
スポンサーリンク

サンプル.NETアプリ

サンプル用アプリを作成しました。Visual Studio 2019 .Net Core C# コンソールプロジェクトで下記コードを追加し、Release版でビルドしました。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string password = "P@ssw0rd";
            byte[] secret = { 0, 1, 2 };

            string answer = secret.ToString() + password;

            Console.WriteLine("Hello World!");
        }
    }
}

dnSpy

上記ビルドマシンとは異なるWindowsマシン上に解析環境を構築しました。

ダウンロード

解析ツールdnSpyはgithubからダウンロードします。解析するモジュールに合わせて、今回は.NET Core 64bit版を選択しました。zipを適当なフォルダに解凍し、dnSpy.exeを実行します。

解析

メニュー[File]-[Open]から、解析対象となるモジュールを選択します。今回は、ConsoleApp1.dllを指定しました。結果は下記です。ConsoleApp1-Program配下に先程のコードが、値も含めて確認できます。

勿論、Visual StudioでのC#プロジェクト同様に、ステップ実行やブレークポイント、ローカル変数表示が使用可能です。

using System;

namespace ConsoleApp1
{
	// Token: 0x02000002 RID: 2
	internal class Program
	{
		// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
		private static void Main(string[] args)
		{
			string str = "P@ssw0rd";
			new byte[]
			{
				0,
				1,
				2
			}.ToString() + str;
			Console.WriteLine("Hello World!");
		}
	}
}

コード変更

今度は、下記コードを使用します。そのまま実行すると、”public information”と表示されます。

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void antiDebug()
        {
            // some process
        }

        static void Main(string[] args)
        {
            antiDebug();

            bool flag = false;
            if (flag)
            {
                Console.WriteLine("secret information.");
            }
            else
            {
                Console.WriteLine("public information.");
            }
        }
    }
}

このバイナリモジュールをdnSpyで読み込んで、右クリックから[Edit Method (C#)]を選択します。

コードを修正(antiDebug関数削除とflag反転)し、右下の[Compile]ボタンをクリックします。

メニューの[File]-[Save All]をクリックし、書き換えたバイナリモジュールを保存し、実行すると、表示結果は下記に変更されます。

secret information.

これにより、不都合な処理や条件を回避することが可能です。

まとめ

.NETアプリは、バイナリモジュールから簡単にソースコードを構成し参照・変更することが可能です。プログラム作成時には、秘密鍵やパスワードの様な重要情報を埋め込まないように十分気を付けましょう。

以上、.NETアプリの性質について紹介しました。

コメント