.Net ReactorでWPFアプリケーションのDLLを難読化してみる記事

いいね、悪いね、フォロー、フォロー解除、ちゃんねる登録がはげみになります。


最近はこのようなものを制作しておりまして(***WPFのTextBoxdで表示するSyntax Highliter または SpellChecker***)、なかなか開発時間取れないんだけどAIがあるので助かっています。



https://x.com/sheephuman/status/1913598432897602005

外部プロジェクトで読み込ませた場合。

https://x.com/sheephuman/status/1917974094823539197


今回は自作のDLLを難読化することで、ソースコードの流出を防ごうという記事です。生成ＡＩのせいで簡単にマネされちまうんで


# 参考

.NETで難読化を試してみる 第1回

https://taktak.jp/2012/05/17/113/

Eazfuscator.NETが個人的ランキング1位とのこと

C# ソースコードを守る　難読化ソフト

https://techlive.tokyo/archives/10082

Native EXEにするとウィルス判定されてしまうとのこと

https://qiita.com/rait0/items/4f50efc6c752374c111a

ConfuserExは　 supports .NET Framework from 2.0 - 4.8, .NET Standard, .NET Core and Mono. 
とあり、古くて使い物にならない。


# 価格
https://www.eziriz.com/order.htm

US$ 199 （現在のレートで　32,808 JPY(税込み)）

サポートは1年間受けることが可能で、その後もそのバージョンは永続的に使える、らしい。あまり明確に書いてないのでわからないです💦

Version
Update Support
Secure Ordering
7.0.0.0
1 year included
via PayPro Global




 # .Net Reactorの公式サイト
 
https://www.eziriz.com/dotnet_reactor.htm


# サポートするフレームワーク

https://www.eziriz.com/reactor_features.htm

によると
.NET 5.0-9.0
NET Framework 1.1/2.0/3.0/3.5/4.x
.NET Core 1.0-3.x
.NET Standard 1.0-2.x
.NET MAUI
.NET Portable
.NET CF 1.1/2.0/3.5
Universal Windows
Xamarin Android, iOS, Mac
Mono 1.x-6.x
WinRT/Metro
Unity 3D
Windows Phone 7/8/10

です。かなり手厚いと言える。



# 設定例を解説
※解説生成はGrokで行いました。

設定の詳細な説明は以下URLのDocumentから探してください

https://www.eziriz.com/help/index.html



| 設定項目                  | 説明                              | 効果                                |
| :----------------------- | -------------------------------: | :---------------------------------: |
| NecroBit                | CILコードを暗号化                | 逆エンジニアリングを阻止            |
| Anti ILDASM             | ILDASMによる逆アセンブル防止     | デコンパイラでのコード閲覧をブロック |
| Anti Tampering          | 改ざん防止（整合性チェック）     | 不正改変を検知し実行を阻止          |
| Control Flow Obfuscation | コードをスパゲティコード化       | ロジック解析を困難に                |
| String Encryption       | 文字列を暗号化                   | 機密情報の漏洩を防止                |
| Hide Method Calls       | メソッド呼び出しを隠蔽           | コード追跡を困難に                  |
| Anti Debug              | デバッガ検出とプロセス終了       | デバッグ解析を阻止                  |
| Obfuscation             | コード全体の難読化               | コードの可読性を低下                |
| Code Virtualization     | コードを仮想マシン命令に変換     | 直接解析をほぼ不可能に              |
| Merge Enums             | 列挙型をマージ                   | アセンブリサイズ削減と構造複雑化    |
| Create Mapping File     | 難読化マッピングファイル生成     | デバッグ用コード対応を記録          |
| Compress & Encrypt Resources | リソースを圧縮・暗号化       | リソース保護とサイズ削減            |
| Rules                   | カスタム難読化ルール設定         | 特定部分の保護を細かく制御          |


# 実際に使ってみた
今回は```.net8```で出力したDLLに難読化を掛けてみました。


1．MainAssemblyでファイル選択　→　自作DLLを読み込ませる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/f8c28e53-067c-4c05-9eb1-1744338741fb.png)


2.Quick Settings で必要な項目にCheckを付ける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/91eef558-a724-4ab7-884e-c9ab723f9455.png)

3.Protect（保護）を実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/718c3e3c-0eb4-420e-9833-9d6a900f58ad.png)

