サイバーセキュリティをイメージした背景画像

AG-TECH アプリケーション保護ガイド

.NET/MAUI 開発者必見

あなたの.NETアプリ、コンパイル後もソースコードが“丸見え”かも。

知的財産である「ソースコード」は本当に守られていますか?

1

コンパイル後もコードが復元される危険があります。

2

放置すると知財流出や収益損失のリスクが生じます。

3

難読化で解析を防ぎ、アプリを安全に保護できます。

コンパイルしたのに、なぜコードが見えるのか?

ソースコード (コンパイル前の状態) コンパイラ 中間言語 (IL) (メタデータが残った状態) デコンパイラ 復元されたコード (第三者が解読できる状態)

C#やVB.NETで開発された.NETアプリケーションをビルドすると、完全なマシン語ではなく「中間言語(IL)」と呼ばれるバイナリ形式にコンパイルされます。この「中間言語(IL)」は、クラス名・メソッド名・変数名などのメタデータがそのまま残っている点が特徴であり、可読性が高く解析されやすい状態です。

そのため、「デコンパイラ(逆コンパイラ)」と呼ばれるツール(※)を使うことで、驚くほど簡単に元のコードに近い形で復元できてしまうのです。(※デコンパイラには、たとえば「ILSpy」や「dnSpy」といったツールがあり、誰でも無料でダウンロードして利用することができます。)

【衝撃の事実】
あなたのコードはこう見える

通常のデコンパイル結果

特別な対策をしていない場合、変数名や処理の流れがほぼそのまま再現されてしまいます。

変数や処理が丸わかりの状態 private void CalculateButton_Click(object sender, RoutedEventArgs e) { decimal price = Decimal.Parse(priceTextBox.Text); decimal taxRate = 0.1m; 税率もそのまま 重要な計算ロジック decimal tax = price * taxRate; decimal totalPrice = price + tax; resultLabel.Content = $"税込価格: {totalPrice:C}"; }

上記のコードは、一般的なデコンパイラによる復元結果を分かりやすく再現したサンプルです。

コードが"丸見え"であることのビジネスリスク

知的財産の盗用

独自のアルゴリズムが競合製品にコピーされ、競争優位性の喪失や市場シェアの低下に繋がる可能性があります。

悪意のある改ざん

マルウェアを埋め込まれたり、セキュリティチェックを無効化され、顧客からの信頼失墜を招く危険性があります。

製品の不正利用

ライセンス認証のロジック解析と改変により製品が不正に利用され、収益機会の損失が発生する結果になります。

機密情報の漏洩

コードに埋め込まれたAPIキーや接続文字列などの機密情報が抜き取られ、悪用される恐れがあります。

【鉄壁の防御】
あなたのコードはこう変わる

難読化後のデコンパイル結果

難読化ツールを使うことで、変数名や処理の流れが意味のない文字列や複雑な構造に変換され、第三者による解析や盗用が極めて困難になります。

意味のない文字列に変換され解読不能 private void a(object A_0, RoutedEventArgs A_1) { 無意味なループとジャンプ命令で処理が飛ぶ while(true) { switch(1) { default: goto IL_0A; } } IL_0A: string text = "\u0092\u0001\u0094..."; $"税込価格: {totalPrice:C}"という文字列を暗号化 var num = b.c(this.a.Text); 本来の処理は、別のメソッド呼び出しの中に隠される if (num == 0) { return; } 偽の処理が追加され、ロジックが複雑化 this.b.Content = c(text, num); }

上記のコードは、一般的な難読化ツールによる効果を分かりやすく再現したサンプルです。

【詳しい解説】
難読化で何がどう変わる?

難読化されたサンプルコードを見ても、具体的に「何がどう変わったのか」が分かりにくいかもしれません。難読化ツールは、主に3つの強力な手法を組み合わせることで、元のコードを人間には解読困難な形に変換します。たとえデコンパイルされても、第三者がコードのロジックを理解し、それを盗用したり改ざんしたりすることが極めて困難になります。

1. 名前の変更
(Renaming)

メソッド名・変数名・UI要素名など、コードの意図を推測する際に手がかりとなる名前を、意味のない短い文字列に置き換えます。aという名前のメソッドが何をするのか、numという変数が何を意味するのか、これだけでは全く分かりません。

Before
(難読化前)
After
(難読化後)
private void CalculateButton_Click(...) private void a(...)
decimal price var num (役割も隠蔽)
priceTextBox this.a

2. 制御フローの難読化
(Control Flow Obfuscation)

元の「税を計算して、合計金額を出す」という単純な流れが、解読不能なスパゲッティコードに変わります。while-switchgotoといったコマンドを駆使して、本来の動作を変えることなく処理の追跡を困難にします。なお、if (num == 0)のような、本来は存在しないダミーの分岐を入れることもあります。

Q. 「税率」や「合計金額」の変数は、どこへ行ったの?

A. var num = b.c(this.a.Text); の部分に注目してください。変数taxRatetotalPriceを使った計算ロジックが b.cというメソッドの中に隠されてしまいました。攻撃者にはb.cの処理内容が分からなくなるため、「税率が10%である」という重要なビジネスロジックを読み解くことが困難になります。

3. 文字列の暗号化
(String Encryption)

コード内に直接書かれている「税込価格」のような(プログラムの機能を知る上で重要なヒントとなる)文字列を、意味のないバイトの羅列に暗号化します。この文字列は、プログラムが実行される瞬間にだけメモリ上で元の文字列に戻されるため、デコンパイルされたコードを見ても、いったい何が表示されているのか分かりません。

Q. 難読化されたコードは、本当に正しく動作するの?

A. はい、難読化は正しく設定すれば、本来の処理と同じ動作を保ちます。難読化はコードの「見た目」を変更するだけであり、コンピュータにとっては、難読化前のコードと同じ意味を持つコマンドの集まりです。なお、リフレクションやシリアライゼーションなど一部の機能に影響が出る可能性があるため、難読化後は十分なテストが推奨されます。

その保護効果を、
今すぐVisual Studioで体験。

Visual Studioに付属の「Dotfuscator Community(無料版)」をインストールして、難読化によるコード保護の効果を体験してみましょう。

"Dotfuscator Community"の簡単なインストール方法

1. Visual Studioの検索ボックス(Ctrl+Q)に「dotfuscator」と入力します。

2. 検索結果の「PreEmptive Protection - Dotfuscator のインストール」をクリックします。

3. Visual Studioインストーラーが起動したら「インストール」をクリックします。

※Community版は個人利用・評価目的に限られます。
商用利用やアプリ配布にはProfessional版が必要です。
※上記で紹介した3つの手法のうち、Community版では「名前の変更 (Renaming)」をお試しいただけます。

冊子アイコン

『難読化で本当にアプリが保護できるのか?』

この疑問に答えるブログ記事を公開中!

クラッキング(不正な解析や改ざん)を防止するために、当ページで紹介した難読化を行うことは大変有効です。公開中のブログ記事では難読化についてさらに詳しく説明しており、コード保護の重要性とその仕組みをより深く理解することができます。