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アプリの性質について紹介しました。
コメント
[…] dnSpy の使い方! .NET アプリのソースコード丸見え | Tech WalkIt […]