4.Lisence登録していないと
```Demo Version. The protected file(s) will stop working after 14 days.```　
と出力され14日間しか動作しない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/822ea5ec-5319-4565-96bf-df9dece6e8c8.png)

5.出力先
読み込んだDLLと同じディレクトリ上の```{ProjectName}_Secure```フォルダに出力されます。

~~名前はそのままなので、```_secure.dll```としておくと良い~~
プロジェクトがDLLのアセンブリ名に依存しているのでエラー``A null or zero length string does not represent a valid Type.``が発生してしまいました。名前はプロジェクト内で変えるしかないですね





![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/33fde882-0d2d-4a11-8077-320a7702f4a8.png)


# DLLを外部プロジェクトに登録してみた


1.Visual studio でDLLを読み込む
```依存関係```を右クリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/87e52ec1-4e97-473a-9f7b-301e67027924.png)

Usingを追加。
Dllを読み込んでから、TextBoxへの独自イベント登録とかしておく


DLLは
```プロジェクトフォルダ\ProjectName.csproj```内に
```＜HintPass＞```として設定が保存されるため、
これをプロジェクト内の全文検索で見つけると良い

今回は "SinWaveSample_secure.dll"
```xml
  <ItemGroup>
    <Reference Include="SinWaveSample">
      <HintPath>..\..\..\TestCode\SinWaveSample\SinWaveSample\bin\Debug\net8.0-windows\SinWaveSample.dll</HintPath>
    </Reference>
  </ItemGroup> 
```

defaultでは相対パス指定なので、プロジェクトがあるフォルダ内の階層限定となる(気づかなかった　笑)

この場合は```<HintPath>```内のパスをフルパスに書き換えましょう。私は```TargetProject.csproj```を直接編集しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/2b718d9f-04fb-491c-ae97-8da569936c7a.png)


このように直接フルパス指定にしておくと、元DLLのソリューションからのへんｋがすぐに反映されるためスムーズです。



# WPFのXAMLコントロールとして登録する場合

TextBoxを使用したクラスライブラリDLLの場合、既存のTextBoxにそのまま置き換えることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/680326af-46a9-408b-b2d0-5952a7333935.png)


XAMLのWindow要素に独自DLLのUsingを登録しておく
```xml:以下設定例

<Window
        xmlns:custom="clr-namespace:MakizunoUI.Controls;assembly=SinWaveSample"
```
***Textboxコントロール***

```xml:設定例
  <custom:IdleTextBox 
      IsUndoEnabled ="True"
      Width="350" Margin="10,3,0,0"
      Loaded="ParamText_Loaded"/>
```
DLLに独自イベントが登録してある場合、コード補完で出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/ededa92c-0427-43e9-8ea4-c5f36c7181e4.png)


もちろん、コードビハインドで登録もできます。


デザインビューを表示させるにはソリューションをクリーン＆ビルドします。デザインビューは閉じておくのがいいかも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/872ebd80-7098-436b-9758-da76cee5595f.png)




# 実行結果(自作品に適用)
![bandicam 2025-05-07 04-11-57-278_Harua.mp4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/82c22295-c1cd-4e08-bf82-2a4a384801e9.gif)

Ilspyで覗いた図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145714/4d726a97-f36a-427d-ae9d-3a6b9bd7abb9.png)

内部の関数に大量のダミーが配置され、解析が難しくなりました。でもクラス名とかそのままなんだよね。外部公開用のを作成して、そこで出力させるようにします。
自前で大量のダミークラス作ろうとか考えている

以下、動作した設定例。　
AntiDebugはオンにしたら動かなかったです。
　→```Xaml parse Exception```になった
他は全部オンにしても動作しました。




NecroBit true
Quick Settings True
Anti ILDASM True
Anti Tampering True
Control Flow Obfuscaton Level9
String Encryption True
Hide Method Calls True 
Anti Debug ***false***
Obfuscation True 
Code Virtualization True
Merge Enums True
Create Mapping File True
Compress & Encrypt Resources True
Rules False

# あとがき
かなり強力な設定にしましたが、動作やパフォーマンスにはさほど影響が出ませんでした(すごいですね)。投資の価値はありそうです。

いいね、悪いね、フォロー、フォロー解除、ちゃんねる登録がはげみになります。
最後までお読みいただいた方はお疲れ様です