より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

C#のDotfuscatorでの難読化とかシングルバイナリとか

C# その2 Advent Calendar 2019 - Qiitaの25日目です。

C#はデスクトップアプリケーションを始めとし、サーバーサイド、モバイルなどで幅広く使われる言語です。

私の好きな言語です。

.NET Frameworkもしくは、最近広まりつつある.NET Coreと共に使われるC#のコードですが、dllからリバースエンジニアリングされてしまうという側面があります。

f:id:rimever:20191225205942p:plain
.NET Coreのコードもデコンパイルできる。

社内システムやサーバーサイドではまだしも、パッケージソフトなどではリバースエンジニアリングされるのは避けたいところではあります。

対策の一つが、難読化です。

アセンブリを難読化することで知的財産やセキュリティの保護を図ることができます。

Dotfuscatorで難読化

Dotfuscator Community Editionならば無料で試せるので、今回はこれを使ってみます。

docs.microsoft.com

Dotfuscatorをインストールしたら、難読化したいexe,dllを指定し

f:id:rimever:20191225221134p:plain

ビルドをクリックし、出力先を指定して開始します。

難読化すると以下のような形。

f:id:rimever:20191225221752p:plain

仕事でDotfuscator Professional Editionを使ったことがありますが、Professional Editionですと、さらに無駄なコードを入れたり文字列の暗号化といったことも出来るようになります。

注意としては、全てを難読化すると動かなくなります。例えばWPFのViewModelなどは難読化でBindingがうまく働かなくなります。

なので、難読化には動作確認は必須です。動かなくなる場合については除外する必要があります。

その除外についてもCommunity Editionではないと利用できないので、それなりのアプリケーションになるとProfessional Editionになりそうです。

また、.NET Coreの難読化についても対応しているようです。

www.preemptive.com

シングルバイナリはどう

.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

すると、

f:id:rimever:20191225223954p:plain

先ほどまでのデコンパイル手段では、コードすら出てこないです。いけるかもしれないです。

ただし、パッと見、気付きますが、ファイルサイズがでかいです。

簡単なコードが25.4MBになってました。

参考記事

teratail.com

qiita.com