いいね、悪いね、フォロー、フォロー解除、ちゃんねる登録がはげみになります。
最近はこのようなものを制作しておりまして(WPFのTextBoxdで表示するSyntax Highliter または SpellChecker)、なかなか開発時間取れないんだけどAIがあるので助かっています。
外部プロジェクトで読み込ませた場合。
今回は自作のDLLを難読化することで、ソースコードの流出を防ごうという記事です。生成AIのせいで簡単にマネされちまうんで
参考
.NETで難読化を試してみる 第1回
Eazfuscator.NETが個人的ランキング1位とのこと
C# ソースコードを守る 難読化ソフト
Native EXEにするとウィルス判定されてしまうとのこと
ConfuserExは supports .NET Framework from 2.0 - 4.8, .NET Standard, .NET Core and Mono.
とあり、古くて使い物にならない。
価格
US$ 199 (現在のレートで 32,808 JPY(税込み))
サポートは1年間受けることが可能で、その後もそのバージョンは永続的に使える、らしい。あまり明確に書いてないのでわからないです💦
Version
Update Support
Secure Ordering
7.0.0.0
1 year included
via PayPro Global
.Net Reactorの公式サイト
サポートするフレームワーク
によると
.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から探してください
設定項目 | 説明 | 効果 |
---|---|---|
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を読み込ませる
2.Quick Settings で必要な項目にCheckを付ける
3.Protect(保護)を実行する
4.Lisence登録していないと
Demo Version. The protected file(s) will stop working after 14 days.
と出力され14日間しか動作しない。
5.出力先
読み込んだDLLと同じディレクトリ上の{ProjectName}_Secure
フォルダに出力されます。
名前はそのままなので、_secure.dll
としておくと良い
プロジェクトがDLLのアセンブリ名に依存しているのでエラーA null or zero length string does not represent a valid Type.
が発生してしまいました。名前はプロジェクト内で変えるしかないですね
DLLを外部プロジェクトに登録してみた
1.Visual studio でDLLを読み込む
依存関係
を右クリックして
Usingを追加。
Dllを読み込んでから、TextBoxへの独自イベント登録とかしておく
DLLは
プロジェクトフォルダ\ProjectName.csproj
内に
<HintPass>
として設定が保存されるため、
これをプロジェクト内の全文検索で見つけると良い
今回は "SinWaveSample_secure.dll"
<ItemGroup>
<Reference Include="SinWaveSample">
<HintPath>..\..\..\TestCode\SinWaveSample\SinWaveSample\bin\Debug\net8.0-windows\SinWaveSample.dll</HintPath>
</Reference>
</ItemGroup>
ちなみに既に何か登録してあると、<HintPath>
が新しく登録されない不具合がある(Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.13.4)。
この場合は<HintPath>
を丸ごと削除して登録しなおすと良い。私はTargetProject.csproj
を直接編集しています。
<HintPath>
はフルパスがおすすめです。
ソリューションをビルドするとエラーが出るようになるので再度登録する。
WPFのXAMLコントロールとして登録する場合
TextBoxを使用したクラスライブラリDLLの場合、既存のTextBoxにそのまま置き換えることができる
XAMLのWindow要素に独自DLLのUsingを登録しておく
<Window
xmlns:custom="clr-namespace:MakizunoUI.Controls;assembly=SinWaveSample"
Textboxコントロール
<custom:IdleTextBox
IsUndoEnabled ="True"
Width="350" Margin="10,3,0,0"
Loaded="ParamText_Loaded"/>
DLLに独自イベントが登録してある場合、コード補完で出ます。
もちろん、コードビハインドで登録もできます。
デザインビューを表示させるにはソリューションをクリーン&ビルドします。デザインビューは閉じておくのがいいかも
実行結果(自作品に適用)
内部の関数に大量のダミーが配置され、解析が難しくなりました。でもクラス名とかそのままなんだよね。外部公開用のを作成して、そこで出力させるようにします。
自前で大量のダミークラス作ろうとか考えている
以下、動作した設定例。
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
あとがき
かなり強力な設定にしましたが、動作やパフォーマンスにはさほど影響が出ませんでした(すごいですね)。投資の価値はありそうです。
いいね、悪いね、フォロー、フォロー解除、ちゃんねる登録がはげみになります。
最後までお読みいただいた方はお疲れ様です