C# その2 Advent Calendar 2019 - Qiitaの25日目です。
C#はデスクトップアプリケーションを始めとし、サーバーサイド、モバイルなどで幅広く使われる言語です。
私の好きな言語です。
.NET Frameworkもしくは、最近広まりつつある.NET Coreと共に使われるC#のコードですが、dllからリバースエンジニアリングされてしまうという側面があります。
社内システムやサーバーサイドではまだしも、パッケージソフトなどではリバースエンジニアリングされるのは避けたいところではあります。
対策の一つが、難読化です。
アセンブリを難読化することで知的財産やセキュリティの保護を図ることができます。
Dotfuscatorで難読化
Dotfuscator Community Editionならば無料で試せるので、今回はこれを使ってみます。
Dotfuscatorをインストールしたら、難読化したいexe,dllを指定し
ビルドをクリックし、出力先を指定して開始します。
難読化すると以下のような形。
仕事でDotfuscator Professional Editionを使ったことがありますが、Professional Editionですと、さらに無駄なコードを入れたり文字列の暗号化といったことも出来るようになります。
注意としては、全てを難読化すると動かなくなります。例えばWPFのViewModelなどは難読化でBindingがうまく働かなくなります。
なので、難読化には動作確認は必須です。動かなくなる場合については除外する必要があります。
その除外についてもCommunity Editionではないと利用できないので、それなりのアプリケーションになるとProfessional Editionになりそうです。
また、.NET Coreの難読化についても対応しているようです。
シングルバイナリはどう
.NET Coreでは、シングルバイナリで出力する方法があります。
これならば、簡単に解読されないのでは?と。
csprojを以下のようにします。
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> <PublishSingleFile>true</PublishSingleFile> <PublishTrimmed>true</PublishTrimmed> </PropertyGroup> </Project>
そしてプロジェクトディレクトリで以下のコマンドを実行
dotnet publish -c Release -r win-x64 -o output
すると、
先ほどまでのデコンパイル手段では、コードすら出てこないです。いけるかもしれないです。
ただし、パッと見、気付きますが、ファイルサイズがでかいです。
簡単なコードが25.4MBになってました。