Spices.Netの製品

アセンブリにはクラスやメソッドの名前などいろいろな情報があります。このためリバースエンジニアリングが簡単に行われアセンブリのソースコードの保護ができません。そこで、Spices.Netの製品を使用することにより、ソースコードを確実に保護すること により知的財産権を守ります。

また本製品には、アセンブリを逆コンパイルして指定したソースコード(C#、VB.NET、IL、J#、Managed C++またはDelphi.NET)に変換する機能もあります。例えばVisual Basicプログラマーが、C#で作成したアセンブリをVB.NETのソースコードとして理解することが可能です。

またこの他にプロジェクトの構造を解析する機能があるので、これを使用することにより最適な設計を施したプロジェクトの作成も可能です。

9Rays.Netの製品には以下の6つのパッケージがあります。

  • Spices.VSIP.NET Suite(Visual Studio Integration Package - Visual Studioに組み込み)
    Spices.Obfuscator
    Spices.Decompiler
  • Spices.NET Suite
    Spices.Obfuscator
    Spices.Decompiler
  • Spices.VSIP.Obfuscator(Visual Studio Integration Package - Visual Studioに組み込み)
    Spices.VSIP.Obfuscator
  • Spices.Obfuscator
    Spices.Obfuscator
  • Spices.Obfuscator Console Edition(コンソールウィンドウでの使用)
    Spices.Obfuscator Console Edition
  • Spices.Decompiler
    Spices.Decompiler
    Spices.Modeler
    Spices.Informer
    Spices.Investigator
    Spices.Documenter.

各ツールの参照

参照

インデックス | Spices.Net | Spices.VSIP.Net | Spices.Obfuscator | Spices.Decompiler | Spices.Documenter | Spices.Informer | Spices.Modeler | Spices.Investigator

Copyright(c) by 9Rays.
Japanese localization by NEWTONE Corporation.


お問い合わせについて

弊社にお問い合わせされる場合は、以下の項目をお知らせいただきますようお願いいたします。

ユーザ情報
1)ユーザID(ユーザ登録後に弊社より返送されるはがきに記載されている番号 UID-XXXXXX)
2)お名前(法人登録の場合は、会社名も併せてお知らせください。)
3)ユーザ登録している電話番号、FAX 番号もしくはメールアドレス
4)有償サポート契約を結ばれている方は契約番号

製品に関する情報
1)製品名
2)バージョン
3)製品のシリアルNo.
4)DLL ファイルのタイムスタンプ

開発環境及び使用機器に関する情報
1)OS
2)開発コンテナ

ご質問の内容
どのようにしたらその症状が発生するのか、あるいはどのような事柄が聞きたいのか、できるだけ簡潔にご説明ください。文章で説明するのが難しい場合は、再現性のあるプログラムをメールにて添付していただいた方がよりスムーズに解決する場合もございますので、その場合はプログラムをLZH もしくはZIP 形式で圧縮していただき、お送りください。
また、製品とは関係のないプログラミング技法やWindowsAPI などに関するご質問にはお答えいたしかねますので、予めご了承ください。

問い合わせ先
「お使いになる前に」(パッケージ版は同梱の折込案内、ダウンロード版は別のPDF ファイル)のサポートについてをご覧ください。

注意
1開発者ライセンスはユーザ登録された方がサポート対象となります。


Spices.Netのライセンス認証について

Spices.Netのライセンス認証の方法

  1. Spices.Netを起動します。
  2. [ヘルプ]メニューの[ライセンス認証コードの取得]をクリックします。
  3. [ライセンス認証コードの取得]ダイアログに名前とメールアドレスを入力します。
  4. [送信]ボタンをクリックして直接9Rays.Netのサイトに送信して下さい。

Spices.Obfuscator Consoleのライセンス認証の方法

  1. コンソールウィンドウを起動します。
  2. インストールフォルダーの\9Rays.Net\SpicesNet5\Binに移動します。
  3. NRObfuscator.exe /REG >out.txt を実行します。
    (例：C:\Program Files\9Rays.Net\SpicesNet5\Bin\NRObfuscator.exe /REG >out.txt)
  4. 生成されたout.txtを9Rays.Net Supportまで送信してください。

メモ: [ライセンス認証コードの取得]ダイアログは、お客様のOSを識別するための独自のキーを送信するだけで、個人情報が送信されることはありません。[ライセンス認証コードの取得]ダイアログの内容を送信するには、9Rays.Net Supportをクリックしてください。

ライセンス認証コードファイル(NineRays.License.dll)が届いたら、Spices.NetがインストールされているフォルダのBinフォルダ(通常C:\Program Files\9Rays.Net\Spices\Bin)に保存してください。

メモ: Spices.Netが実行中であれば終了してから、NineRays.License.dllをBinフォルダに保存してください。


目次

  • ヘルプの概要
  • はじめに
    • Spices.Netのライセンス認証について
    • アセンブリの閲覧
    • Spices.Netの設定
    • プラグインの管理
    • アセンブリ/.iloprjファイルのオープン
    • .iloprjファイルとは？
    • .ilomapファイルとは？
    • 難読化マップの作成
    • 難読化マップのプレビュー
    • 難読化
    • 検証と解析
    • メンバの検索
    • 参照アセンブリの解決
    • 逆アセンブル/逆コンパイル
    • 難読化をコードで設定
    • スタック トレースのメッセージの可読化
    • Spicesのタスクの管理
    • 概要
      • Spices.Netの特徴
      • Spices.Netのツール
      • Spices.Netの製品構成
      • Spices.VSIP.Net
      • Spices.Obfuscator
      • Spices.Decompiler
      • Spices.Documenter
      • Spices.Modeler
      • Spices.netの製品の機能一覧
      • Spices.Net
        • 設定
        • エクスプローラ
        • プロパティ
      • Spices.VSIP.Net
        • Spices.VSIP.Netの機能
        • Spices.VSIPの登録/解除
        • 難読化に必要なプロジェクトの設定
      • Spices.Obfuscator
        • 概要
        • 実行
        • オプション
        • Spices.Anonymizerの使用によるアセンブリの保護
        • AntiILDASM機能
        • 難読化について
          • .Net アセンブリを難読化する理由
          • .NETで難読化がどのように行われるか?
          • アセンブリの難読化でよく使われる手順
          • リフレクション(Reflection)と難読化
          • アセンブリの難読化のポイント
          • 難読化されたアセンブリへのコードの記述
        • Spices.Obfuscatorのプロパティの設定
        • Spices.Obfuscatorの使用
        • 難読化に関するプロジェクト設定
        • 難読結果の表示
        • 文字列のプロテクト機能
        • Obfuscatorのコンソールを使用
        • 難読化されたアセンブリのデバッグ
        • アセンブリのリソースのローカライズ
        • MSBuildの統合
          • Obfuscator タスク
          • AssemblyVerify タスク
          • ConsistencyCheck タスク
          • AssemblyResign タスク
      • Spices.Decompiler
        • 概要
        • 実行
        • 使用
        • オプション
      • Spices.Documenter
        • 概要
        • 実行
        • 使用
      • Spices.Informer
        • 概要
        • 実行
        • 使用
      • Spices.Modeler
        • 概要
        • 実行
        • 使用
      • Spices.Investigator
        • 概要
        • 実行
        • プロパティ
        • PE/メタデータの閲覧
      • How to's
        • Spices.Netにプロジェクトをロードするには
        • プロジェクトにアセンブリを追加するには
        • プロジェクトからアセンブリを削除するには
        • メソッドを逆アセンブルすには
        • コールグラフを表示するには
        • アセンブリリソースを表示するには
        • アセンブリリソースを取り出すには
        • アセンブリメンバを検索するには
        • exe/dllのマネージド リソースを隠すには
        • アセンブリに他のアセンブリを組み込むには
        • 新しい形式と互換性を持たせるために.iloprjプロジェクトの形式を変更するには
        • アセンブリブラウザにアセンブリを表示させないようにするには
        • アセンブリリンカでアセンブリを使用させないようにするには
        • 選択したメンバに関連するトークン値を検索するには
        • トークンでアセンブリメンバを検索するには
        • 処理速度を上げるには
      • FAQ (よく聞かれる質問)
        • Spices.Obfuscatorで.NETアセンブリを難読化すると、その難読化されたアセンブリはどこに保存されますか？
        • Spices.Obfuscatorにはコマンドライン インターフェイスがありますか？
        • Spices.Decompilerにはコマンドライン インターフェイスがありますか？
        • Spices.Netでの逆コンパイルからアセンブリを守るには？
        • Spices.Obfuscatorを使用してASP.Netのコードビハインド DLLを難読化できますか？
        • Spices.Obfuscatorを使用してスマート デバイス アプリケーションを難読化できますか？


アセンブリの表示

.NETのアセンブリまたはプロジェクトファイル(.iloprj)をオープンすると、左のエクスプローラの欄にアセンブリ クラスの階層構造をあらわすツリーが表示します。プロジェクトにはエクスプローラタブとプロパティタブがあります。

「エクスプローラ」タブをクリックすると、名前空間、クラスとメソッド、リソースと参照されたアセンブリが表示されます。

「プロパティ」タブをクリックすると、カレントのプロジェクトのプロパティの表示や管理が行えます。

Bookmarks機能は、カレントのメンバをProject.Bookmarksコレクションに保存するので、後でこのメンバを選択できます。Bookmarksコレクションをプロジェクト ファイルに保存できます。

参照


Spices.Netの設定

[編集]メニューの[オプション]を選択すると、次のダイアログボックスが表示され、Spices.Netの設定を行うことができます。

  • DefaultSaveToDirectory - 難読化したアセンブリを保存するデフォルトのフォルダを指定します。
  • DefaultStrongNameKeyFile - 難読化したアセンブリに署名する、デフォルトの厳密名のキーファイルを指定します。
  • DefaultWorkDirectory - プロジェクトファイルやアセンブリを オープンするフォルダや、プロジェクトファイルを保存すフォルダをデフォルトとして指定します。
  • Syntax Settings - テキストの強調表示や色、インデントを設定します。この機能は、Preferences.SyntaxHighlight = Trueの場合に有効になります。

参照


プラグインの管理

下記はSpices.Netを構成しているプラグインです。
[ツール]メニューの[プラグインの管理]を選択してください。

通常、プラグインの追加や削除など行う必要はありません。

プラグインの設定

プラグインのプロパティを編集することもできます(プラグインのプロパティを編集できない場合は、Propertiesボタンはグレー表示されます)。
プラグインのツリーからプラグインを選択し、[プロパティ]ボタンをクリックすると編集ダイアログが表示されます。

プラグインのプロパティが編集可能な場合、[プロパティ]ボタンが有効になり、下図のように編集ダイアログを開くことができます。

参照


アセンブリ/.iloprjファイルのオープン

[ファイル]メニューの[開く]をクリックするか、ツールバーの[ファイルを開く]のアイコンをクリックすると、ファイルを選択するダイアログが表示されます。[ファイル]メニューから最近使ったファイルを選択することもできます。

参照


.iloprjファイルとは?

.iloprjは、XML形式で保存されたプロジェクトファイルです。

参照


.ilomapファイルとは?

.ilomapは、難読化プロセスの結果がXML形式で保存されるファイルです。
難読化プロセスを繰り返し行う場合や、既に作成してある難読化マップを参照して難読化を行うことができます。
また難読化マップは、難読化履歴を復元することによりバグの発見に役立ちます。
難読化マップでメンバを検索するには、[編集]メニューの[検索]をクリックしてください。

参照


難読化マップの作成

アセンブリの難読化マップを作成するには、下記の手順に従ってください。

  1. アセンブリを開く。複数のアセンブリの難読化マップを作成する場合は、対象のアセンブリをプロジェクトに追加してください。
  2. プロジェクトのプロパティを作成します。
  3. Project.ExportObfuscationMapFileで、作成した難読化マップを保存するファイルを選んでください。
  4. アセンブリを難読化しま。 - Spices.NetのObfuscatorが難読化マップを作成して、選択したファイルに保存します。

難読化マップを使用する際の注意:
名前が重複しないようにするには、完全なアセンブリのセット(すべての参照アセンブリを持つプロジェクト アセンブリ)で難読化マップを作成してください。

参照


難読化マップのプレビュー

難読化マップを表示するには、[ファイル]メニューの[開く]をクリックし、ロードする.ilomapを選択してください。
ウィンドウに難読化マップのメンバが表示されます。

参照


難読化

.NETのアセンブリを開いて、難読化を行います。

  1. [ファイル]メニューの[開く]、またはツールバーから[ファイルを開く]のアイコンをクリックし てください。[ファイルを開く]ダイアログが表示されるので、そこからファイルを選択してください。また、[ファイル]メニューの[最近使ったファイル]を使用して選択することもできます。
  2. ファイルが有効な.NETのアセンブリの場合、Spices.Netはプロジェクトを作成します。ファイルがProject (.iloprjファイル)の場合は、プロジェクトを開くと、エクスプローラタブはアセンブリのクラス階層構造のツリーを表示します。
  3. エクスプローラのツリーを展開し、クラスまたはメンバを選び、次のどれか1つを選んでアセンブリを難読化してください。
    1. [ツール]メニューから[難読化!]を選ぶ。
    2. ツールバーの[難読化!]ボタンをクリックする。
    3. または、F8を押す。
    また、作成した/開いたプロジェクトの管理も行えます:プロジェクトのプロパティタブをクリックすると、読み込んだアセンブリ への除外や置き換えを追加したり、難読化メンバの編集、プロジェクトにアセンブリを追加/削除したり、難読化マップのインポート、ファイル名を設定して難読結果をエクスポート...などを行うことができます。
  4. 難読化を行った後に、その処理結果を外部のブラウザに表示することもできます。

参照


検証と解析

難読化したアセンブリの検証や難読化したアセンブリとソースアセンブリとを比較することができます。
[ツール]メニューの[アセンブリの検証]、または[ツール]メニューの[全アセンブリの検証]をクリックして、検証結果を確認してください。

尚、プロジェクトのVerifyAfterObfuscationプロパティをTrueに設定すると、難読化終了後、自動的に難読化されたアセンブリを検証します。

参照


メンバの検索

アセンブリブラウザ内、Spices.Netの難読化マップやテキスト出力エレメントなどでメンバを検索できます。

検索方法には以下の2つあります。

１)アセンブリメンバ名による検索

  1. [編集]メニューの[検索]を選んでください。プロジェクトの[検索]ダイアログが表示されます。
  2. 「検索する文字列」ボックスに検索する語句を入力します。
  3. 検索オプションを設定します。
    • 検索する文字列を指定するには、テキストボックスに入力してください。
    • 完全なアセンブリメンバ名(全語)を検索するには、全語にチェックを付ける/外します。
    • 大文字と小文字が指定されているアセンブリメンバ名を検索するには、大文字・小文字の一致にチェックを付ける/外します。
  4. 検索ボタンを押します。該当するメンバが見つかった場合、検索一覧に表示されるので、それをクリックするとメンバに移動できます。

また、検索ダイアログをドッキングすることもできます。

2) トークン情報による検索:

メモ: Spices.Informer.netのプラグインをインストールする必要があります。

  1. アセンブリブラウザから検索したいメンバのアセンブリを選択してください。

  2. メニューのトークン情報またはShift+F2をクリックしてください。
  3. 検索したトークンの値(hex value: 0x0200000d, 200000d)をダイアログ ウィンドウに入力してください。
  4. トークンに関連付けられているアセンブリメンバを検索するには、情報入力ボタンをクリックしてください。

参照


参照アセンブリの解決

最初の難読化で、プロジェクトの全ての全参照アセンブリが解決されます。解決されていないアセンブリがあればSpices.Netが問い合わせるので、アセンブリファイルを選択してください。
Spices.Net Settings.Preferences.AddResolvedAssembliesToProjectがTrueの場合、プロジェクトに 参照の解決結果が保存されます。

アセンブリを解決するには下記の3つ方法があります。

  1. .Net Frameworks (1.0, 1.1 および CompactFramework .Net 1.0) に必要な全てのパスと依存するパスをSettings.SearchPathsに追加します。
    メモ: Spices.Netは、.Net 1.x および Compact Framework .Net 1.x のコアライブラリへのパスを自動認識して、Settings.SearchPathsに追加しようとします。
    例:
    • C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE - コンパクト フレームワーク アセンブリへの標準パス
    • C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705 - .Net Framework SDK 1.0 アセンブリへの標準パス
    • C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322- .Net Framework SDK 1.1 アセンブリへの標準パス

  2. 手動で依存するアセンブリをSpices.Net.Project .Referencesに追加する。

  3. 必要に応じて手動でアセンブリ名を解決する。

注意: ライブラリの参照は慎重に行ってください。Spices.Netはmscorlib.dllや別のsystem dllが必要な場合があるので、慎重にアセンブリを選択してください。それ以外は"Token not resolved"エラーが発生します。

メモ:

  1. Spices.Net.Settingsの全パスは、Spices.Netアプリケーションの相対パスで保存されます。
  2. プロジェクト内の全パスはプロジェクトの相対パスで保存されます。保存されなかったプロジェクトは絶対パスとして全パス情報を含んでいます。

参照


逆アセンブル/逆コンパイル

エクスプローラのツリー表示を展開し、クラスまたはメンバを選択します。そのクラスを逆アセンブルするには、下記のように行います。

  1. [ツール]メニューの[逆アセンブラ]をクリックする。
  2. ツールバーの[逆アセンブラ]ボタンをクリックする。
  3. F5を押す。
    4. もしくは、
  4. エクスプローラのツリーのメニューから[逆アセンブル]コマンドを選ぶ。

参照


難読化をコードで設定

特別な属性を使用して、コードでクラス、フィールド、メソッド、プロパティ、またはイベントを設定することができます。プロジェクトに小さなクラスを追加して、 コードで難読化の属性を設定します。また、難読化を行うオブジェクトを直接コードで指定することもできます。

これを行うには、小さな属性クラスを使用する必要があります。..\SDK\Obfuscation Attributesのフォルダ内のファイルを プロジェクトに組み込んで使用してください。
C# - ObfuscatorAttrs.cs
VB.Net - ObfuscatorAttrs.vb
Delphi.Net - ObfuscatorAttrs.pas

下記の新しい属性は、プロテクト強化のために追加されました。

  • NineRays.Decompiler.NotDecompile - クラスまたはアセンブリに添付され、そのクラスまたはアセンブリがSpices.Decompilerで逆コンパイルされないようにします。
  • NineRays.Obfuscator.NotObfuscateMembersAttribute - 指定した属性型の文字列に該当するクラスを難読化の対象から除外することができます。
    メモ: この属性を添付した属性型文字列は、アセンブリを解析するためだけに使用されます。解析は、条件付きのメンバ名(フルネーム)に基づいて行われます。


スタック トレースのメッセージの可読化

難読化されたアセンブリのスタック トレースを迅速に解析するには、[スタック トレースの可読化] ツールを使用してください。
プロジェクトをロードして、[ツール]メニューの[スタック トレースの可読化]、またはツールバーの可読ボタンをクリックするだけで行えます。

スタック トレースのテキストをスタック トレースのテキストボックスに貼り付けて(このツールはスタック トレースからの呼び出し情報を取得します)、可読化ボタンをクリックするだけです。
コールグラフは、下にツリー表示で表示され、スタック トレースの呼び出し一覧に含まれるノードは赤い色で表示されます。

メモ: スタック トレースの情報が完全に一致しない場合(例:返された型が呼び出されたメソッドの型ではない場合あるいは記述されていない場合)、このツールは似たような呼び出し変数をすべて検索するので、コールグラフを解析して最適な変数を選択できます。

参照


Spicesのタスクの管理

逆コンパイル、難読化、NRDocのビルドなど、Spices.Netを操作する際には必ずタスクが作成されます。Spices.Netのタスク一覧からすべてのタスクを表示して 、状態を把握することができます。この一覧を開くには、[表示]メニューの[タスク一覧]を選択するか、CTRL+ALT+Tを押し てください。

タスク一覧は、下記のようにSpices.NETのタスクに関する情報を表示します。

  • Task name - 難読化、逆コンパイルなど。
  • Task document - 実行中のタスクの構成要素
  • Task progress - パーセントでのタスクの経過
  • Task status - 実行中、終了、または失敗。
  • タスクの優先度
  • タスクの開始/終了時間。

一番左側にある３つのアイコンはタスクの状態を示し、これによりタスク状態を制御することができます。

  • 実行中で、終了することができます。終了するには、このアイコンをクリックしてください。
  • 中断していて、再開することができます。再開するには、このアイコンをクリックしてください。
  • 実行中で、一時停止できます。一時停止するには、このアイコンをクリックしてください。
タスクを右クリックしてメニューを表示し、一時停止、終了、または再開させてください。タスク一覧から終了済みのタスクを削除したり、選択したタスク情報をクリップボードにコピーすることもできます。

参照


概要

MSD2D People's Choice 2005

Spices.NETは、権威ある2005年MSD2DのPeople’s Choice賞のCode Tools部門を受賞しました。

MSD2Dの年間People's Choice賞(.NET開発者向けの最大オンライン コミュニティ ソース)は、この業界のオスカーと見なされた製品に送られ、この業界で最も権威ある賞です。

Microsoftの.NET Frameworkでプログラミングすると、さまざまな機能を使用して豊富なアイデアを実現させることができますが、Microsoftの中間言語(MSIL)へのコンパイル に大きな欠点があるのも事実です。そのため、コードがサード パーティから逆アセンブル、調査、変更される場合があります。Spices.Netは、専門的な外観や感性を備えたクラス ブラウザであり逆アセンブラです。Spices.NetはSpices.DecompilerやSpices.Obfuscatorと 一緒に動作し、コンソールモードのNRObfuscatorも含んでいます。更に、Spices.Netはコードの解析、検証、モデル構築のためのさまざまなサービスも提供しています。

  • 知的財産を侵害されないために、Spices.NetバージョンのSpices.OfuscatorやSpices.Obfuscatorのコンソール バージョンといった究極のソリューションを提供します。弊社のantiILDASM機能を使用すれば、アプリケーションを逆アセンブルされることはありません!
  • Spices.Decompilerは、IL(MicrosoftのILDASMユーティリティと同じ機能)、C#、C++、VB.Net、J#、Delphi.Netの6言語の逆コンパイル機能を提供しています。うまく構成され、アウトライン表示されたコードをファイルに逆コンパイルしたり、構文強調、アクティブヒント、コードの折りたたみ表示などを使用して専門的な外観のエディタに表示することができます。
  • Spices.Documenter - ソースコード外へのドキュメンテーションの作成や管理プロセスが大幅に改良され、より使い易くなりました。
  • Spices.Informer - アセンブリブラウザのカレントのメンバの詳細レポートを作成するプラグインです。
  • Spices.Investigator - 低レベルでの.Netアセンブリの調査の手助けをするプラグインです。このプラグインを使用することにより、ヘッダー、セクション、ディレクトリ、メタデータ テーブルやストリームといったPE形式のエレメントを閲覧でき、読込可能な形式で内容を表示できます。
  • Spices.Modeler - プロジェクトのアセンブリに関するさまざまなダイアグラムの構築、設計、読込/保存の手助けをするプラグインです。

参照


Spices.Netの特徴

Spices.Netは、.Netアセンブリの難読化や解析を行うGUI環境です。
Spices.Netは、.Net 1.0、.Net 1.1、.Net 2.0、Compact Framework .NETに対応しています。
Spices.Netのメタデータへのアクセスエンジンは、System.Reflectionの制限を受けません。
Spices.Netのメタデータへのアクセスエンジンは、ilasm/ildasmに依存しません。

Spices.Netは、いろいろなプラグインで構成されています。詳細は下記の通りです。

  • Spices.Netのツール
  • Spices.VSIP.Netの機能
  • Spices.Obfuscatorの機能
  • Spices.Documenterの機能

参照


Spices.Netのツール

Spices.Netは、.Netアセンブリの表示、解析、モデリング、ドキュメンテト作成、プロテクト、リバース エンジニアリングのための多数のツールを提供しています。
ツール | 必要なプラグイン
Spices.Netのプロジェクト管理(アセンブリの追加/削除、難読化オプションの編集、プロジェクトの作成と編集) | Spices.Net、内部プラグイン
アセンブリの表示 | Spices.Net 内部プラグイン
アセンブリからテキストやグラフィックリソースの取り出し | Spices.Net、内部プラグイン
整合性の検査 | Spices.Net、内部プラグイン
アセンブリメンバのILコードへの逆アセンブル | Spices.Net、内部プラグイン
アセンブリのメンバの検索 | Spices.Net、内部プラグイン
アセンブリの検証 | Spices.Net、内部プラグイン
アセンブリの再署名 | Spices.Net、内部プラグイン
難読化されたアセンブリのスタック トレース | Spices.Net、内部プラグイン
Spices.Obfuscatorによって作成された難読化マップのオープンと解析 | Spices.Net、内部プラグイン
選択したメンバの詳細情報の取得 | Spices.Net、Spices.Informer
指定したトークンに関する詳細情報の取得や、そのトークンに関連するアセンブリメンバの検索 | Spices.Net、Spices.Informer
継承表示ツール: クラスの継承ツリーのビルド | Spices.Net、Spices.Informer
実装表示ツール: インターフェイスの実装ツリーのビルド | Spices.Net、Spices.Informer
メンバの利用統計ツール: アセンブリやプロジェクト内でのメンバの利用統計に関する情報の取得 | Spices.Net、Spices.Informer
バイナリビューア ツール | Spices.Net、Spices.Investigator
メタデータ/PE Structureの閲覧 | Spices.Net、Spices.Investigator
メタデータとPE Structure Detailsのダンプ | Spices.Net、Spices.Investigator
MS Visual Studioとの統合 | Spices.Net、Spices.VSIP.Net
逆コンパイル(6つのプログラミング言語) | Spices.Net、Spices.Decompiler
難読化やリバース エンジニアリングからの保護 | Spices.Net、Spices.Obfuscator
モデルおよびダイアグラム ツール | Spices.Net、Spices.Modeler
ソース外でのコード ドキュメントの管理 | Spices.Net、Spices.Documenter

参照


Spices.Netの製品構成

Spices.Netの各バージョンです。

  • Spices.VSIP.NET Suite - Spices.Obfuscator、Spices.Decompiler、Spices.Modelerが含まれています。 Spices.VSIP.Netは、Visual StudioにSpices.Netが統合されて使用できます。
  • Spices.NET Suite - Spices.Obfuscator、Spices.Decompiler、Spices.Modelerのプラグインが含まれています。
  • Spices.VSIP.Obfuscator- Spices.Obfuscatorとサービス プラグインが含まれています。Spices.VSIP.Netは、Visual StudioにSpices.Netが統合されて使用できます。
  • Spices.Obfuscator - Spices.NetとSpices.Obfuscatorのプラグインが含まれています。
  • Spices.Obfuscator Console - NRObfuscator(コンソールモードのObfuscator)のみ含まれています。
  • Spices.Decompiler - Spices.NetとSpices.Decompilerが含まれています。

    メモ 1: Spices.Netの体験版には、難読化されるメンバの数に制限があります。
    メモ 2: Spices.Netの体験版には、全プラグインとSpices.VSIP.Netが含まれています。
    メモ 3: Spices.Decompiler.Netの体験版は最適化されたコードを生成しません。また式や命令文をランダムで体験版 の文字列に置換します。
    メモ 4: Spices.Netの全バージョンには、Spices.InformerとSpices.Investigatorが含まれています。
    メモ 5: Spices.Modelerは、体験版のSpices.Netと、製品版のSpices.Net DecompilerとSpices.Net Suiteに含まれています。

参照


Spices.netの製品の機能一覧

製品 | Spices.VSIP.Net Suite | Spices.Net Suite | Spices.VSIP.Obfuscator | Spices.Obfuscator | Spices.Obfuscator Console Edition | Spices.Decompiler
Decompiler | ○ | ○ |  |  |  | ○
Obfuscator | ○ | ○ | ○ | ○ |  |
Obfuscator Console | ○ | ○ | ○ | ○ | ○ |
Localizer | ○ | ○ | ○ | ○ |  | ○
Visual Studio 2003/2005 Integration | ○ |  | ○ |  |  |
Automation | ○ | ○ | ○ |  |  |
Informer | ○ | ○ | ○ | ○ |  | ○
Investigator (PE/Metadata Low Level) | ○ | ○ | ○ | ○ |  | ○
Modeler | ○ | ○ | ○ | ○ |  | ○
Documenter | ○ | ○ | ○ | ○ |  | ○

参照


Spices.Net

Spices.Netは、GUIの環境で.Net アセンブリの閲覧、解析、難読化、逆コンパイルを行います。

Spices.Netを使用して、プロジェクトの作成や編集、アセンブリの閲覧、アセンブリメンバの逆アセンブル、アセンブリのテキスト/バイナリ/グラフィック リソースの表示、メソッドの 呼び出しのグラフ表示、アセンブリメンバの検索、難読化マップ(.ilomap)の表示が行えます。

Spices.Netは、Spices.Netプロジェクト(.iloprj)、 難読化マップ(.ilomap)、実行可能ファイル(.exe、.dll)、モジュール(.mod) といった形式をサポートしています。

参照


Spices.VSIP.Net

Spices.VSIP.Net (Spices.Net Visual Studio Integration Package) は、Spices.NetをMicrosoftのVisual Studioに統合して使用することもできます。
Spices.VSIP.Netには、Spices.Netの全ての機能があり、更に難読化したアセンブリのデバッグや配布をサポートする機能もあります。

参照


Spices.Obfuscator

Spices.Obfuscatorは、リバース エンジニアリングから知的財産を守ります。

Spices.Obfuscatorの主な機能は下記の通りです。

  1. 可能なメンバ名をすべて意味のない名称に変更します。
  2. アセンブリをリバース不可にすることにより、ILDASMやその他のリフレクションユーティリティ(例:逆コンパイラなど)の逆アセンブルから守ります。
  3. 相互難読化処理により、難読化が強化されます。
  4. ローカライズ機能により言語別に文字列を設定して難読化が出来ます。
  5. 勿論、Spices.Decompilerからも守ります。
  6. デバッグ可能なアセンブリを提供します。
  7. Spices.VSIP.Net Obfuscatorは、ビルド-難読化-検証プロセスを完全に統合した環境で実行できます。
  8. 100%マネージド コード (C#やmanaged C++)!

  9. サポート環境:
    • C#、J#、VB.Net、managed C++の拡張子
    • ASP.Net
    • Delphi.Net、C# Builderのアセンブリ
    • .Net Framework 1.0と1.1、 .Net Compact Framework
  10. GUI環境によるプロジェクトの作成や管理
    • アセンブリのナビゲート
    • プロジェクトのプロパティ変更 (プロジェクトの変更)
      • プロジェクトのアセンブリの追加と削除
      • 難読化オプションの変更
      • ハードディスクへのプロジェクト保存
      • 独自のプロジェクト管理エディタの作成
      • 置き換えのためのオブジェクトの追加
      • 難読化から除外するためのオブジェクトを追加
    • プロジェクトの難読化の経過を確認しながら処理が行える。
  11. 新機能:
    • デバッグ可能なアセンブリの提供
    • 難読化された名前や自動生成されたリソース名を使用してアセンブリのマニフェストを更新する
    • 名前を生成する新しい方法 – 表示不可能な記号で名前を生成するので、難読化されたアセンブリを一般的なアセンブリブラウザでのプレビューや、アセンブリリンカ(al.exe)での使用から守ります。
    • (.iloprj XML-ファイル) は、難読化を行っている最中に複数のアセンブリと動作できます。
    • 相互難読化: この新機能は全アセンブリメンバが難読化されることによる理想的な難読化プロジェクトが取得できます (最大数のアセンブリ メンバを難読化できます)。
    • 対象除外
    • 置き換え
    • 難読化マップの提供
    • 最適化

参照


Spices.Decompiler

Spices.Decompilerは、アセンブリの逆コンパイラで、6つのプログラミング言語で出力できます。

  • IL (ILDASMの中間言語)
  • C#
  • VB.Net
  • Delphi.Net
  • J#
  • C++ (Managed C++)

Spices.Decompilerは、ソースコードを強調表示し、書式付きの構文を作成します。

メモ: 体験版は最適化されたコードを作成しません。また式や命令文をランダムで体験版予告に置換します。

参照


Spices.Documenter

Spices.Documenterはコードに関連するドキュメントの作成や管理を容易に行います。

メモ: Spices.Documenterの体験版では、ドキュメントの半分だけがXMLにエクスポートできます。

参照


Spices.Modeler

Spices.Modeler Diagram List

Spices.Modelerは、プロジェクトのダイアグラムの構築します。

Spices.Modelerのダイアグラム機能は、下記の通りです。

  • エレメントの配置、移動/ドラッグ、削除
  • エレメントの選択の拡張
  • エレメントの入力/出力の強調表示
  • コンテナエレメントの折りたたみ表示/アウトライン表示
  • ダイアグラムのズーム
  • ダイアグラムの印刷
  • ダイアグラムを(ラスタまたはベクタ)イメージまたはXML形式で保存
  • XML形式で保存したダイアグラムをSpices.Modelerに読込む

参照


Spices.Net

Spices.Netの主な機能

主な機能を下記に示します。

1.難読化
アセンブリ大切なソースコードを保護します。

2.逆コンパイラ
アセンブリから指定したプログラミング言語でソースコードを生成します。

3.アセンブリの解析
アセンブリの構造体、メンバ、型やメソッドの解析が行えます。

4.ドキュメンタ
プロジェクトの構成図等の作成を行うことにより、プロジェクトの管理やロジックの検証が簡単に行えます。

5.ローカライザー
アセンブリのリソースの文字列を言語別に設定して難読化が行えます。

  • 参照


設定

[編集]メニューの[オプション]を選択して、[オプション]ウィンドウを開いてください。

プログラム設定:

  • DefaultSaveToDirectory - 難読化されたアセンブリを保存するデフォルトのフォルダを指定します。
  • DefaultStrongNameKeyFile - 難読化されたアセンブリを署名するためのデフォルトの厳密名のキーファイルを指定します。
  • DefaultWorkDirectory - プロジェクト ファイルやアセンブリを開いたり([ファイル]->[開く])、プロジェクト ファイルを保存([ファイル]->[上書き保存]または[名前を付けて保存])するためのデフォルトのフォルダを指定します。
  • InfoFont - 出力ウィンドウのフォントを指定します。
  • Preferences - さまざまなオプションを指定します。
    • AssociateExecutablesWithSpices - 実行可能ファイル(.dllや.exeファイル)とSpices.Netを関連付けて、Spices.NetからWindows Explorerの実行可能ファイルを開くことができます。
    • IgnoreVersionOfAssemblyOnResolve - アセンブリの変換時にアセンブリのバージョンを無視します。
    • SaveProjectBeforePluginAction - プラグインがコマンドを実行する前にプロジェクトを保存します。
    • AddResolvedAssembliesToProject - 変換したアセンブリを自動的にSpices.Net.Project .Referencesの一覧に追加します。このオプションは、変換したバージョン結果を保存でき、それを次回プロジェクトを使用する際に使うことができます。 Project.Referencesの一覧を編集してアセンブリの変換結果を変更することもできます。
    • LoadLastUsedFileAtStartup - 最近使ったファイル(.iloprj、.ilomap、実行可能ファイル)をロードします。
    • SyntaxHighlight - 構文テキストを強調表示させる色やインデントを編集できます。Settings.Syntaxプロパティで出力エレメントの色を定義できます。
  • RecentFilesCapacity - [ファイル]メニューの[最近使ったファイル]の一覧に表示されるファイルの数を指定します。
  • SearchPaths - 参照されたアセンブリを検索するためのパス コレクションを指定します。
  • Syntax - テキストの色やインデントを定義します。

参照


エクスプローラ

エクスプローラ タブから、アセンブリのナビゲートやアセンブリをプロジェクトに追加/削除できます。

エクスプローラタブのAssemblyBrowserコントロールには独自のポップアップ メニューがあります。これを使用して、プロジェクトにアセンブリを追加/削除できます(これを行うには、アセンブリのノードを選択し、ポップアップ メニューを開いて、メニューからコマンドを選択してください)。

また、ノードの検索、全ノードの折りたたみ/展開表示を行ったり、このプロジェクトの除外/置き換えリストにメンバを追加することもできます。

参照


プロパティ

「プロパティ」タブには、カレントのプロジェクトの設定が含まれています。

  • AssemblyList - プロジェクトにロードされたアセンブリ コレクションや各アセンブリの個別の難読化オプションを含んでいます。
  • Excludes - 難読化から除外されたアセンブリメンバのコレクションを含んでいます。
  • ExportObfuscationMapFile - 難読化マップのエクスポートに使用されるファイル名を含んでいます。
  • SaveToDirectory - obfuscatorで処理されたアセンブリが保存されるフォルダのパスを含んでいます。
  • StrongNameKeyFile - アセンブリの署名に使用する厳密名のキーファイルを含んでいます。
  • Substitutions - 難読化中に置換(リネーム)されるアセンブリメンバのコレクションを含んでいます。
  • References - 難読化中にアセンブリの変換に使用される参照アセンブリへのパスのコレクションを含んでいます。
  • OptimizeAfterObfuscation - 難読化後にアセンブリのサイズを最適化します。
  • VerifyAfterObfuscation - 難読化後にアセンブリ(PE、IL、メタデータ構造体)を検証します。
  • IgnoreVersionOfAssemblyOnResolve - アセンブリの変換時に、アセンブリのバージョンを無視します。

参照


Spices.VSIP.Net

Spices.VSIP.Net(Visual Studio Integration Package)は、Spices.NetをMicrosoftのVisual Studioの開発環境に統合するパッケージです。
このパッケージには、Spices.Netの全ての機能が含まれています。

  • Spices.VSIP.Netのメニュー

  • プロジェクト アセンブリの表示

  • Spices.Projectのプロパティ

  • Spices.Modeler

  • Spices.Netのプロパティの設定

参照


Spices.VSIP.Netの機能

Spices.VSIP.Net(Visual Studio Integration Package)の機能は下記の通りです。
機能 | 内容
全ての機能や利点をMicrosoftのVisual StudioのIDEに設定する | Spices.VSIP.Netは、Spices.Netの機能をMicrosoftのVisual Studioの開発環境に 統合して使用するパッケージです。
CSharpおよびVB.Netのプロジェクト型をサポート | Spices.Netは、CSharpおよびVB.Netのプロジェクト型をサポートします。
ビルドのプロセスへの統合 | Spices.VSIP.Net Obfuscatorは、プロジェクトのビルドに連動し、ビルドが成功するとアセンブリを難読化します。ただし、Spices_ObfuscateSolutionAfterBuildプロパティをFalseに すると、この機能が無効になります。 Spices.Netで生成されたドキュメント(逆コンパイラ出力、モデル、難読化マップ、メタデータ テーブルなど)は、Visual Studioのドキュメントやツール ウィンドウとして表示されます。
難読化の設定に柔軟に対応 | Spices_IncludeToProjectプロパティを変更することにより、プロジェクトを難読化の対象に含めたり、除外することができます。
外部のアセンブリを難読化に含める | 外部(カレントのソリューションで使用されていない)アセンブリを含めることができます。
Visual Studioのプロジェクトプロパティで難読化のプロパティを変更 | プロジェクトのプロパティで直接難読化のプロパティを変更できます。
Spices.Projectでソリューションプロジェクトを自動更新 | ソリューション プロジェクトは、Spices.Projectで自動更新されます。
難読化されたアセンブリのデバッグ | 難読化されたアセンブリをVisual Studioで直接デバッグすることができます。Spices.ProjectのStripDebugInfoプロパティをFalseに設定 し、SaveToDirectoryプロパティを指定して生成されたアセンブリの出力を保存することを忘れずに行ってください。

参照


Spices.VSIPの登録/解除

Spices.VSIP.Netは、インストール時に、オプションでMicrosoft Visual Studioに登録することができますが、後で以下のようにコマンドラインから登録や解除を行うことができます。

Spices.VSIP.NetをVisual Studio 2003に登録:
spices.exe /REGVSIP

Spices.VSIP.NetをVisual Studio 2003から解除:
spices.exe /UNREGVSIP

Spices.VSIP.Netを Visual Studio 2005に登録:
spices.exe /REGVSIP05

Spices.VSIP.NetをVisual Studio 2005から解除:
spices.exe /UNREGVSIP05

参照


難読化に必要なプロジェクトの設定

下記の手順に従って、難読化に必要なソリューションやソリューションプロジェクトの設定を行ってください。

  • Microsoft Visual Studioを起動する。
  • ソリューションまたはプロジェクトを開く。
  • [ツール]メニューの[Spices.Net]に、Visual Studioに統合されたSpices.Netの共通コマンドが表示されます。
  • Visual Studioのソリューション エクスプローラからソリューションを選択します。

  • コンテキストメニューから[プロパティ]を選択するか、F4を押してソリューション プロパティを表示します。
  • ソリューションからSpices.Projectを作成するには、Spices_CreateProjectプロパティをTrueに設定します。
  • 構築プロセスが問題なく終了した後にソリューションを難読化する場合は、Spices_ObfuscateSolutionAfterBuildプロパティをtrueに設定します。ソリューションの難読化を無効にする場合は、falseに設定します。
  • Spices_ProjectFileNameプロパティをSpices.Projectのファイル名に設定します。
  • Visual Studioのソリューション エクスプローラでプロジェクトを選択します。

  • コンテキストメニューから[プロパティ]を選択するか、F4を押してプロジェクト プロパティを表示します。
  • プロジェクトをSpices.Projectにインクルードするには、Spices_IncludeToProjectプロパティをtrueに設定します。
  • Spices_ObfuscationOptionsプロパティを編集します。難読化のプロパティに関する詳細は、Spices_Obfuscatorのプロパティを編集するを 参照してください。

参照


Spices.Obfuscator

Spices.Obfuscatorは、アセンブリの難読化を行います。

プロジェクトをロードし、プロパティを編集し、Obfuscatorを実行して、アセンブリを難読化します。

参照


Spices.Obfuscatorの比較表

機能1/製品 | Spices.VSIP.Obfuscator | Spices.Obfuscator | Spices.Obfuscator Console
コンソールモードでの使用（コマンド ライン） | ○ | ○ | ○
Spices.Net（スタンドアロン） | ○ | ○ |
Visual Studioへの組み込み | ○ |  |
MSBuildの統合 | ○ | ○ |
Spices.Anonymizer | ○ | ○ | ○
Spices.Optimizer | ○ | ○ | ○
単一アセンブリの難読化 | ○ | ○ | ○
自動化 | ○ |  |
Spices.Projectのサポート | ○ | ○ | ○
Spices.Solutionのサポート | ○ | ○ | ○
難読化のイベント | ○ | ○ | ○1
1Spices.ProjectとSpices.Solutionの難読化でサポートされます。

参照


概要

Spices.Obfuscatorは、逆アセンブラや逆コンパイラからソースコードを守ります。勿論Spices.Obfuscatorでアセンブリを難読化しても、 この難読化したアセンブリの実行は可能です。また、アセンブリの実行時のパフォーマンスに影響を与えません。Spices.Obfuscatorの基本的な機能は下記の通りです。

機能 | 内容
マルチタスク | タスクを別々のスレッドで実行したり、実行するタスクの優先度を指定できます。TaskListで実行をモニターしながら次のタスクにとりかかることができます。
ローカライズ Spices.ObfuscatorにはSpices.Localizerというモジュールが含まれています。これはアプリケーションをローカライズするために、Localizerで作成したnrlocファイルを使用 します。
難読化処理でアプリケーションをローカライズするためには、Spices.Projectビルドの難読化オプションでnrlocファイルとローカライズ言語を指定 します。
自動化 | Spices.Obfuscatorは、難読化処理を自動化することができます。Spices.ObfuscatorのConsole Editionは、スクリプト(JSおよびVBS)やコマンド(CMD およびBAT)ファイル から実行できます。またスクリプトからSpices.ProjectオブジェクトやSpices.Solutionオブジェクトを使用することができます。 製品には、Spices.ObfuscatorのGUI、Spices.Obfuscatorのコンソール エディション、自動化のサポートモジュールが含まれています。
Obfuscation Events
(難読化イベント) 		ObfuscationEventsは、難読化処理の流れの中に必要なファイルのビルドの準備、展開や記述など他の命令を含めることができます。
ObfuscationEventsは、Spices.ProjectとSpices.Solutionの両方でサポートされています。
Code Flow Obfuscation
(コードフローの難読化) 		Spices.Obfuscatorは、特許出願中のSpices.Anonymizerを使用しています。これは、逆コンパイルや逆アセンブルした後でILコードを完全に再利用できなくなるように暗号化する機能です。
アセンブリの検証 | Spices.Obfuscatorは、PE、メタデータ、ILについての生成したアセンブリを検証します。
アセンブリの最適化 | Spices.Optimizerはメタデータやアセンブリのパフォーマンスの最適化をおこないます。
VS2003 と VS2005との統合 | Spices.Netは、Visual Studio 2003 と MS Visual Studio 2005 に統合して使用できます。
MSBuild プラットフォームとの統合

Spices.Obfuscatorは、MSBuildと統合して使用できます。MSBuildは、新しい拡張可能なXMLベースのビルド エンジンです。
難読化されなかったメソッド名の変更 | 新機能のSpices.Anonymizerは、難読化されなかったメソッドを別の名前に置き換えます。
外部参照の偽装 | Spices.Anonymizerは、参照された型やメソッド、フィールドへの呼び出しを偽装します。
Spices.Solution | Spices.ProjectのオブジェクトをSpices.Netにロードする新しいオブジェクトです。プログラムはいろいろな構成やパッケージで提供されている場合がありますが、Spices.Solutionは、 これらの構成やパッケージをひとつのソリューションとして作成し、一度に難読化します。
Spices.Obfuscatorの難読化 | 勿論、Spices.Net自身、Spices.Obfuscatorで難読化されています。
.Net フレームワークのサポート | Spices.Obfuscatorは、.Net フレームワーク(1.0、1.1、2.0、Compact Framework)をサポートします。
全アセンブリ型および言語のサポート | Spices.Obfuscatorは、C#、VB.Net、Delphi.Net、managed C++によるアセンブリをサポートします。
強力な増分難読化 | Spices.Obfuscatorは、強力な増分難読化(インクリメンタルな難読化)をサポートします。アセンブリの構造体が変わっても、メンバ名はそのままです。
AntiILDASM機能 | Anti ILDASM機能は、プロテクトされたアセンブリをロードする際に、ILDASMや他のほとんどの逆コンパイラをクラッシュします。Spices.Obfuscatorは、 保護されたアセンブリをSpices.Decompilerによる逆コンパイルから守るためにNotDecompile属性を組み込んでいます。
文字列の暗号化

Spices.Obfuscatorは、文字列を隠蔽して暗号化し、この情報の取り出しや逆アセンブルが非常に困難な見えない小さなヒープとしてILコードに埋め込みます。

サポートしているモードは次の３つです。

  • Hide (暗号化せずに文字列を隠します)
  • Encrypt (内部の暗号化実装を使用して文字列を暗号化します)
  • 3DES (TripleDES アルゴリズムを使用して文字列を暗号化します)
Spices.Anonymizerは、可読化を防ぐために文字列の呼び出しを偽装します。
タンパープルーフのアセンブリの作成
(改ざんを防止するアセンブリの作成) 		この技術は、文字列とバイナリーリソース(ユーザー文字列とコードで使用するバイナリー配列)を暗号化するもので、特許を取得しています。これは覗き見や変更からアセンブリを保護します。
相互難読化 Spices.Obfuscatorは、相互難読化(難読化されたアセンブリのメンバは、参照されているアセンブリも難読化されます)をサポートしています。これは全アセンブリを1つに結合するより 良い方法ですが、保護の程度は同じです。
Spices.Obfuscatorは、フレンドアセンブリを自動的にサポートします。
カスタマイズ可能な難読化オプション | Spices.Project (.iloprj)に含まれる各アセンブリには、難読化を制御するいろいろなオプションがあります。
難読化ルール 難読化オプションは、アセンブリメンバの型を含めたり除外したりするルール(ObfuscationOptions.Members)を指定します。
また、Obfuscation.Membersには事前に決められた構成ルールもあります。
属性ベースの難読化 Spices.Obfuscatorは、属性をベースにする難読化をサポートします。
ソースコード(C#、 VB.Net、 Delphi)にObfuscate、NotObfuscate、DontEncryptStrings、SpecialNamespace、SpecialName、NotObfuscateMembersなどの難読化の属性 を設定します。
厳密名のサポート | Spices.Obfuscatorは厳密名のアセンブリをサポートしており、厳密名のキーファイルが定義された場合、難読化の後でアセンブリを再署名します。
名前付けの規約 Spices.Project (.iloprj)に含まれるアセンブリにはそれぞれ個別の難読化オプションがあるので、次の9つの名前付け規約から1つを選ぶことができます:Numbers、Alphabetical、AlphaNumeric、 NonDisplayable、CustomAndNonDisplayable、AlphaNumericAndCustom、 AlphaNumericAndNonDisplayableAndCustom、AlphaNumericAndNonDisplayable、 CustomDictionary。
NonDisplayableを使用する場合、ILDASMまたは他のアセンブリ ブラウザは、正確にアセンブリ名を表示しません。
オーバーロードの名前変更 | Spices.Obfuscatorは、独自のShrinkNames機能を使用して名前の長さを短縮します。これは、メタデータの文字列ストリームのサイズを大幅に減らし、より小さいアセンブリを作成することができるDoublePackString機能を改良したものです。
除外と置換 | Spices.Obfuscatorは、一般的な表現でアセンブリメンバを手動で難読化したり除外することができます。
アセンブリの圧縮と最適化 | Spices.Obfuscatorは、メタデータのサイズを(45%まで)減らし、アセンブリのサイズを最適化してアセンブリの性能を向上させます。
デバッグのサポート | Spices.Obfuscatorは、デバッグ可能なアセンブリを作成します。
デバッグ情報の除外 | Spices.Obfuscatorは、難読化されたアセンブリからデバッグ情報を除外することができます。
スタック トレースの解読をサポート | Spices.Obfuscatorは、スタック トレースの解読ツールを提供しています。
ソフトウェア ウォーターマーク(透かし) | Spices.Obfuscatorには、ソフトウェアのウォーターマーク(透かし)機能があります。ソフトウェアのウォーターマークをNineRays.Obfuscator.SoftwareWatermark属性の難読化されたアセンブリに埋め込 むことができます。ソフトウェアは、この属性を簡単に認識することができ、この属性のWatermarkプロパティからソフトウェアのウォーターマークを取り出すことができます。
コンソール インターフェイス | Spices.Obfuscatorには、NAntやVisual StudioのBuildイベントなどバッチ/自動ビルドで使用可能な独立したコンソール機能があります。Spices.Obfuscatorのコンソール 機能には、Spices.Obfuscatorの全ての機能があります。
独自のアセンブリ ビルダ

Spices.Obfuscatorは、オリジナルのアセンブリと互換性のあるアセンブリを生成する独自のアセンブリ ビルダを使用します。
ilasm-ildasmのラウンド トリップは必要ありません。アセンブリ ビルダがすべての作業を処理します。
独自のメタデータ アクセス エンジン | Spices.Obfuscatorは、C#、managed C++、Vb.Net、J#,、C# Builder、Delphi.Netで生成された.Netアセンブリ とモジュール(.Net 1.0、1.1、2.0、Compact Framework.Net)で動作可能な、独自のメタデータ アクセス エンジンを使用しているので、アセンブリの構造に悪影響を及ぼすことはありません。
IDEの統合 | Spices.VSIP.Net (Visual Studio Integration Package)バージョンでは、Spices.Obfuscatorは、Visual StudioのIDEから使用が可能です。

参照


実行

ここでは、難読化の方法について説明します。

Step 1:

機能 | 内容
Spices.Obfuscatorの構成 | アセンブリをロードします。ここではVisual StudioのWeatherを使用します。 アセンブリをロードしたら、[ツール]メニューから[プラグインの管理] -> [Spices.Obfuscator]を選択し、[プロパティ]をクリックしてください。 アセンブリの難読化を定義する設定ダイアログが表示されます。どのメンバ(クラス、メソッド、列挙体など)を難読化するか、またどの難読化の機能を使用するか指定できます。 この設定は、難読化の効果と実行に影響するので、注意して設定してください。基本的にはデフォルトの設定で結構です。

Step 2:

機能 | 内容
個別でのアセンブリ設定 | プロジェクトの各アセンブリを個別で難読化の設定ができます。 これを行うには、難読化の設定を行うアセンブリを選択して、プロパティタブをクリックし、ObfuscationOptionsノードを展開してください。 すべてのプラグインに関しては、同じオプション一覧が表示されます。 この選択したアセンブリに対して各オプションを個別に設定できます。

Step 3:

機能 | 内容
難読化を実行する | 設定を行った後、[ツール]メニューから[難読化!]を選択するか、SHIFT+F8を押してください。 Spices.Obfuscatorは、指定した設定に応じて難読化を行います。タスク一覧から経過の表示 やその制御が行えます。

Step 4:

機能 | 内容
変更箇所を表示する | プロジェクトの難読化を確認します。 [ツール]メニューから[難読結果]を選択するか、SHIFT+F3を押してください。 右パネルにプロジェクトの階層表示が表示されるので展開し て、どのメンバ名が変更されたかを確認してください。 難読化されたメンバ名がプロジェクトの至る所で認識できなくなっているのがお分かりになると思います。 また、コードがどう変わったかを把握するために難読化されたアセンブリを逆コンパイルすることもできます。

Step 5:

機能 | 内容
アセンブリをローカライズする | Spices.Localizerでアセンブリのローカライズ情報のファイル が作成してあれば、アセンブリにローカライズ情報を追加することができます。 アセンブリのプロパティを開き、AssemblyList\AssemblyName\LocalizationInfo, LocalizationFileプロパティのこのファイルを指定してください。

参照


オプション

はじめに

ObfuscationOptionsを使用することにより、いろいろな設定で難読化を行うことができます。ここでは、このオプションについて説明します。

最初にファイルメニューからアセンブリを開き、プロパティタブを選択しプロジェクトのプロパティを表示します。次にAssemblyListプロパティとその下のサブ プロパティを開いてObfuscationOptionsオプションを開きます。

ObfuscationOptions.Members

このMembersオプションによってアセンブリメンバを難読化したり除外したりすることができます。次のような難読化の設定があります。

    実行可能ファイル (.exeファイル)

    アセンブリが実行可能ファイル(.exeファイル)の場合、MembersをFullの設定で難読化することができます。この場合すべてのアセンブリメンバが難読化 されますが、外部の型やインターフェイスの実装から派生するメソッドやフィールド、プロパティは難読化から除外されます。この種のアセンブリ の場合、この設定が最も効果的です。

    クラスライブラリ

    2つのタイプのアセンブリを使用できます。

      アセンブリ-継承を保持しないコンポーネント

      この種のアセンブリの場合、MembersをDefaultまたはDefaultImprovedの設定で難読化することができます。この場合パブリック メンバやその継承も保持できます。

      継承を保持するクラスライブラリ

      リフレクション/シリアライズ化の主な問題は、アセンブリメンバが名前で使用されることです。従ってリフレクション/シリアライズ化で使用されるメンバを保持することが 非常に重要になります。この種のアセンブリでは、シリアライズ化されなかったクラスメンバを保持する必要があります。この種のアセンブリの場合、MembersをKeepsSerializationの設定で難読化することができます 。この場合データの列挙型同様、パブリックプロパティやパブリック タイプを保持できます。

難読化からの除外

次のようにして、アセンブリを難読化から除外できます。
  • ObfuscationOptions.Excludes – 組み込まれたエディタを呼び出して、除外するアセンブリメンバを選択します。
  • ObfuscationOptions.ExclusionPatterns – メンバ名を使用して、難読化から除外できます。例えば、式:"MyCompany.MyNamespace.*"は、 MyCompany.MyNamespaceで始まる全てのアセンブリメンバを除外できます。
  • コードによる除外 - Obfuscatorから指定したメンバを除外するには、コードにNineRays.ObfuscatorのNotObfuscate属性を 記述します。

    namespace MyCompany.Mynamespace
    {
      using NineRays.Obfuscator;
      [NotObfuscate]
      public class MyClass { }
    }

    アセンブリメンバ名で除外するには、NotObfuscateMembers属性を使用してください。

    namespace MyCompany.Mynamespace
{
using NineRays.Obfuscator;
[assembly:NotObfuscateMembers("MyCompany.Mynamespace.*")]
public class
MyClass { }
}

難読化に設定

  • ObfuscationOptions.InclusionPatterns – メンバ名を使用して、難読化に設定することができます。例えば、式: MyCompany.MyNamespace.*"は、MyCompany.MyNamespaceで始まる 全てのアセンブリメンバを難読化に設定することができます。
  • コードによる設定 – Obfuscatorから指定したメンバを設定するには、コードにNineRays.ObfuscatorのSpecialName属性を 記述します。

    namespace MyCompany.Mynamespace
    {
      using NineRays.Obfuscator;
      [SpecialName("~~")]
      public class MyClass { }
    }

    アセンブリメンバ名で難読化に設定するには、ObfuscateMembers属性を使用してください。

    namespace MyCompany.Mynamespace
{
using NineRays.Obfuscator;
[assembly:ObfuscateMembers("MyCompany.Mynamespace.*")]
public class
MyClass { }
}

名前の設定
(ObfuscationOptions.Naming)

アセンブリを難読化すると、クラスやメンバに新しい名前が付きますが、Spices.Obfuscatorにはいくつかの設定方法があります。 尚、難読化されたときの、クラスやメンバ名の長さが短ければ最終的なアセンブリのサイズが 小さくなります。
ObfuscationOptions.Namingには以下の設定値があります。

  • Numbers
    数字の組み合わせ
  • Alphabetical
    英字の組み合わせ
  • AlphaNumeric
    英数字の組み合わせ
  • CustomDictionary
    設定した文字の組み合わせ(CustomDictionaryに設定した文字で名前を付けます。)
    例えば、CustomDictionaryにabcを設定すると、a、b、cの組み合わせで名前を付けます。尚、この文字は英数字以外も設定できます。但し、2文字以上の長さが必要です。

設定値にNonDisplayableが付くと、アセンブリの表示や、リンカ(ILASM)で使用可能なILの表示が行われないようになります。

ユニークなアセンブリの作成
(ObfuscationOptions.MixDictionary)

ユニークなアセンブリを作成するには、ObfuscationOptions.MixDictionaryをTrueに設定してください。Spices.Obfuscatorは辞書の「 シャッフル」を行って、常にユニークなアセンブリを生成します。

名前空間のクラスの再構築
(ObfuscationOptions.NamespaceRestructuring)

名前空間のクラスを再構築は、クラス間の視覚的で概念的なリンクを破棄すためです。Dataにはクラスやデータと共に動作するサービスが含まれ、.Utilsにはクラスのユーティリティ が含まれます。
ObfuscationOptions.NamespaceRestructuringには以下の設定値があります。
  • AsIs
    名前空間の構造はそのままで、名前が変更された名前空間の下でクラスは難読化、分類されます。また名前空間も同様に分類されます。
  • EachTypeOneNameSpace
    難読化された各クラスは別々の名前空間に分類されます。アセンブリの解析を行おうとする人にたいしてかなり効果がありますが、アセンブリのサイズが大きくなります。
  • AllTypesOneNamespace
    難読化された各クラスは1つの名前空間に配置されます。クラスの構造はより単純になりますが、アセンブリのサイズは縮小されます。
  • NoNamespaces
    難読化された全クラスは名前空間なしで配置されます。クラスの構造はより単純になりますが、アセンブリのサイズは縮小されます。

ソフトウェアの透かし
(ObfuscationOptions.SoftwareWatermark)

このオプションは、アセンブリに”透かし”を付けます。この”透かし”を使用して、アセンブリに所有者の識別 を付けることができます。このオプションを使用して、アセンブリに「”転売不可”や”営利目的”に使用しないでください」といったメモや、シリアル番号やパブリック キーなどを保存することができます。

増分難読化
(ObfuscationOptions.IncrementalObfuscation)

増分難読化は、システムコンポーネントを提供するようなソフトウェアの開発に必要です。重要なことは、内部の名前空間を常に同じくすることです。この増分難読化 は常に同じ名前を生成するために厳密なアルゴリズムを使用し、メンバ名が変わっても難読化後の名前は以前と同じになります。
また、後述の”アセンブリの相互難読化”を使用する場合には、このオプションを使用したほうが良いです。

AntiILDASM
(ObfuscationOptions.antiILDASM)

antiILDASMは、ILDASM(ILコードへ逆アセンブルするツール)でのを使用を防ぎます。
antiILDASM.をTrueにすると、アセンブリはILDASMにロードされますが、逆アセンブルによるILコードの表示が出来ないようにします。
antiILDASM.をCompleteにすると、アセンブリのILDASMへのロードと逆コンパイルを防ぎます。
注意: このオプションは.Net Framework 1.0/1.1のILDASMに対応していますが、.Net Framework 2.0には対応していません。

文字列の暗号化
(ObfuscationOptions.StringEncryptionMode)

このオプションは、アセンブリの文字列情報を暗号化することができます。特にパスワード等の文字列情報についてはこのオプションを使用してください。
ObfuscationOptions.StringEncryptionModeには以下の設定値があります。
  • Hide
    メソッドからの文字列情報を暗号化せずに隠蔽します。
  • Encrypt
    メソッドからの文字列情報を隠蔽して、文字列を暗号化します。
  • 3DES
    メソッドからの文字列情報を隠蔽して、TripleDES暗号化アルゴリズムで文字列を暗号化します。
  • NoNamespaces
    難読化された全クラスは名前空間なしで配置されます。クラスの構造はより単純になりますが、アセンブリのサイズは縮小されます。
    • StringEncryptionMode.Hide – メソッドの文字列情報を暗号化せずに隠すことができます。
    • StringEncryptionMode.Encrypt - メソッドの文字列情報を隠して、文字列を暗号化することができます。
    • StringEncryptionMode.3DES - メソッドの文字列情報を隠して、TripleDES暗号化アルゴリズムを使用できます。

アセンブリの相互難読化

Spices.NETは複数のアセンブリの場合、相互難読化処理を行います。これは複数のアセンブリのパブリックメンバを相互に矛盾がないように同時に難読化します。これは、難読化の品質を非常に高めるものです。
この場合、1つのプロジェクトに複数のアセンブリが設定され、相互難読化が自動的に実行されます。ただし、システムアセンブリやサードパーティ製のアセンブリは除かれます。
またこの場合、前述の”増分難読化”のオプションも併せて使用したほうが良いです。

Spices.Solutionの使用

Spices.Solutionは、Spices.Projectのフォルダにあります。Spices.Solutioは複数のプロジェクトで構成され、同時に難読化する 場合に役立ちます。条件付きでコンパイルされる複数のプロジェクトの場合などに便利です。例えば、体験版、Light版、Pro版、Enterprise版 などの製品群がある場合、各バージョン毎にSpices.Projectを作成し、全てのプロジェクトを一つのSpices.Solutionに入れ 、一気に難読化することができます。

ObfuscationEventsの使用

難読化の処理中にカスタマイズした処理を行えるイベントがSpices.Projectには10個、Spices.Solutionには2つあります。
イベントは下記の順で発生します。

ソリューション単位での処理
BeforeObfuscation

プロジェクト単位に難読化を行います。
BeforeProjectObfuscation
難読化処理
AfterProjectObfuscation

プロジェクトのアセンブリの生成を行います。
このイベントは、難読化したアセンブリのバックアップや生成したアセンブリの取得の準備等に使用されます。
BeforeProjectGeneration
BeforeAssemblyGeneration
AfterAssemblyGeneration
AfterProjectGeneration

アセンブリの認証を行います。
このイベントは、.NET1.1ではサポートされていませんが、.pfxの認証を使用する場合に使用されます。
BeforeProjectSign
BeforeAssemblySign
AfterAssemblySign
AfterProjectSign

AfterObfuscation

Spices.Anonymizer機能
(Spices.Project.AnonymizeOptions)

この機能には、アセンブリのデータを匿名化するためのメソッドが含まれています。このメソッドは、アセンブリメンバや外部の(参照された)メンバへのアクセス、オブジェクトの 生成やメソッドの呼び出しを行います。詳細は下記の通りです。

    匿名化の呼び出しとフィールドへのアクセス

    フィールドへのアクセスやメソッドの呼び出しを匿名化することができます。
    例えば、System.Console.WriteLine(“Hello world!”)がx.y.p(z.s.0())に匿名化された場合、この匿名化されたメソッド 名からこの処理を想像することは非常に困難になります。
    メソッドやフィールドの呼び出しを匿名化するということはその解析を非常に困難にしますが、System.Reflectionの動作についてアセンブリ は”透過”です。
    アセンブリ メンバを難読化する場合、参照されているアセンブリメンバだけを匿名にすれば十分です。

    文字列の匿名暗号化

    この機能は、GetString()のような名前から機能がわかるメソッドを偽装するために、文字列の呼び出しを匿名化します。
    この場合、これらの匿名化されたメソッドはアセンブリ全体に配置されて、クラスの定義を復号化出来ないようにします。

    非難読化メソッドのためのスタブの設定 (Stub メソッド)

    このメソッドは、難読化されていないメソッドのスタブを設定し、匿名化したスタブでの置換によってメソッドの実体を隠蔽します。これは、逆コンパイルやメソッドの検索をより困難に します。
    このオプションは、型やパラメータを匿名化することにより機能強化することができ、これにより変換されたデータや返されたデータに関する情報を隠蔽することができます 。
    また、このオプションは別のオプション(ReferencedMethods、ReferencedFields、InternalMethods、InternalFields)でも機能強化 ができ、スタブのメソッドの実体も匿名化できます。これにより解析はより困難になります。
    このメソッドは、難読化できないパブリックメソッドのアセンブリに非常に有効です。プロセス後に、難読化されていないメソッドの実体は非公開の場所に移動され、スタブに置き換えられます。

    効果

    上記メソッドを使用して、Spices.Obfuscatorでアセンブリの処理を行った結果です。
    • 他のメソッドの呼び出しを使用するメソッドやフィールドは実際に分割されるので、解析が非常に困難です。
    • スタブ(メソッド)の呼び出し、メソッド(anonymizer)の呼び出しや文字列の復号化の呼び出しは最適化され、生産性の減少にはなりません。
    • 外部呼び出しへのアクセスは隠され、メソッドの実体は見えなくなります。
    • 別々のSpices.Anonymizerメソッドを同時に使用すると、アセンブリに混乱を生ずることがあります。

    Spices.Anonymizerオプションの使用上の注意

      最小限の難読化

      コンポーネントやクラスライブラリまたはクラスのシリアライズを使用するアセンブリに対しては、最小限の設定で難読化を行う必要があります。 この場合、難読化されなかったパブリックメンバや継承またはオーバーライド可能なメンバを保存する必要があります。
      難読化を最小限にする場合(例えば、ObfuscationOptions.Members = Defaultの場合)、プロテクトコードを追加する必要があります。Spices.Anonymizerは欠けているプロテクトコードを補います。
      この難読化モードでは、以下のSpices.Anonymizerのオプションを使用することをお勧めします。

      • AnonymizerOptions.StubUntouchedMethods – 難読化されなかったメソッドのスタブを設定します。
      • AnonymizerOptions.ReferencedMethods – 外部メソッドの呼び出しを匿名化します。
      • AnonymizerOptions.ReferencedFields - 外部フィールドの呼び出しを匿名化します。

      プロテクトを強化するには、次のオプションを無効にする必要があります。

      • AnonymizerOptions.KeepReturnTypes - 返されたデータの型を匿名化します。
      • AnonymizerOptions.KeepParameterTypes - メソッドに移動されたデータの型を匿名化します。
      • AnonymizerOptions.InternalMethods - 内部メソッドの呼び出しを匿名化します。
      • AnonymizerOptions.InternalFields - 内部フィールドの呼び出しを匿名化します。

      完全な難読化

      完全な難読化では(ObfuscationOptions.Members = Fullの場合)、Spices.Anonymizerの全オプションを使用する必要はありません。次のオプションで十分です。
      • AnonymizerOptions.ReferencedMethods – 外部メソッドの呼び出しを匿名化します。
      • AnonymizerOptions.ReferencedFields - 外部フィールドの呼び出しを匿名化します。

      プロテクトを強化するには、次のオプションを無効にする必要があります。

      • AnonymizerOptions.KeepReturnTypes - 返されたデータを匿名化します。
      • AnonymizerOptions.KeepParameterTypes - メソッドに移動されたデータの型を匿名化します。

      文字列の暗号化

      難読化に文字列の暗号化が使用されている場合 (StringEncryption = Hide or Encrypt)、文字列の暗号化の呼び出しを匿名化する次のオプションを使用することをお勧めします。
      • AnonymizerOptions.StringEncryption.

アセンブリの最適化

Spices.Optimizerはメタデータやアセンブリのパフォーマンスの最適化をおこないます。

Spices.Optimizerの標準的な設定:

  • 従来の設定(でも効果的です):

    もしアセンブリの構造に詳しくなければ、プロパティやイベント、パラメータについて難読化モードを選択してください。

  • プロパティ:

    アセンブリにリフレクションやシリアライズで使用されるクラスが含まれない場合や、完全な難読化を行う場合(ObfuscationOptions.Members = Full)は完全なモード(Completeモード)を使用してください。

  • イベント:

    アセンブリに開発環境や設計時に使用されるクラスが含まれない場合や、完全な難読化を行う場合(ObfuscationOptions.Members = Full)は完全なモード(Completeモード)を使用してください。

  • パラメータ:

    適用されるメソッドのパラメータがマーシャリングやデフォルトの値を含まない場合や、パラメータにフラグが無い場合(例、[in], [out])、完全なモード(Completeモード)を使用してください。

参照


Spices.Anonymizerの使用によるアセンブリの保護

はじめに

Spices.Anonymizerは、ILコードをスクランブルするので、ILコードを逆コンパイルや逆アセンブルして出来たコードは全く再利用できません。
Spices.Anonymizerの主な機能と使用方法を下記に示します。

public class Test
{
public class DataHolder
{
private string msg;
private int count;
public DataHolder(string msg, int count)
{
this.msg = msg;
this.count = count;
}
public string Message
{
get {return msg;}
}
public int Count
{
get {return count;}
}
}

public void HelloWorldTest()
{
DataHolder dh = new DataHolder("Hello World!!!", 4);
Output(dh);
}

public int Output(DataHolder dh)
{
System.Console.WriteLine(string.Format("{0}. {1}",
dh.Count.ToString(), dh.Message));
return dh.Count;
}
}

参照された型やメソッド、フィールドを呼び出すILコードの偽装
AnonymizeOptions.ReferencedMethodsとAnonymizeOptions.ReferencedFields の設定

以下は、ILソースコードのサンプルです。

.method public hidebysig instance int32 Output(class smallTest.Test/DataHolder dh) cil managed
{
  // Code size: 46 bytes
  .maxstack 4
  .locals ([0] int32 V_0,
           [1] int32 V_1)
  IL_0000: ldstr "{0}. {1}"
  IL_0005: ldarg.1
  IL_0006: callvirt instance int32 smallTest.Test/DataHolder::get_Count()
  IL_000b: stloc.1
  IL_000c: ldloca.s V_1
  IL_000e: call instance string [mscorlib]System.Int32::ToString()
  IL_0013: ldarg.1
  IL_0014: callvirt instance string smallTest.Test/DataHolder::get_Message()
  IL_0019: call string [mscorlib]System.String::Format(string, class object, class object)
  IL_001e: call void [mscorlib]System.Console::WriteLine(string)
  IL_0023: ldarg.1
  IL_0024: callvirt instance int32 smallTest.Test/DataHolder::get_Count()
  IL_0029: stloc.0
  IL_002a: br.s IL_002c
  IL_002c: ldloc.0
  IL_002d: ret
}

以下は、(KeepReturnTypesオプション、 KeepParameterTypesオプションを使用して)Spices.Anonymizerで処理されたILコードです。

.method public hidebysig instance int32 Output(class smallTest.Test/DataHolder dh) cil managed
{
  // Code size: 46 bytes
  .maxstack 4
  .locals ([0] int32 V_0,
           [1] int32 V_1)
  IL_0000: call class object 0.-::Б()
  IL_0005: ldarg.1
  IL_0006: call int32 smallTest.Test/?::?(class object)
  IL_000b: stloc.1
  IL_000c: ldloca.s V_1
  IL_000e: call string smallTest.Test/?::?(class object)
  IL_0013: ldarg.1
  IL_0014: call string smallTest.Test/?::?(class object)
  IL_0019: call string smallTest.Test/?::?(string, class object, class object)
  IL_001e: call void smallTest.Test/?::?(string)
  IL_0023: ldarg.1
  IL_0024: call int32 smallTest.Test/?::?(class object)
  IL_0029: stloc.0
  IL_002a: br.s IL_002c
  IL_002c: ldloc.0
  IL_002d: ret
}

これは、(KeepReturnTypesオプション、 KeepParameterTypesオプションを使用せずに)Spices.Anonymizerで処理されたILコードです。

.method public hidebysig instance int32 Output(class smallTest.Test/DataHolder dh) cil managed
{
  // Code size: 46 bytes
  .maxstack 4
  .locals ([0] int32 V_0,
           [1] int32 V_1)
  IL_0000: call class object 0.-::?()
  IL_0005: ldarg.1
  IL_0006: call int32 smallTest.Test/в::?(class object)
  IL_000b: stloc.1
  IL_000c: ldloca.s V_1
  IL_000e: call string smallTest.Test/в::?(class object)
  IL_0013: ldarg.1
  IL_0014: call string smallTest.Test/в::?(class object)
  IL_0019: call string smallTest.Test/в::?(string, class object, class object)
  IL_001e: call void smallTest.Test/в::?(string)
  IL_0023: ldarg.1
  IL_0024: call int32 smallTest.Test/в::?(class object)
  IL_0029: stloc.0
  IL_002a: br.s IL_002c
  IL_002c: ldloc.0
  IL_002d: ret
}

これは、(KeepReturnTypesオプション、 KeepParameterTypesオプションを使用せずに)Spices.Anonymizerで処理されたC#のコードです。

public int Output(smallTest.Test.DataHolder dh)
{
  smallTest.Test.в.?(
      smallTest.Test.в.?(0.-.?(),
      smallTest.Test.в.?(smallTest.Test.в.?(dh)),
      smallTest.Test.в.?(dh)));
  return smallTest.Test.в.?(dh);
}

Int32.ToString()、String.Format、System.Console.WriteLineメソッドへの呼び出しが匿名化されると、次のような利点があります。

  • Anonymizerに識別可能な(同じ)名前がありません。
  • メソッドの実行の流れを不明瞭にする。
  • オブジェクトの作成が匿名化される。
  • メソッドは匿名化されたパラメータリストを使用する匿名化されたラッパーによって実行される。
  • メソッドは匿名化された型を返すので、メソッドの型が非常にわかりづらくなります。
  • ILリストはILASMで使用できません。

内部呼び出しの匿名化
AnonymizeOptions.InternalMethodsとAnonymizeOptions.InternalFieldsの設定

以下は、ILソースコードのサンプルです。

.method public hidebysig instance void HelloWorldTest() cil managed
{
 // Code size: 21 bytes
 .maxstack 3
 .locals ([0] class smallTest.Test/DataHolder dh)
 IL_0000: ldstr "Hello World!!!"
 IL_0005: ldc.i4.4
 IL_0006: newobj instance void smallTest.Test/DataHolder::.ctor(string, int32)
 IL_000b: stloc.0
 IL_000c: ldarg.0
 IL_000d: ldloc.0
 IL_000e: call instance int32 smallTest.Test::Output(class smallTest.Test/DataHolder)
 IL_0013: pop
 IL_0014: ret
}

これは、(KeepReturnTypesオプション、KeepParameterTypesオプションを使用して)Spices.Anonymizerで処理したILコードです。

.method public hidebysig instance void HelloWorldTest() cil managed
{
  // Code size: 21 bytes
  .maxstack 3
  .locals ([0] class smallTest.Test/DataHolder V_0)
  IL_0000: call class object 0.-::?()
  IL_0005: ldc.i4.4
  IL_0006: call class smallTest.Test/DataHolder smallTest.Test/Д::_(string, int32)
  IL_000b: stloc.0
  IL_000c: ldarg.0
  IL_000d: ldloc.0
  IL_000e: call int32 smallTest.Test/Д::_(class object, class smallTest.Test/DataHolder)
  IL_0013: pop
  IL_0014: ret
}

これは、(KeepReturnTypesオプション、 KeepParameterTypesオプションを使用せずに)Spices.Anonymizerで処理した ILコードです。

.method public hidebysig instance void HelloWorldTest() cil managed
{
  // Code size: 21 bytes
  .maxstack 3
  .locals ([0] class smallTest.Test/DataHolder V_0)
  IL_0000: call class object 0.-::?()
  IL_0005: ldc.i4.4
  IL_0006: call class object smallTest.Test/_::П(string, int32)
  IL_000b: stloc.0
  IL_000c: ldarg.0
  IL_000d: ldloc.0
  IL_000e: call int32 smallTest.Test/_::П(class object, class object)
  IL_0013: pop
  IL_0014: ret
}

これは、(KeepReturnTypesオプション、 KeepParameterTypesオプションを使用せずに)Spices.Anonymizerで処理したC#コードです。

public void HelloWorldTest()
{
  smallTest.Test.в.?(this, smallTest.Test.в.?(0.-.?(), 4));
}

this.Outputメソッドへの呼び出しを匿名化すると、次のような利点があります。

  • Anonymizerに識別可能な(同じ)名前がありません。
  • メソッドの実行の流れを不明瞭にする。
  • オブジェクトの作成が匿名化される。
  • メソッドは匿名化されたパラメータリストを使用する匿名化されたラッパーによって実行される。
  • メソッドは匿名化された型を返すので、メソッドの型が非常にわかりづらくなります。
  • ILリストはILASMで使用できません。

暗号化文字列の匿名化
AnonymizeOptions.StringEncryptionの設定

暗号化した文字列の匿名化は、文字列のデータをロードして暗号を復号化するメソッドを隠します。一部の逆コンパイラは復号化コードをトレースして、元の文字列データを取得することができます。

Spices.Anonymizerは、パラメータやデータに関する情報を隠蔽し、コードの可読性を逆コンパイラから防ぐことができます。

スタブの使用
AnonymizeOptions.Stubsの設定

Spices.Anonymizerは、難読化されなかったメソッドを匿名化されたスタブに置換します。

サンプルコードです。

public bool PrintMessage(string msg)
{
  System.Console.WriteLine(msg);
}

//---- usage ------
if (PrintMessage("Hello!"))
{
  //...
}

上記のコードを匿名化すると次のようになります。

public bool PrintMessage(string msg)
{
  smallTest.Test.в.?(msg);//call anonymizer stub
}

//anonymizer stub in smallTest.Test.в
internal void ?(object a_0)
{
  System.Console.WriteLine(a_0);
}

//---- usage ------
if (smallTest.Test.в.?(0.-.?()())
{
  //....

次の点に注目してください。

  • PrintMessageメソッドが0メソッドで置換されています。
  • PrintMessageメソッドへの参照も別の呼び出しメソッドに置換されています。
  • PrintMessageへの内部呼び出しが直接PrintMessageスタブを参照しました。
  • 参照されたメンバの匿名化が0のメソッドにも影響しています。

public bool PrintMessage(string msg)
{
  smallTest.Test.в.?(msg);
}

internal void ^(object a_0)
{
  smallTest.Test.в.?(a_0);
}

//---- usage ------
if (smallTest.Test.в.?(0.-.?())
{
 //...
}

    参照


AntiILDASM機能

AntiILDASM機能は、ILDASMのツールからアセンブリを守ります。

機能:

  1. Spices.NetのDecompilerにより、アセンブリを逆コンパイルから守るためにNotDecompile属性が組み込まれています。
  2. AntiILDASMのCompleteモードを設定するとアセンブリのサイズが大きくなりますが、ILDASMではアセンブリがロード出来ません。
  3. True(Simple)モードを設定するとアプリケーションのサイズは大きくなりませんが、ILDASMではアセンブリをロードすることが出来ます。しかし、アセンブリのダンプや、他の逆コンパイラによるアセンブリの逆コンパイルを防ぐことができます。
AntiILDASMを有効にするには:

  1. Spices.Obfuscatorのデフォルト設定でAntiILDASMを設定する場合
    1. [ツール]の[プラグインの管理]をクリックします。
    2. NineRays.Obfuscatorのノードを選択します。
    3. ノードを展開して、Spices.Obfuscatorを選択します。
    4. [プロパティ]ボタンをクリックします。
    5. プロパティ エディタで、AntiILDASMプロパティをTrueまたはCompleteに設定します。

  2. Spices.Projectのプロパティで設定する場合
    1. [プロパティ]タブを選択します。
    2. AssemblyListプロパティを開きます。
    3. AssemblyListのObfuscationOptionsプロパティを開き、AntiILDASMプロパティをTrueまたはCompleteに設定します。

参照


難読化について

この章では、難読化とアセンブリの保護について説明します。

参照


.Net アセンブリを難読化する理由

.NETの重要な機能の1つは、プログラミング言語がCPUの命令から独立していて、中間言語からなるアセンブリを生成することです。 また、アセンブリには型、メンバや他のアセンブリからの参照コードを記述するメタデータも含まれています。プログラムの実行時にはジャスト インタイムコンパイラにより、これらはCPU固有の命令に変換されます。 つまり、開発者は自分の得意なプログラミング言語でコードを記述することが出来ます。
しかし、このアセンブリには重大な欠点があります。アセンブリには、オリジナルのソースコードを取得するのに十分な情報が含まれているという点です。従って、誰でもソースコードを 取得することができるので、アプリケーションの知的財産の保護が難しくなります。 また、ユーザーIDやパスワードの入力等のセキュリティに関する部分のソースコードも明らかになります。
難読化の目的は、その機能に影響を与えずに、逆コンパイルが困難あるいは不可能になるよにアセンブリを変換することです。.NETアセンブリの難読化を行うと、 以下の利点があります。

  • リバース エンジニアリングを複雑にします。
  • 難読化すると逆コンパイルが非常に複雑になり、逆コンパイルの効率が悪くなります。
  • コードの安全性が強化されます。
  • プログラムコードを最適化します。 (例えば、メタデータのサイズを小さくしたり、シンブルテーブルを最適化します)

参照


.NETで難読化がどのように行われるか?

難読化処理では、.NET アセンブリの逆コンパイルの結果の理解が困難になるように、.オリジナルと等価のアセンブリに変換されます。一部のObfuscatorは、ILDASM(MSIL逆アセンブラ)を使用してアセンブリを逆アセンブル し、オリジナルのMSIL(Microsoft Intermediate Language)を変換します。そして、ILASM(MSILアセンブラ)を使用してその結果を再アセンブルします。 逆アセンブルされたソースコードの理解をより困難にするために、アセンブリにさまざまな特殊な機能が適用されます。以下にその機能を説明します。

構成要素の名前変更

難読化の最も基本的な方法は構成要素の名前を変更することです。構成要素は名前空間、クラス、メソッド、プロパティ、フィールド、列挙体といった、.NET アセンブリでの名前付きのオブジェクトです。 通常、構成要素に意味のある名前を付けることは、コードを可読したりデバッグするのに役立ちます。.NET アセンブリを構築する際に、ソースコードの構成要素の名前がアセンブリのメタデータに保存されるので、コードを理解しようとする者にとってはそれが糸口となります。
そこで、構成要素の名前を短くて意味のない曖昧な名前に変更すれば、コードの解析が非常に困難になります。更に、オーバーロードでの名前変更は、.NETの特性を利用し たオーバーロードの規定範囲内で複数の構成要素に同じ名前を付けます。返されるメソッドの型もアセンブリのコードをまったく逆コンパイルできないようにし、MSILレベルでオーバーロードできます。

難読化の宣言

難読化を宣言することにより、難読化の項目が設定でき、直接ソースコードから繰り返し難読化できます。

制御フローの難読化と呼び出しの匿名化

論理的には同じですが、ソースコードを変更することにより解析が困難になります。

使用されていないメンバの削除

ソースコード中に使用されていないメソッドがあると、アセンブリから削除されます。また、これによりアプリケーションのサイズが最適化します。

文字列の暗号化

普通はソースコード中の文字列定数やアルファベットの文字列は、コンパイルされたアセンブリでそのまま表示されます。
しかし難読化処理を行うと文字列が暗号化されます。このため、実行時にオリジナルの文字列を使用するために、文字列の可読ルーチンをアセンブリに追加します。

ILDASMの使用

ILDASMは、.NET Framework SDKに同梱しているのMSILの逆アセンブラです。Spices.Netで難読化したアセンブリはこのILDASMでは逆アセンブリができません。

参照


アセンブリの難読化でよく使われる手順

  1. コードを記述する前に、最適な難読化のための準備を行います。
  2. 全クラスを、公開(シリアライズ化、リフレクション、マネージド リソース)と非公開(中核機能、非公開リソース)の2つに分類します。非公開グループのクラスだけ難読化します。
  3. クラスをサブクラスに分類し、サブクラスを機能ごと(シリアライズ化、パブリック部分)に入れ子にしてリフレクションとシリアライズ化の両方で使用できるようにします。Hiddenクラスも目的に応じて特定のクラスをにそれぞれ管理して、入れ子にできます。
  4. 入れ子のクラスに中核 となる機能を入れます。難読化処理を行うと、パブリック クラスは難読化されませんが、他の中核クラスは難読化されます。
  5. 非公開および保護されたリソースをバイト配列で保存します。
  6. インターフェイスを集中的に使用することによって機能の一部をマスキングしたサンプル
    Public class MyPublicClass : IServiceProvider
{
 //nested class
 private class MyNestedClass : ISomeInterface
 {
 } //properties
 internal ISomeInterface MyHiddenProperty {...}
 //events
 public object GetService(Type servicetype)
 {
    if (serviceType == ISomeInterface)
      return MyHiddenProperty;
    if (serviceType == ISomeInterface1)
      return new MyNestedClass(this);
 }
}
  7. インターフェイス実装をマスキングしたサンプル
    internal class SomeClass : IServiceProvider
{
  private IServiceProvider parent
  public SomeClass(IServiceProvider parent)
  {
    this.parent = parent;
  }
  public object GetService(Type serviceType)
  {
     if (serviceType == MyProperty.GetType())
      return MyProperty;
     if (serviceType == typeof (ISomeService))
       return new SomeService(this);
     if (parent != null)
       return parent.GetService(serviceType);
     return null;
  }

  public SomeAnotherService MyProperty
  {
    get {return new SomeAnotherService(this);}
  }
}
    マスキングされたコード:
    internal class SomeBaseClass : IServiceProvider
{
  protected IServiceProvider parent = null;
  public object GetService(Type serviceType)
  {
     if (serviceType == MyProperty.GetType())
      return MyProperty;
     if (serviceType == typeof (ISomeService))
       return new SomeService(this);
     if (parent != null)
       return parent.GetService(serviceType);
     return null;
  }

  public SomeAnotherService MyProperty
  {
    get {return new SomeAnotherService(this);}
  }
}

internal class SomeClass : SomeBaseClass
{
  public SomeClass(IServiceProvider parent)
  {
    base.parent = parent;
  }
}
  8. メタデータを最適化するには、文字列定数を使用しないで下記のように静的な文字列変数をしてください。
    const string someField = "Hello, world!" でなく static string someField = "Hello, world!" のようにしてください。
  9. アセンブリを署名して、ウィルスや再作成からソフトウェアを守ります。壊されたアセンブリを実行できないように、署名されたアセンブリを他の人が再署名することはできません。
  10. 正しく難読化されているか確認するために、複数のアセンブリブラウザでアセンブリを検査してみてください。

    参照


リフレクション(Reflection)と難読化

Reflectionは、アセンブリとそのアセンブリ内で定義される型についての情報を取得し、実行時に型のインスタンスを作成、呼び出し、アクセスする 機能です。この機能を使えば、アセンブリの内部を調べ、どんなクラスやメソッドがあるかを知ることができます。またこの機能があるからこそ、逆コンパイラーを使用すると、アセンブリから”意味の分かるソースコードの再現”が可能になります。

一方、難読化はアセンブリのメンバー名を変更するので、Reflectionの機能に悪い影響を与える場合があります。Spices.Obfuscatorはこの問題に対処するために以下にその方法を説明します。

クラス名の指定

例えばいくつかの属性は、引数として型を指定するのに二つの方法があります。
1. [LicenseProviderAttribute("MyApp.MyNameSpace.SomeClass")]
2. [LicenseProviderAttribute(typeof(SomeClass))]
最初の場合は、アセンブリのメタデータには、厳密なアセンブリ名 ("SomeAssembly, Version=1.0.0.0, Culture=neutral")ではなく、クラス名だけが保存されます。この場合、Spices.Obfuscatorはクラスの検索が二番目の方法より確実に行われ、結果としてReflectionの機能を保持します。

インターフェイスの使用

interfaceを効果的に使用してクラスの構造を複雑にします。

プログラミング言語は一つのデータ型に対して複数のインターフェイスの実装を提供しています。この機能を利用して必要な情報を取得することができます。

private string ExtractSomeInfo(object obj)
{
  ISomeInfo si = obj as ISomeInfo;
  if (si != null)
    return si.SomeInfo;
  return null;
}

属性ベースのリフレクション

属性を利用してアセンブリのメンバをマークすることができ、それにより必要に応じて必要な情報が取得できます。
public enum MarkerType
{
  unknown,
  what,
  which
}

public class MarkerAttribute : Attribute
{
  private MarkerType type = MarkerType.unknown;
  public Marker(MarkerType type)
  {
    this.type = type;
  }
  public MarkerType Type
  {
    get
    {
      return type;
    }
  }
}

internal class SomeClass
{
  [Marker(MarkerType.what)]
  private static string what = "12345";
  [Marker(MarkerType.which)]
  private static string which = "54321";
}

private string GetString(SomeClass someClass, MarkerType markerType)
{
  if (someClass != null)
  {
    foreach(FieldInfo fi in someClass.GetType.GetFields())
    {
     foreach(MarkerAttribute marker in fi.GetCustomAttributes(typeof(MarkerAttribute), false))
     {
       if (marker.Type == markerType)
        return fi.GetValue(someClass);
     }
    }
  }
  return null;
}
また、Obfuscate属性やObfuscateMembers属性を使用して、難読化するアセンブリのメンバをマスキングできます。NotObfuscate属性を使用して、特定のメンバを難読化から除外できます。
このとき、\9Rays.Net\SpicesNet5\SDK\Obfuscation AttributesフォルダのObfuscatorAttrs.csをプロジェクトに追加してください。

尚、VB.NETの場合はObfuscatorAttrs.vb、Delphiの場合はObfuscatorAttrs.pasをプロジェクトに追加してください。

using NineRays.Obfuscator;

[Obfuscate]
public class ReflectionTest
{
  [NotObfuscate]
  public int which;
  [Obfuscate]
  public int what;
  internal ReflectionTest(int data) : base()
  {
    this.which = data;
    this.what = data;
  }
}
また、 ObfuscateMembersAttribute属性を使用して、難読化されたメンバ名にマスキングを指定できます。
例えば、 ObfuscateMembersAttribute("MyCompany.Foo*")は、この該当する全クラス、メンバ、入れ子クラスを難読化します。
複数のObfuscateMembersAttribute属性を宣言に加えることができるので、難読化の定義のパターンを作成することができます。
しかし、属性を除外することは、対象に入れることよりも優先度が高いので、1つのメンバを除外すると、メンバを除外します。
下記のようにNotObfuscate属性を指定して、リフレクションで要求されたメンバを除外することができます。
using NineRays.Obfuscator;
class ReflectionTest
{
  [NotObfuscate]
  private int which;
  [Obfuscate]
  private int what;
  internal ReflectionTest(int data) : base()
  {
    this.which = data;
    this.what = data;
  }
}
NotObfuscateMembers属性もマスクパターンをサポートするので、難読化から除外するメンバのセットを指定できます。
例えば、NotObfuscateMembersAttribute("MyCompany.Foo*")は、該当する全クラス、メンバ、入れ子クラスを難読化から除外します。

参照


アセンブリの難読化のポイント

アセンブリを難読化するときは、下記の事柄を考慮してください。

  1. 信頼性を保証するためにアセンブリに署名します。厳密名のアセンブリは、再署名や名前の変更なしに変えることはできません。これは、悪意あるコードが絶対にアセンブリに入らないようにします。

  2. 安全で信頼できる場所に.snk(厳密キーファイル)を保管してください。
  3. アセンブリを難読化しても、まだ逆アセンブルできるということを覚えておいてください。
  4. クラスやクラス メンバの可視性の計画を完全に立ててください。
  5. アセンブリの機能を複数の階層(例:シリアライズされたクラス、パブリック クラス、設定やプロパティを変更するためのクラスなど)に分類してください。
  6. 難読化の設定を最適化するために、難読化したアセンブリを検証してください。
  7. 難読化に関する問題の発見と解決のため、難読化されたアセンブリのテストを行ってください。また、ローカライズや更新に関するテストも行ってください。
  8. 文字列の型が難読化されたかどうかわからない場合、文字列の型名を使用しないでください。
    例:
    [SomeAttribute(typeof(MyType))] – OK
    [SomeAttribute("MyNamespace.MyType")] – not OK
    Obfuscatorは、型名を解決できませんし、型名の引数についても不明です。
  9. 開発ツールを定期的に更新してください。
  10. クラスライブラリのデザイン時に、計画したクラスの可視性に応じてグループごとに分類することを考慮してください。 表示可能なクラス内の重要なコードの量を減らしてください。シリアライズ化とプロパティの保存機能のみ残してください。
  11. アセンブリ内のクラスの可視性を最小限にしてください。十分に注意してパブリッククラスを使用してください。
  12. 非表示の名前付けモードを使用してください。これは、アセンブリのダンプの理解を非常に困難にします。
  13. アセンブリの機能を3つの層に分けることを考慮してください。
    • Core - 完全な難読化
    • シリアライズ化とリフレクション – 部分的な難読化
    • Public classes – パブリックメンバはそのまま

参照


難読化されたアセンブリへのコードの記述

難読化されたアセンブリにコードを記述する場合いくつか注意する点があります。

  1. クラスが難読化されなかったか明確でない場合、そのクラス名をハードコードしないでください。
    (string someName = typeof(SomeClass).Name や string someName = this.GetType().Name)
  2. 例外を処理するには、次のように "try-catch" を使用してください。

例:

try
{
  //ここにコードを記述する。
}

catch (Exception e)
{
  // Gui scheme
  // MessageBox.Show(string.Format("Exception: {0}\r\nStackTrace:\r\n{1}", e.Message,   //e.StackTrace);
  //Debug scheme
  System.Diagnostics.Debug.WriteLine(string.Format("Exception: {0}", e.Message));
  System.Diagnostics.Debug.WriteLine(string.Format("Stack Trace: {0}", e.StackTrace));
}
また、コンパイルされたEXEプログラムで処理されない例外を追跡するために、AppDomain.UnhandledExceptionとApplication.ThreadExceptionにハンドラを アタッチできます。ThreadExceptionDialogクラスを使用して例外の注意を表示することができます。

参照


Spices.Obfuscatorのプロパティの設定

Spices.Obfuscatorのプロパティを編集するには、[ツール]メニューから[プラグインの管理]をクリックして、NineRays.Obfuscatorを展開してSpices.Obfuscatorを選び、[プロパティ] ボタンを押してください。

  • DefaultObfuscationOptions - プロジェクトを作成するときに、使用する難読化オプションです。
  • ShowResults - Spices.Netでの難読 の結果を表示します。
  • SilentMode - 難読化のスピードを大幅に上げるために、難読化の処理中は中間レポートを出力しません。
  • VerifyAfterObfuscation - 難読化の後に、アセンブリ(PE、IL、メタデータ構造体)を検証します。
下図は、難読の結果(難読エクスプローラと難読化マップ)を表示しています。

尚、[ツール]メニューの[難読結果]をクリックして難読化されたアセンブリを閲覧することもできます。

参照


Spices.Obfuscatorの使用

Spices.Obfuscatorの使用方法です。

  1. 難読化を行うアセンブリを開いて([ファイル]メニューから[開く]を選択して)新規プロジェクトを作成するか、既存のプロジェクトをロードします。
  2. プロジェクト の各アセンブリについて難読化オプションを設定します(図1.を参照)。
  3. [ツール]メニューの[難読化!]またはF8をクリックして難読化プロセスを開始します。
  4. 難読化の制御ボタンをクリックすることにより、難読化プロセスの一時停止や開始または終了を行うことができます(下図参照)。

  5. 難読化が終了したら、[ツール]メニューから[難読結果]をクリックして難読化されたアセンブリを閲覧することができます。難読エクスプローラのメニューから[検証]コマンドを選択するか、選択したアセンブリを外部のブラウザで開くと、難読化されたアセンブリを検証することができます(図2.を参照)。

図 1.:

図 2.:

参照


難読化に関するプロジェクト設定

ObfuscationOptionsは、アセンブリの難読化をより最適に設定するためのオプション(下記参照)です。

これらのオプションは、プロジェクトの各アセンブリに適用されます。

ObfuscationOptions.Membersには、以下の項目があります。

  • Enums - 列挙体の難読化
  • Events - イベントの難読化
  • Fields - フィールド の難読化
  • Interfaces - インターフェイスの難読化
  • Methods - メソッドの難読化
  • Namespaces - 名前空間 の難読化
  • Overridables - オーバーライド可能なメンバ(オーバーライド可能なメソッドを含んでいる場合、メソッド、プロパティ)の難読化
  • Parameters - パラメータの難読化
  • Protected - プロテクト メンバの難読化
  • Properties - プロパティ の難読化
  • Public - パブリックメンバの難読化
  • Resources - 難読化された型に関連するリソースの難読化(その他のリソースは難読化されません。)
  • Structures - 構造体の難読化
  • Types - 型の難読化(インターフェイスを除く-オプションIを参照 )
  • Use_Attributes - 難読化のコントロール属性の使用

また、ObfuscationOptions.Membersには異なった型のアセンブリのために推薦された値があります。
  • Default - 単一のDLLの難読化にお勧めです(パブリック メンバ、プロパティ、イベント、列挙体、構造体を難読化しないでください)。
  • DefaultImproved - DLL用のレベルの高い難読化です(パブリック メンバやオーバーライド可能なメンバを難読化しません)。業務用コンポーネントにお勧めです。
  • Full - EXEの難読化にお勧めです。
  • KeepsSerialization - 難読化されなかった項目のシリアライズ化で使用されるプロパティ情報、列挙体、構造体を格納するのにお勧めです。
  • KeepInheritance - メンバの継承を提供する業務用コンポーネントにお勧めです。これらのあらかじめ設定されたオーバーライド可能なメンバおよびプロテクト メンバ(パブリック メンバを含む)は難読化されません。

ObfuscationOptions.NamespacesRestructuringは、名前空間の再構成アルゴリズムを設定します。

  • AsIs - 名前空間の構造体をそのまま維持します。
  • AllTypesOneNamespace - 全ての難読化された型を1つの名前空間に入れます。
  • EachTypeOneNamespace - 難読化された型を1つの ユニークな名前空間に入れます。
ObfuscationOptions.Namingは、難読化されるメンバに名前を付けるオプションは下記の通りです。
  • Numbers - 数値で名前付けします。
  • Alphabetical - アルファベットで名前付けします。
  • AlphaNumeric - 英数字で名前付け します。
  • NonDisplayable - 表示不可能な文字で名前付けします。

AntiILDASM機能は、ILDASMユーティリティ、Jungle Decompiler.Net、Remotesoft Salamander Decompilerなど、.Netのメタデータにアクセスする中核となるアンマネージドなサービスを使用する、逆アセンブラや逆コンパイラ から守ります。

ObfuscationOptions.StringEncryptionModeは、文字列のプロテクトのモードを設定します。

  • None - 文字列のプロテクトなし。
  • Hide - 文字列の読み込み命令をコードからラッパーメソッドに移動します。
  • Encrypt - 文字列の読み込み命令をコードからラッパーメソッドに移動して、文字列を暗号化します。

文字列のプロテクト機能に関する詳細は、 こちらを参照してください。

ObfuscationOptions.UniqueNamesプロパティは、難読化されたメンバにユニークな名前を付けることができます。この機能は、コンパクトフレームワーク のアセンブリおよびVC++プロジェクトで使用されるアセンブリにお勧めです。

Spices.Net.Project.Excludes
難読化から除外するメンバを設定します。

Spices.Net.Project.ExclusionPatterns
難読化から除外するメンバ名を指定します。

Spices.Net.Project.InclusionPatterns
難読化に含めるメンバ名を指定します。
例:MyNameSpace.*, MyNamespace.MyClass.*

Spices.Net.Project.StringCryptExclusionPatterns
暗号化から除外する文字列を指定 します。
例:One*, Two, Some of the*
暗号化に含めるコレクションが設定されると、このコレクション内の文字列だけが暗号化され、Spices.Net.Project.StringCryptExclusionPatternsが 設定されると、最初にその文字列は除外にチェックさられます。

Spices.Net.Project.StringCryptInclusionPatterns
暗号化に含める文字列を指定します。
例:One*, Two, Some of the*
暗号化に含めるコレクションが設定されると、このコレクション内の文字列だけが暗号化され、Spices.Net.Project.StringCryptExclusionPatternsが 設定されると、最初にその文字列は除外にチェックされます。暗号化に含めるコレクションが設定されていない場合、Spices.Net.Project.StringCryptExclusionPatternsで指定した文字列を除くすべての文字列が暗号化されます。

Spices.Net.Project.ExportObfuscationMapFile
難読の結果(難読マップ)を保存するファイル名を設定します。

Spices.Net.Project.IgnoreVersionOfAssemblyOnResolve
参照アセンブリの解決方法を設定します。Trueの場合、検索されたアセンブリのバージョンを比較しません。

Spices.Net.Project.References
参照アセンブリの検索と解決のための検索パスを設定します。また、頻繁に使用 するパスはSpices.Net.Options.SearchPathsで設定できます。
メモ:パスが既にSpices.Net.Options.SearchPathsに設定してある場合、そのパスをProject.Referencesに 設定しないでください。

Spices.Net.Project.SaveToDirectory
難読化されたアセンブリを保存するディレクトリのパスを設定します。

Spices.Net.Project.StripDebugInfo
デバッグ可能なアセンブリを作成します。

Spices.Net.Project.StrongNameKeyFile
厳密名のファイル(.snkファイル)を設定します。

Spices.Net.Project.Substituions
手動で置き換えるメンバを設定します。これにより新しいメンバ名を設定できます。

参照


難読結果の表示

難読結果を表示するには、[Shift+F3]または[ツール]メニューから[難読結果]をクリックしてください。

メモ:難読結果を表示するには、ロードしたプロジェクトで少なくとも１回は難読化処理を行っておく必要があります。

参照


文字列のプロテクト機能

この機能には2つのモードがあります。

  • Hide – ラッパーメソッドを呼び出してloadstr命令を置換し、メソッドにロードする文字列を隠蔽します。この場合、 ロードする文字列をメインコードからサービスクラスに移動します。
  • Encrypt – ラッパーメソッドを呼び出してloadstr命令を置換し、メソッドにロードする文字列を隠蔽し、暗号化します。この場合、 ロードする文字列をメインコードから削除し、文字列を復号化して、ロード後に再度その文字列を復号化するラッパーメソッドに復号化した文字列を配置します。
    このモードでは、文字列の保護は強化されますが、パフォーマンスは減少します。
  • Spices.Net.Project.StringCryptInclusionPatternsやSpices.Net.Project.StringCryptExclusionPatternsに関しては、難読化に関するプロジェクト設定を参照してください。 これは、文字列の暗号化に文字列を設定することができます。

次のコードを参照してください。

namespace MyCompany.Mynamespace

class HelloWorld
{
  public static void Main()
  {
    System.Console.WriteLine("Hello World!");
  }
}

HideモードとEncryptモードを使用して難読化が行われると、次のようになります。

namespace MyCompany.Mynamespace

class HelloWorld
{
  public static void Main()
  {
    System.Console.WriteLine(\u21.\u1());
  }
}

これらのモードの違いは、Encryptモードはラッパーメソッドで更に文字列を暗号化します。

Hide モード

namespace MyCompany.Mynamespace
class HelloWorld
{
 public static void Main()
  {
    System.Console.WriteLine(\u21.\u1());
  }
}

//Service class, containing wrapper methods
internal class \u21
{
  internal static string \u1()
  {
   return \u21.e.GetString(h, 3 ,4);
  }
}

Encrypt モード

namespace MyCompany.Mynamespace

class HelloWorld
{
  public static void Main()
  {
    System.Console.WriteLine(\u21.\u1());
  }
}

//Service class, containing wrapper methods
class \u21
{
  internal static string \u1()
  {
    //calls string decryption method for decrypt string
    return \u21.e.GetString(h, 3 ,4);
  }
}

タンパープルーフのアセンブリの作成
(改ざんを防止するアセンブリの作成)

改ざんによる危険性は、アセンブリの厳密名が破られたり、他のキーによる再署名が行われることです。
Spices.Obfuscatorによって生成されるアセンブリは改ざんされることはありません。この特許を取得している技術は、厳密名の削除や変更などの偽装や改ざんからアセンブリを保護します。
.NETローダーによって新しく変更された厳密名が有効と認識されても、その厳密名ではアセンブリは正しく動作しません。
タンパープルーフ技術により、オリジネルとは違う厳密名キーによる再署名をおこなっても、あるいは行わなくてもアセンブリは正しく動作しません。
もしアセンブリに文字列が含まれていなくても、文字列の使用のための簡単なテストでアセンブリの妥当性を検証できます。
タンパープルーフ技術は、文字列とバイナリーリソース(ユーザー文字列とコードで使用するバイナリー配列)を暗号化し、覗き見や変更からアセンブリを保護します。

参照


Obfuscatorのコンソールを使用

アクティベーションのためのコード生成
使用法: NRObfuscator.exe /REG

難読化
使用法: NRObfuscator.exe options /SRC=inputfile(.dll, .exe files) /OUT=outputpath /KEY=keyfile /PATHS=searchpath1;searchpath2
使用法: NRObfuscator.exe /SRC=inputfile(.iloprj files)
オプション - 難読化オプションを含む文字列 [optional, default=D3]:

S - サイレントモード

難読化のためのアセンブリメンバ

  • N - 名前空間を難読化します。
  • T - 型を難読化します(インターフェイスを除く-オプションIを参照)。
  • I - インターフェイスを難読化します。
  • M - メソッドを難読化します。
  • L - フィールドを難読化します。
  • P - プロパティを難読化します。
  • E - イベントを難読化します。
  • R - パラメータを難読化します。
  • B - パブリックメンバを難読化します。
  • A - 難読化の属性コントロールを使用します。
  • U - 難読化された型に関連するリソースを難読化します。(他のリソースは難読化されません)
  • V - オーバーライド可能なメンバ(メソッド、プロパティ - オーバーライド可能なメソッドが含まれている場合)を難読化します。
  • C - 列挙体のクラスを難読化します。
  • S - 構造体のクラスを難読化します。
  • D - [あらかじめ定義された] Default オプションでの難読化 (NTMLIRAUV)
  • F - [あらかじめ定義された] Full オプションでの難読化 (D+BPE = NTMLPEBIRAUV)
  • K - [あらかじめ定義された] KeepsSerialization オプションでの難読化 (D+BS = NTMLBIRAUVS)

名前空間の再構成:

  • * - 難読化されたすべての型を1つの名前空間に入れます。
  • ^ - 難読化されたそれぞれの型を1つの名前空間に入れます。

AntiILDASM モード:

  • % - Simple(antiILDASM.True),
  • # - Complete(antiILDASM.Complete)

増分難読化:

  • 5 - 増分難読化を使用します。

文字列のプロテクトモード:

  • 8 - (暗号化せずに)文字列を隠蔽します。
  • 9 - 文字列を暗号化します。

名前付けモード:

  • 1 - 数値
  • 2 - アルファベット
  • 3 - 英数字
  • 4 - 表示不可能な文字を使用します。(デフォルトでの使用をお勧めします)

Mode 4 は表示不可能な名前を生成します。これは、LDASMや一般的なアセンブリブラウザ、AL.exeによるアセンブリのプレビューさ 防ぎます。

難読化オプションのモードやパラメータの順番は重要ではありません。

/SRC=inputfile – 難読化するファイルへのパスです。
注意: 入力ファイルとしてSpices.Project (.iloprj) を使用する場合、オプション、出力、キーファイルは無視されます。

/OUT=outputpath - 難読化されたファイル結果を出力するためのパスです。
注意: /SRC がSpices.Project (.iloprj)のばあい、そのSaveToDirectoryは、/OUTの引数の値でオーバーライドされます。

/KEY=keyfile – アセンブリを署名する場合の厳密名のキーファイル(.snk file)へのパスです。
/PATHS=searchpath1;searchpath2 - アセンブリを解決するための検索パスです。

例:
NRObfuscator.exe D*1 /SRC=your.dll /OUT=..\new
NRObfuscator.exe /SRC=your.exe /OUT=D:\TMP\NEW /KEY=yourexe.snk
NRObfuscator.exe F5 /SRC=your.exe;somedll.dll /OUT=D:\TMP\NEW /KEY=yourexe.snk /PATHS=C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322
NRObfuscator.exe 2NTMLPER /SRC=your.dll /OUT=D:\new /KEY=yourdll.snk
NRObfuscator.exe /SRC=your.iloprj /PATHS=C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322

プロジェクトファイルの使用:

Spices.Obfuscator Console製品でプロジェクトファイルを使用する場合は、「OptionsGUI.exe」を使用してSpicesプロジェクトファイル（.iloprj）を作成することができます。尚、このプログラムはインストールフォルダーの\9Rays.Net\SpicesNet5\SDK\ILOProject をビルドした ものです。

参照


難読化されたアセンブリのデバッグ

Spices.VSIP.Net や Spices.VSIP.Net Obfuscator ではVisual Studioの環境でアセンブリの難読化やデバッグが行えます。

通常、難読化されたアセンブリはオリジナルのアセンブリとまったく同じ動作をしますが、まれに難読化されたイメージが異なって動作する場合があります。この場合デバッグや原因 を追求する必要があります。（一部のメンバを難読化から除外すればこの問題を解決できることがあります。）

Spices.Obfuscator.Netは、独自のマネージド・メタデータエンジンやPE生成エンジンを使用し、すべてのデバッグ情報を保管します。

難読化したアセンブリデバッグするには、

・下図のようにSpices.ProjectのStripDebugInfoプロパティをFalseに設定

・Spices.ProjectのSaveToDirectoryプロパティをVisual Studioがビルドしたアセンブリを出力するディレクトリに設定

を行ってください。

これにより、難読化したファイルをVisual Studioでビルドしたファイルに置き換えて、通常通りVisual Studioでコードをデバッグすることができます。

参照


アセンブリのリソースのローカライズ

Spices.Localizerは、アセンブリをローカライズし、さまざまなカルチャのダイアログや文字列のリソースを作成します。

Spices.Localizerは、Spices.Net環境に統合されるので、プロジェクト全体でのシームレスな操作を提供します。

Spices.Localizerで生成されたファイルを使用して、Spices.Obfuscatorで難読化されたアセンブリをローカライズすることができます。

Spices.Localizerインターフェイスのサンプルと操作方法は下記のとおりです。

アセンブリをローカライズするには:

  1. プロジェクトをロードする。
  2. [ツール]メニューから[Localizer]を選択する。
  3. [ローカライズ可能な情報の作成]をクリックする。
  4. ローカライズ情報を保存するファイル名を指定して、[保存]をクリックする。

ローカライズ可能な情報を生成し、ロードしてください。[Yes]をクリックしてください。

右パネルにはローカライズ可能なリソース一覧が表示されます。

このツールバーでローカライズ化のカルチャを指定し、リソースを切り替えてローカライズされた情報を保存してください。

ヒント: 例えば、新しいリソースをアセンブリに追加してある場合に、次のようにローカライズ可能な情報を同期させることができます。

  1. 更新したアセンブリのローカライズ可能な情報を生成してください。
  2. 以前に使用したローカライズ可能な情報を読み込んでください。
  3. [ツール]メニューをクリックして、[Localizer]を選択します。
  4. [ローカライズ可能な情報を同期する]を選択して更新ファイルを指定します。
  5. プログラムはローカライズ可能な情報を マージします。ローカライズ化に必要な、追加されたり変更されたしたリソースを参照することができます。

参照


MSBuildの統合

MSBuild(Microsoft Build Engine)は、Microsoft および Visual Studio の新しいビルド プラットフォームです。MSBuild を使用すると、独自のXMLフォーマットのファイルに従ってソフトウェアの処理方法とビルド方法を完全に制御できます。
Spices.Obfuscatorは、このMSBuildと統合して使用することができます。このため、Spices.Netの製品にはNineRays.Build.Tasks.dllが含まれています。

NineRays.Build.Tasks.dllで提供されているタスク の登録

  1. .Net 2.0のMicrosoft.Common.Tasksファイルを見つけます。(通常はC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727フォルダ にあります。)
  2. このファイルをテキスト エディタで開いてください。
  3. NineRays.Build.Tasks.dllのパスを下記のように設定してください。通常は下記のようになります。
    <UsingTask TaskName="Obfuscator" AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

NineRays.Build.Tasks.dllで提供されているタスクの使用

次の例は、Obfuscatorのタスクを呼び出すプロジェクトファイルです。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="Obfuscator"
        AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

    <Target Name="Spices.Obfuscator">
        <Obfuscator
          InputFiles="$(TargetFileName)"
          Options_Members="KeepInheritance"
          Options_Naming="NonDisplayable"
          Options_Anonymizer="Minimum"
          Options_MixDictionary="true"
          Options_StringEncryptionMode="3DES"
          Options_antiILDASM="True"
          StrongNameKeyFile="..\myKeyFile.snk" />
    </Target>
</Project>

NineRays.Build.Tasks.dllで提供されているタスクの使用その２

MSBuildでカスタムタスクを使用する場合、<Import/>構文と一緒に使います。

<Import Project="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.targets"/>

NineRays.Build.Tasksを使用した、サンプルのビルドファイルを参照してください。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ...
  <ItemGroup>
    <Compile Include="CodeMessages.cs" />
  </ItemGroup>
  ...
  <Import Project="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.targets"/>
  <Target Name="Obfuscate">
     <Obfuscator
       InputFiles="$(TargetFileName)"
       Options_Members="KeepInheritance"
       Options_Naming="NonDisplayable"
       Options_Anonymizer="Minimum"
       Options_MixDictionary="true"
       Options_StringEncryptionMode="3DES"
       Options_antiILDASM="True"
       StrongNameKeyFile="..\myKeyFile.snk" />
  </Target>
</Project>

参照


Obfuscator タスク

Obfuscator タスクの使用

次の例は、プロジェクトファイルがObfuscatorタスクを呼び出します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="Obfuscator"
        AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

    <Target Name="Spices.Obfuscator">
        <Obfuscator
          InputFiles="$(TargetFileName)"
          Options_Members="KeepInheritance"
          Options_Naming="NonDisplayable"
          Options_Anonymizer="Minimum"
          Options_MixDictionary="true"
          Options_StringEncryptionMode="3DES"
          Options_antiILDASM="True"
          StrongNameKeyFile="..\myKeyFile.snk" />
    </Target>
</Project>

Obfuscator タスクのパラメーター

Obfuscator タスクのパラメーターは下記の通りです。
パラメーター名 | 内容
InputFiles | [;]で区切られた実行可能ファイル(.dll、.exe ファイル)、Spices.Project(.iloprj)、または Spices.Solution(.ilosln)の一覧
OutputPath | 難読結果を保存するパス
SearchPaths | [;]で区切られた検索パスの一覧
StrongNameKeyFile | 難読化を行った後にアセンブリを再署名するための厳密名のキーファイル(.snk)へのパス。
CheckConsistencyBeforeObfuscation | 難読化前のプロジェクトのアセンブリの整合性検査
StripDebugInfo | trueの場合、デバッグ情報を除去します。 falseの場合、デバッグ情報を更新します。
VerifyAfterObfuscation | 生成されたアセンブリのメタデータを検証します。
ObfuscationEvents_AfterAssemblyGeneration | 難読化されるアセンブリの生成後に実行されるコマンドライン
ObfuscationEvents_BeforeAssemblyGeneration | 難読化されるアセンブリの生成前に実行されるコマンドライン
ObfuscationEvents_AfterAssemblySign | アセンブリの再署名後に実行されるコマンドライン
ObfuscationEvents_BeforeAssemblySign | アセンブリの再署名前に実行されるコマンドライン
ObfuscationEvents_AfterProjectGeneration | プロジェクトの難読化されるアセンブリの生成後に実行されるコマンドライン。
ObfuscationEvents_BeforeProjectGeneration | プロジェクトの難読化されるアセンブリの生成前に実行されるコマンドライン。
ObfuscationEvents_AfterProjectObfuscation | プロジェクトの難読化後に実行されるコマンドライン。
ObfuscationEvents_BeforeProjectObfuscation | プロジェクトの難読化前に実行されるコマンドライン。
ObfuscationEvents_AfterProjectSign | プロジェクトのアセンブリの再署名後に実行されるコマンドライン。
ObfuscationEvents_BeforeProjectSign | プロジェクトのアセンブリの再署名前に実行されるコマンドライン。
Options_Members | オーバーライドするためにObfuscationOptions.Membersを指定します。
Options_Anonymizer | オーバーライドするためにObfuscationOptions.Anonymizerを指定します。
Options_antiILDASM | オーバーライドするためにObfuscationOptions.antiILDASMを指定します。
Options_IncrementalObfuscation | オーバーライドするためにObfuscationOptions.IncrementalObfuscationを指定します。
Options_MixDictionary | オーバーライドするためにObfuscationOptions.MixDictionaryを指定します。
Options_NamespaceRestructuring | オーバーライドするためにObfuscationOptions.NamespaceRestructuringを指定します。
Options_Naming | オーバーライドするためにObfuscationOptions.Namingを指定します。
Options_SoftwareWatermark | オーバーライドするためにObfuscationOptions.SoftwareWatermarkを指定します。.
Options_StringEncryptionMode | オーバーライドするためにObfuscationOptions.StringEncryptionModeを指定します。
Options_UniqueNames | オーバーライドするためにObfuscationOptions.UniqueNamesを指定します。

参照


AssemblyVerify タスク

AssemblyVerify タスクの使用

次の例は、プロジェクトファイルがAssemblyVerifyタスクを呼び出します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="AssemblyVerify"
        AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

    <Target Name="Verification">
        <AssemblyVerify
          InputFiles="mylib.dll;myexe.exe"/>
    </Target>
</Project>

AssemblyVerify タスクのパラメーター

AssemblyVerify タスクのパラメーターは下記の通りです。
パラメーター名 | 内容
InputFiles | 検証するために[;]で区切られた実行可能ファイル(.dll、.exeファイル)の一覧です。

参照


ConsistencyCheck タスク

ConsistencyCheck タスクの使用

次の例は、プロジェクトファイルがConsistencyCheckタスクを呼び出します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="ConsistencyCheck"
        AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

    <Target Name="CheckConsistency">
        <ConsistencyCheck
          InputFiles="myprj.iloprj;my2prj.iloprj"/>
    </Target>
</Project>

ConsistencyCheck タスクのパラメーター

ConsistencyCheckタスクのパラメーターは下記の通りです。
パラメーター名 | 内容
InputFiles | 整合性を検査するために[;]で区切られたSpices.Projectファイル(.iloprj)、または一つのSpices.Projectファイルの一覧です。

参照


AssemblyResign タスク

AssemblyResignタスクの使用

次の例は、プロジェクトファイルがAssemblyResignタスクを呼び出します。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <UsingTask TaskName="AssemblyResign"
        AssemblyFile="C:\Program Files\9Rays.Net\Spices5\Bin\NineRays.Build.Tasks.dll"/>

    <Target Name="ReSignAfterObfuscation">
        <AssemblyResign
          InputFiles="my.dll;my.exe"/>
    </Target>
</Project>

AssemblyResignタスクのパラメーター

AssemblyResignタスクのパラメーターは下記の通りです。
パラメーター名 | 内容
InputFiles | 再署名するために[;]で区切られた実行可能ファイル(.dll、.exeファイル)の一覧です。
StrongNameKeyFile | アセンブリを再署名するための厳密名のキーファイル(.snk)へのパスです。

参照


Spices.Decompiler

Spices.Decompilerは、Spices.Netに統合されているプラグインです。

プラグインをインストールするを行った後に、ツールバーには新しいボタン[ [image]]が、ツールメニューとエクスプローラのメニューには新しいメニュー項目が表示されます。

これで、Spices.Decompilerの準備ができました。
プロジェクトをロードし、逆コンパイルするアセンブリメンバと必要な逆コンパイル言語を選んでください。

参照


概要

Spices.Decompilerは、アセンブリを逆コンパイルしてC#、VB.NET、IL、J#、C++またはDelphiのソースコードを生成することができます。

Spices.DecompilerはSpices.Net環境に統合されているので、プロジェクト全体または選択したアセンブリやモジュールの逆コンパイル ができます。

Spices.Decompilerを使用して、アセンブリやプロジェクト内でのメソッドの呼ばれ方がわかるコードフローダイアグラムの構築ができます。 プロジェクトの階層構造を解析して、設計上の バグなどのエラーの発見に役立ちます。

Spices.Decompilerの基本的な機能の一覧は下記の通りです。

機能 | 内容
複数言語での逆コンパイル/逆アセンブル | Spices.Decompilerは、MSIL、C#、VB.Net、Delphi.Net、J#、マネージドC++の言語でコードを生成します。
整形、最適化されたコード | Spices.Decompilerは、強調構文、インデント、折りたたみ表示(アウトライン表示)、アクティブヒントをサポートした、整形されたコードを生成します。
独自のメタデータアクセスエンジン | Spices.Decompilerは、不正なMSILでクラッシュしない独自のメタデータアクセスエンジンを使用します。
Visual Decompiler | Visual Decompilerは、Spices.Netの重要な機能の1つです。コードフロー ダイアグラムを構築することにより、実行コードが解析できます。
.Net 2.0のサポート | Spices.Decompilerは、.Net 2.0をサポートします。
逆コンパイル/逆アセンブルの範囲 | 逆コンパイルの範囲をアセンブリブラウザで選択できます
逆コンパイルするメンバの複数選択 | 逆コンパイルするメンバを複数選択できます。
アセンブリ全体の逆コンパイル | 全てのアセンブリを逆コンパイルし、リソース情報とアセンブリ情報の取得ができます。
最適化/リファクタリング | Spices.Decompilerは、最適化されていない(生の)コードや最適化された(リファクタリングされた)コードを作成できます。
アクティブ ヒント | メンバに関する詳細情報をマウスのカーソルの位置にアセンブリブラウザで表示することができます。
コードのアウトライン表示/折りたたみ表示 | コードのアウトライン表示/折りたたみ表示が全言語でサポートされています。
すべての修飾子のサポート | Spices.Decompilerは、すべての修飾子をサポートしています。
全キーワードのサポート | Spices.Decompilerは、すべてのキーワードをサポートしています。
複雑な入れ子構文 | Spices.Decompilerは、反復文(for、while、foreach)、条件文(if、else if、 if-else if-else)、スイッチ文など、複雑な構文を認識します。
変数の配置 | Spices.Decompilerは、変数を使用範囲内に配置します。
変数名の取り出し | Spices.Decompilerは、(可能な場合).PDBファイルから変数名を取り出します。
COM/Interop/アンマネージド コード | Spices.Decompilerは、COM/Interop/アンマネージド コードを逆コンパイルします。
危険なコード、ポインター | Spices.Decompilerは、ポインタとともに危険なコードを示します。
カスタム属性 | Spices.Decompilerは、カスタム属性に関する全情報を取り出します。
メソッドのオーバーロード、インターフェイス実装、オーバーライドの認識 | Spices.Decompilerは、メソッドのオーバーロード、インターフェイス実装、オーバーライドを認識します。
属性のサポート | Spices.Decompilerは、属性をサポートします。
IDEの統合 | Spices.Decompilerは、Spices.VSIP.Net (Visual Studio Integration Package)の一部としてSpices.NetとVisual Studioに完全統合されています。
他にも多数あります。

参照


実行

ここでは、アセンブリの逆コンパイルの方法について説明します。

Step 1:

動作 | 説明
Decompilerの設定 | アセンブリをロードします。ここではVisual StudioのWeatherを使用します。 アセンブリをロードしたら、[ツール]メニューから[プラグインの管理]を選択し、[逆コンパイラ]を選択して、[プロパティ]をクリックします。ここで、アセンブリ ソースを生成する言語、リファクタリングやコードの書式設定などの設定ができます。 ヒント: DecompileToFileオプションについて Trueの場合、Spices.DecompilerはVisual Studioプロジェクトを作成し、逆コンパイルされたすべてのデータを保存します。この設定は、大きなプロジェクトを逆コンパイルするのにお勧めです。 Falseの場合、Spices.Decompilerの出力は、ソースコードを表示することができるウィンドウに転送されます。これは、小さなプロジェクトのパーツをすばやく逆コンパイルするのに役立ちます。

Step 2:

動作 説明
プロジェクトの逆コンパイル

ファイルへの出力設定

ドキュメントへの出力設定

 アセンブリを逆コンパイルします。
[ツール]メニューから[逆コンパイル]を選択するか、F6キーをクリックしてください。また、言語を選択して、逆コンパイルされ たソースの保存場所を指定する必要があります。
次に、Spices.Deompilerはアセンブリの逆コンパイルを始めます。その経過をタスク一覧で参照できます。プロジェクトが逆コンパイルされたら、その結果を検証 することができます。出力をファイルに設定した場合、Visual Studioでプロジェクトを開いてください。

出力をドキュメントに設定した場合、右パネルで表示してください。逆コンパイルされたコードにマウスを移動してCTRLキーを押すと、キーワードに下線が付けられます。その下線が付けられたキーワードをクリックするとSpices.Informerのヒントが表示されます。

ヒント:
Decompiler ツールバーから [image] をクリックして アセンブリを逆コンパイルすることもできます。

メモ:
プロジェクト全体、または選択したメソッド、アセンブリまたはクラスを逆コンパイルすることもできます。そのためには、逆コンパイルする前にルート プロジェクトのノードではなく希望するメソッド、アセンブリ、またはクラスを選択してください。

Step 3:

動作 | 説明
Visual Decompilerを使用してコードフローダイアグラムを構築 | Spices.Decompilerには、プログラムの構造を表示する機能があります。コードフロー ダイアグラムは、メソッドがどのように呼び出され使用されるかを図で表示します。コードフローダイアグラムを構築するには、対象のメソッドを選択し、逆コンパイラのツールバーから [image] をクリックします。 Spices.Decompilerは、選択したメソッドのコードフローダイアグラムを構築して表示します。 ヒント: コードフローダイアグラムを構築する前に、アセンブリを逆コンパイルしておかなければなりません。

参照


使用

逆コンパイルの方法について説明します。 Decompiler menu on Spices.Net toolbar (with Options menu)

  1. Spices.Netのエクスプローラでメンバを選択する。

  2. メニューを開いて、[逆コンパイル!]を選択する。

  3. サブメニューから適切な言語を選び、クリックする。

  4. コードを最適化しないように、最適化を無効にする。(オプション)

  5. 逆コンパイルしたコードを直接ファイルにする。(オプション)
  6. ドキュメントを開いて、逆コンパイル結果を確認できます。
  7. 逆コンパイルするメンバを選択し、ツールバーの[逆コンパイル!]を選択するかF6をクリックする。メンバは前もって選択した言語に逆コンパイルされます。
  8. 逆コンパイルされたテキストを検索するには、[編集]メニューの[検索]をクリックする。

オプションの設定

逆コンパイルの結果を直接ファイルに保存

ツールバーの [image] を押すか、下記のように設定してください。
1.ToolメニューのManage PlugInsを選択
2.PlugIns EditorのNineRays.Decompilerを選択
3.Propertiesボタンを押す
4.オプションのDecompileToFileをTrueに設定

コードの最適化

ツールバーのを [image] 押すか、下記のように設定してください。
1.ToolメニューのManage PlugInsを選択
2.PlugIns EditorのNineRays.Decompilerを選択
3.Propertiesボタンを押す
4.オプションのOptimizeCodeをTrueに設定

Regioning (ソースコードに必要に応じて #Region ～ #End Region を付加します。)

ツールバーのを [image] 押すか、下記のように設定してください。
1.ToolメニューのManage PlugInsを選択
2.PlugIns EditorのNineRays.Decompilerを選択
3.Propertiesボタンを押す
4.オプションのRegioningをTrueに設定

メモ:体験版は最適化コードを作成しません。ランダムで式や構文を体験版の注意分に置換します。

参照


オプション

Edit Spices.Decompiler options in the Plugin Manager
Spices.Decompilerのオプションを編集するには、プラグインマネージャを呼び出さなければなりません。[ツール]メニューの[プラグインの管理]をクリックして、[NineRays.Decompiler]を選択して展開し、Spices.Decompilerのノードを選択してください。プラグインを選択したら、[プロパティ]ボタンをクリックしてください。

  • オプション
    • DecompileNestedClasses - 入れ子のクラスの逆コンパイルを有効/無効にします。
    • DecompileToFile - 生成されたコードをファイルに出力します。
      DecompileToFileOptions.ClassesSeparationOptionsがSeparateByClassNameまたはSeparateByNamespaceに設定された場合、出力は複数のファイルに保存されます。.
    • OptimizeCode - 生成されたコードの最適化(リファクタリング)を行います。
    • OutlineMode - コードをアウトライン表示で生成します(メソッドのボディなし、メンバ定義のみ)。
    • OutputStatistics - 逆コンパイル エンジンの統計を出力します。
  • HotKey - 逆コンパイルを開始するショートカットです。
  • DefaultLanguage - 逆コンパイルのデフォルト言語です。
  • DecompileToFileOptions - ファイルに逆コンパイルするためのオプションです。
    • ClassesSeparationOptions - アセンブリを逆コンパイルするためのオプションです。生成されたコードをファイルに分類する方法(クラス名ごと、名前空間ごと、分類なし)を選択できます。
    • DefaultDecompilationFolder - 生成されたコードを保存するフォルダです。このプロパティ値が空の場合、生成されたコードはdecompiled assembly location\SpicesDecompilerOutputフォルダに保存されます。
    • ExtractManagedResources - 逆コンパイル時にマネージド リソースの取り出しを有効/無効にします。
    • GenerateAssemblyInfo - アセンブリ情報ファイル(アセンブリの関連属性を含むコードファイル)の生成を有効/無効にします。
    • PromptForFileNames - Trueの場合、コードを生成するためのファイル名を聞いてきます。
    • PromptForSelection - Trueの場合、逆コンパイルするメンバ一覧を聞いてきます。

参照


Spices.Documenter

Spices.Documenterは、コードに関連するドキュメンテーションの作成および管理を行います。
既存のドキュメンテーションをSpices.Documenterの.nrdocにインポートしたり、あるいはプロジェクトから 新規にドキュメンテーションを作成することができます。
メモ: 体験版では、トピックの半分ほどがXMLにエクスポートできます。

参照


概要

Spices.Documenter を使用して、プロジェクトのコードのドキュメンテーションを作成し、XML(/doc) 形式にエクスポートすることもできます。

Spices.Documenterはプロジェクトの全体や選択したアセンブリ/モジュールのドキュメンテーション機能を提供します。

Spices.Documenterの基本的な機能は下記の通りです。

機能 | 内容
GUIの利点 | Spices.Documenterで提供されるGUIは、コードのドキュメンテーションの閲覧やナビゲート、ブックマークへのトピックの表示/追加が行えます。 コード コンプリート機能は、ドキュメントを入力すると文章の前後にドキュメント タグを追加するのでドキュメントの編集に役立ちます。 Spices.Documenterで提供されているさまざまなサービスにより、入力、書式、他のトピックへのリンク付け、などが行えます。
ソースコード外でのドキュメンテーションの管理 | Spices.Documenterは、ソースコード外でのコードのドキュメンテーションの管理ができます。
データのインポート、結合、取り出し | Spices.Documenterは、既存のxmldocをインポートして、アセンブリのメタデータからアセンブリメンバの記述を取り出すことができます。また、ドキュメンテーションを結合したり更新することもできます。
１つのファイルに全ドキュメントを入れる | Spices.Documenterは、ドキュメンテーションの管理を簡素化するために複数のアセンブリに関する全ドキュメンテーションを1つのファイルに保存します。
互換性の利点 | Spices.Documenterの.nrdoc形式は、xmldocと互換性があります。インクルードタグを使用して、これらの形式のさまざまなファイルから、ドキュメンテーションの一部を結合することができます。 Spices.DocumenterはNDocの指定タグを使用できます。また、ドキュメンテーションをXmlDoc (/doc)と別のNDocの互換形式にエクスポートできます。
トピックの管理 | Spices.Documenterは、プロセスから特定のトピックを除外することができます。
ドキュメンテーションの同期 | Spices.Documenterは、ドキュメンテーションと該当するアセンブリの最新版を同期するサービスを提供します。新規/変更トピックは、トピックの処理がし易いようにTODOとして表示されます。

参照


実行

ここでは、プロジェクトのドキュメントの作成方法について説明します。

Step 1:

動作 | 説明
ドキュメントの作成 | プロジェクトをロードします。ここでは、WeatherというVisual Studioのデモを使用します。 プロジェクトをロードしたら、どの部分をドキュメントにするか指定します。プロジェクト全体または単一のアセンブリを選択できます。ここでは、プロジェクト全体をドキュメントにする方法を説明します。 [ツール]メニューの[Documenter]またはツールバーの [image] をクリックします。 Spices.Documenterは、選択範囲のドキュメントを作成します。作成されたら、ドキュメントを閲覧して特定のメソッドまたはプロパティのどの部分がドキュメントになったのかを確認できます。

Step 2:

動作 説明
ドキュメンテーションのエクスポートと同期

 作成したドキュメントを/doc形式にエクスポートできます。そのためには、
  1. [ツール]メニューから[Documenter]を選択してください。
  2. [XMLにエクスポート]を選択してください。
  3. ファイル名を指定して[保存]をクリックしてください。

また、ドキュメンテーションを同期することもできます。例:変更された情報、新しいアセンブリ/メンバの情報を追加する場合。
  1. [ツール]メニューから[Documenter]を選択してください。
  2. [同期]を選択してください。
Spices.Documenterは、読み込まれたアセンブリを再度スキャンして、そのアセンブリとカレントのドキュメンテーションの違いを表示します。

TODOリストを見ながら、必要な情報を容易にドキュメントに追加できます。

参照


使用

Documenterで提供されているタスクは下記の通りです。

  1. 既存のドキュメンテーションをNRDocにインポート
    新規プロジェクトを作成するには、NRDocにインポートするドキュメンテーションのアセンブリを開きます。
    • [ファイル]メニューの[開く]をクリックして、ロードするアセンブリ/プロジェクトを選択します。
    • 1つのアセンブリのドキュメンテーションだけをインポートする場合は、アセンブリブラウザでそのアセンブリを選択し、[ツール]メニューの[Documenter]から[選択したアセンブリのNRDocを生成する]をクリックし ます。
    • プロジェクト全体のドキュメンテーションをインポートする場合は、[ツール]メニューの[Documenter]から[プロジェクト全体のNRDocを生成する]をクリックし ます。
  2. NRDocドキュメンテーションの同期
    • 既存の.nrdocファイルを開きます。
    • [ツール]メニューの[Documenter]から[同期]をクリックして、既存のドキュメンテーションとそのアセンブリに関連するドキュメンテーションを同期 します。
    • 変更されると、追加/変更のトピックに関するレポートを取得します。これらのトピックは、TODOトピックとして赤い色で表示されます。
    • 同期 を行った後に、トピック ブラウザのメニューを使用して、TODO属性のトピックを表示することができます。
  3. XMLドキュメンテーション(/doc)のエクスポート
    • 既存の.nrdocファイルを開くには、[ファイル]メニューの[開く]をクリックして、ファイルの種類(例:Spices.Documenterファイル)を選択し ます。
    • [ツール]メニューの[Documenter]から[XMLドキュメンテーションにエクスポート]をクリックして、カレントのNRDocumentからxmlドキュメンテーション ファイルを作成します。

NRDocumentのブラウザには、下記のメニューコマンドがあります。

  1. ブックマークメニュー - トピックをブックマーク一覧に追加します。
  2. TODO メニュー - NRDocumentのTODO'sタスクを管理します。まだ終わっていないトピックにコメントを付けることができます。
  3. ノードの削除 - トピックを削除します。一部のトピックは同期のプロセスで修復されるので、削除するトピックを除外するトピックとしてマークしておくことをお勧めします。
  4. トピックをドキュメンテーションの作成に含めたり除外したりするには、ノードのチェックボックスをオンまたはオフにしてください。

NRDocumentエディタのメニューでサポートされている機能

  1. 「コード コンプリート」タグの拡張可能な一覧です。一覧をカスタムタグで拡張するには、[コード コンプリート]の[コード コンプリートへの追加]をクリックします。
  2. ヘルパーの書式設定:テキストを太字または斜体にするには、[太字]または[斜体]をクリックします。
  3. テキストにメンバへの参照を挿入するには、[メンバへの参照の挿入]をクリックします。
  4. テキストにURLを挿入するには、[Urlの挿入]をクリックします。
  5. テキストにイメージを挿入するには、[イメージの挿入]をクリックします。
  6. [コードコンプリート]ウィンドウを表示するには、[Ins]キーを押してください。

参照


Spices.Informer

Spices.Informerは、アセンブリメンバに関する情報を取得し、アセンブリの解析に便利な機能を提供するプラグインです。

参照


概要

Spices.Informerを使用して、トークンの情報、実装および継承されたインターフェイスなど、プロジェクトに関するさまざまな情報やプロジェクトのアセンブリ メンバの使用状況などを把握することができます。この機能はプロジェクトの最適化を行うもので、全く使用されていないメンバを発見してプロジェクトから削除することができます。

Spices.Informerは実装、継承されたインターフェイスの階層構造を表示したり、プロジェクトを最適化することができます。

Spices.Informerは、ショートカットメニューから容易にアクセスできます。プロジェクトまたはアセンブリを右クリックして、希望するオプションをInformerのドロップダウンメニューから選択できます。

Spices.Informerの基本的な機能は下記の通りです。

機能 | 内容
使用利用状況の取得 | プロジェクトメンバの使用状況や、アセンブリメンバの使用に関する詳細な情報の表示ができます。また使用されていないメンバの表示もできます。これにより、プロジェクトの最適化が行えます。
メンバの完全な詳細の表示 | アセンブリメンバの詳細な情報が表示できます。情報の閲覧や検証ができます。
トークン情報の表示 | すべてのアセンブリのトークンに関する情報を持っています。トークンを選択するだけで、その全詳細が表示されます。
実装の表示 | カレントのプロジェクトに実装されているすべてのインターフェイスの階層構造を表示します。
継承の表示 | カレントのプロジェクトに継承されているすべてのインターフェイスの階層構造を表示します。

参照


実行

9Rays.Spices.Net Documentation

ここでは、プロジェクトの詳細な情報の表示とその解析方法について説明します。

Step 1:

動作 | 説明
メンバの利用統計の表示 | アセンブリをロードします。ここではIEHost.dllを使用します。 (このファイルはC:\WINDOWS\Microsoft.NET\Framework\v... にあります。) ルートノードを右クリックし、[Informer]を選択し、[メンバの利用統計]をクリックします。統計が計算されるまで待ってください。ロードされる アセンブリのサイズに応じて平均時間を取ります。 統計の準備ができると、右パネルに表示されます。各欄をクリックして適切な順番でリストをソートすることができます。

Step 2:

動作 | 説明
トークン情報の表示 | アセンブリのトークン情報を参照します。プロジェクトを展開してIEHostモジュールを選択します。 そのモジュールを右クリックして、[Informer]を選択し、ショートカットメニューから[トークン情報]を選択します。トークン情報はダイアログボックスに表示されます。 ヒント: これは、モードレスダイアログです。画面上に表示されている間に他のプロジェクト項目を閲覧してみてください。カレントの選択に関するトークン情報を取得するには、[情報入力]ボタンを いつでもクリックしてください。プロジェクト エクスプローラで指定したトークンを検索するには、トークン値を入力し、[検索]ボタンをクリックしてください。

Step 3:

動作 | 説明
インターフェイスの継承の参照 | プロジェクトのルートノードを選択し、右クリックします。Informerを選択して、[継承の表示]をクリックしてください。 Spices.Informerは、カレントのプロジェクトで継承されているインターフェイスを表示します。更に詳細表示する場合は、右パネルからツリーノードを 展開してください。

Step 4:

動作 | 説明
インターフェイス実装の参照 | プロジェクトのルートノートを選択し、右クリックします。Informerを選択して、[実装の表示]をクリックしてください。 Spices.Informerは、カレントのプロジェクトで実装されているインターフェイスを表示します。更に詳細表示する場合は、右パネルからツリーノードを 展開してください。

参照


使用

Spices.Informerのツールを使用するには、[ツール]メニューから[Informer]をクリックします。

トークン情報ツール

  1. [ツール]メニューの[Informer]の[トークン情報]をクリックします。
  2. Informerダイアログで、トークン(16値)を入力して、そのトークンに関する詳細情報を取得してください。

  3. そのトークンに関連するアセンブリメンバをアセンブリブラウザで選択するには、[検索]ボタンをクリックしてください。

継承の表示ツール

継承のツリーを表示するには、[ツール]メニューの[Informer]の[継承の表示]をクリックします。

実装の表示ツール

実装のツリーを表示するには、[ツール]メニューの[Informer]の[実装の表示]をクリックし ます。

メンバの利用統計ツール

メンバの利用統計一覧を表示するには、[ツール]メニューの[Informer]の[メンバの利用統計]をクリックし ます。

詳細情報を参照するには、表示されたメンバ一覧からメンバを選択します。

参照


Spices.Modeler

Spices.Modelerは、Spices.Projectのダイアグラムの構築を行うSpices.Netの新しいプラグインです。

Spices.Modelerダイアグラムの機能は下記の通りです。

  • ダイアグラムの要素の配置や移動、削除。
  • ダイアグラムの要素の選択の拡張。
  • 要素の入力/出力の強調表示。
  • ダイアグラムの要素の展開 と縮小。
  • ダイアグラムのズーム。
  • ダイアグラムの印刷。
  • ダイアグラムのイメージ(ラスタまたはベクタ)やXML形式での保存。
  • XML形式で保存してあるダイアグラムのロード。

Spices.Modeler Assembly Relations Diagram

Spices.Modelerは、.smdファイル(Spices Modelerダイアグラム)をSpices.Net環境に関連付けます。

参照


概要

Spices.Modelerは、プロジェクトのダイアグラムを生成することが出来ます。

Spices.Modelerは、 要素の関係を示すプロジェクトのダイアグラムを構築することができます。これにより、プロジェクトの階層構造を解析し 、設計上の欠陥が発見しやすくなります。また、デバッグやトレースに使用することもできます。

Spices.Modelerのサンプルと基本的な機能は下記の通りです。

Spices.Modelerの画面です。

  1. 右側のダイアグラムパネルが、モデリングの行うメインの作業領域です。
    このパネルで、オブジェクトのドラッグ、サイズ変更、移動、その他の操作が行えます。
    パネルやその中のオブジェクトを選択してマウスを右クリックすると、ポップアップメニューが表示されます。オブジェクトやダイアグラムに色々な操作を行うことができます。

  2. ダイアグラムパネルの上部のタブを使用して、他のダイアグラムに切り替えることができます。

  3. 左側のダイアグラムライブラリパネルには、現在使用可能なすべてのダイアグラムが表示されます。ここで使用するダイアグラムを選択することができます。

  4. ダイアグラムライブラリの下のプロパティ ウィンドウには、プロジェクトや要素のプロパティに関する情報が表示されます。

機能 | 内容
プロジェクトの可視化 | プロジェクトの関係を視覚的なダイアグラムで構築します。色々な種類のモデル(アセンブリの従属性、関係、実装、継承など)を構築するために、あらかじめ定義されたさまざまなモデルテンプレート を選択できます。
ライブ モデル | モデルの要素の処理(ズームイン/アウト、移動、サイズ変更、レイアウトの変更、書式設定)を行うことができます。
完全な再利用性 | ダイアグラムを変更して必要に応じて調整したら、テンプレートとして保存して他のプロジェクトで使用することができます。.
完全な移植性 | ダイアグラムを一般的なイメージ形式にエクスポートできるので、ユーザーズガイドやプレゼンテーションなどの作成に使用できます。モデルを好きな用紙サイズに印刷して、レポート、ドキュメンテーション、再配布に含めることができます。
拡張ナビゲーション | オブジェクトがどこに属しているかを容易に認識できるように、オブジェクトや関連する階層構造のリンクを強調表示します。これをもとにダイアグラムのナビゲート を行ってください。

参照


実行

ここでは、プロジェクトの詳細な情報の表示と解析と、ドキュメントの作成方法について説明します。

Step 1:

動作 | 説明
準備 | アセンブリをロードします。ここではIEHost.dllを使用します。 (このファイルはC:\WINDOWS\Microsoft.NET\Framework\v... にあります。) プロジェクトをロードしたら、[ツール]メニューから[Modeler]を選択するか、CTRL+F9を押してください。

Step 2:

動作 | 説明
ダイアグラムの構築 | アセンブリの継承型と実装を示すダイアグラムを構築します。 Spicesのエクスプローラをクリックしてください。[ダイアグラム]の項目をダブルクリックします。カレントのプロジェクトを保存するファイル名を指定してください。ファイル名を入力して、[保存]をクリックします。ダイアグラムが構築され、表示されるまで待ってください。

Step 3:

動作 | 説明
ダイアグラムの構成 | Spices.Modelerは、階層構造に応じてデフォルトでダイアグラム オブジェクトを配置します。またこの配置を変更することができます。 ダイアグラムを右クリックして、[全表示]を選択すると、ダイアグラム全体が表示されるようになります。では、オブジェクトのグループを選択して、左側にドラッグしてください。Spices.Modelerは、そのオブジェクトが アセンブリにどのように統合されているかを把握できるようオブジェクトとその関係を強調表示するのがわかります。

Step 4:

動作 | 説明
詳細表示 | アセンブリの詳細をダイアグラムに表示することができます。 Spices.Modelerは、子エレメントが表示されるようアセンブリ、名前空間、クラスを展開できます。 オブジェクトを展開し、子エレメントを表示するには、+ をクリックしてオブジェクト名を表示してください。 ヒント:オブジェクトが、子を持った別のオブジェクトを含んでいる場合、そのオブジェクトも展開してツリーのような階層構造に表示されます。

Step 5:

動作 | 説明
ダイアグラムの配布 | ダイアグラムを右クリックして、[名前を付けて保存]を選択してください。適切なイメージ形式をダイアグラムから選択し、ファイル名を入力します。 OKをクリックしてダイアグラムを保存します。Spices.Modelerは、選択したダイアグラム エレメントのみを保存することに注意してください。 ダイアグラム全体を保存したい場合、空のダイアグラムの領域をクリックして選択を消してください。 SMD形式に保存すると、別のプロジェクトで再利用できる、ダイアグラムのテンプレートを作成することができます。 ヒント:また、適した用紙形式にダイアグラムを印刷することもできます。ダイアグラムのショートカットメニューから[印刷]を選択して、印刷オプションを指定してください。

参照


使用

ダイアグラムの一覧では、アセンブリブラウザで選択されたものが表示されます。
Spices.Modelerを使用する前に、アセンブリブラウザでメンバ(またはアセンブリ、アセンブリメンバ、名前空間、クラス)を選択して、 [image] アイコンをクリックし、関連するダイアグラム の一覧を取得してください。

Diagram List

一覧から必要なダイアグラムを選択して[Enter]をクリックするか、ダイアグラムをダブルクリックして構築してください。

Spices.Modelerビューアのメニューを使用して、ダイアグラムに関する全操作を行うことができます(上図参照)。

参照


Spices.Investigator

Spices.Investigatorは、低レベルのPE形式や.Netのメタデータの要素を表示、閲覧するプラグインです。
Spices.Investigatorは、すべてのPEヘッダー、セクション、ディレクトリ、メタデータ テーブル、.Netアセンブリを含むストリームの閲覧をサポートします。
PE形式の要素では、バイナリ表示が可能です。バイナリ形式での操作(goto、選択設定、ダンプの保存、選択の保存など)も行えます。

下図は、選択したアセンブリのタイプ参照テーブルです。

参照


概要

Spices.Investigatorは、ヘッダー、メタデータ、メタストリームなど低レベルのアセンブリ情報が取得でき、バイナリでアセンブリ データを表示することもできます。

Spices.Investigatorを使用して、プロジェクトのバイナリコードを簡単に検証できます。これは、プロジェクトを逆アセンブルする場合や、効果的 なコンパイルを確認する場合に役立ちます。

Spices.Investigatorのサンプルと基本的な機能は下記の通りです。

機能 | 内容
PEのコードとデータの閲覧 | PE構造体の表示ができます。PE構造体の要素(セクション、ディレクトリ、プロパティ)の解析やダンプができます。この情報は、プロパティブラウザとバイナリ ビューア で表示されます。
低レベルでの.NETメタデータの閲覧 | 低レベルでの表示や.NETメタデータの検証ができます。テーブルとストリームを表示することができます。メタデータブラウザは、Spices.Net環境に 組み込まれ、プロジェクトのメタデータを検証するための豊富な機能があります。
バイナリ表示 | .NETアセンブリのバイナリでの表示や閲覧、操作をサポートするバイナリ ビューアがあります。

参照


実行

ここでは、プロジェクトの詳細な情報の表示と解析と、ドキュメントの作成方法について説明します。

Step 1:

動作 | 説明
メタデータの表示 | アセンブリをロードします。ここではIEHost.dllを使用します。 (このファイルはC:\WINDOWS\Microsoft.NET\Framework\v... にあります。) アセンブリがロードされたら、表示メニューから[PE/メタデータ]を選択するか、CTRL+Mを押してください。 Spices.Investigatorタブが開きます。アセンブリの階層構造ツリーからメタデータ テーブルとメタデータ ストリームを展開してください。右パネルには、選択したアセンブリ/モジュールのメタデータ テーブルが表示されます。 ヒント: 右パネルを右クリックして、データをテーブルからクリップボードにコピーしてください。

Step 2:

動作 | 説明
バイナリデータの表示 | 次に、バイナリのアセンブリデータを表示します。PE情報を展開してください。ヘッダー、ディレクトリ、セクションのノードが表示されます。ノードを展開してその中のエレメントを表示してください。 パネルを右クリックすると、指定したアドレスに進むメニュー、またはバイナリ データをファイルに保存するメニューが表示されます。 ヒント: 右のプロパティ パネルに一部のエレメントの詳細が表示されます。

Step 3:

動作 | 説明
PEヘッダーの表示 | プロジェクトのPEヘッダーの詳細を検証するには、プロジェクトのツリーからPE情報を展開し、閲覧しようとするヘッダーを選択します。Spices.Investigatorは、ヘッダープロパティとヘッダーのバイナリ表示を表示します。

参照


プロパティ

プラグインマネージャ([ツール]メニューの[プラグインの管理])を使用してSpices.Investigatorをカスタマイズできます。
  • [ツール]メニューから[プラグインの管理]を選択します。
  • NineRays.Investigatorのプラグインノードを選択し、このノードを展開します。
  • 9Rays.Investigator.Netノードを選択し、[プロパティ]ボタンをクリックしてプラグインのプロパティを編集します。

Spices.Investigatorのプロパティ

HexValuesは、16進数を表示します。トークン、整数、バイトを16進数形式で表示します。
TranslateValuesは、string/blob/guid/ポインターを関連する文字列値に変換します。テーブルやストリームのトークン やポインタは、関連する文字列、guid、blobに変換されます。

参照


PE / メタデータの閲覧

カレントのプロジェクトのメタデータペインで、選択したアセンブリのメタデータのテーブル/ストリームを閲覧できます。

アセンブリのノードを選択して展開し、テーブルのサブノードでPE形式/メタデータテーブルの必要なエレメントを選択するかストリームのサブノードでストリームの必要なエレメントを選択し、選択したノードをダブルクリック またはEnterキーを押してテーブルを開いてください。

開いたドキュメントで、表示されたレコードの検索、ソート、コピーが行えます。

参照


プロジェクトにアセンブリを追加するには

2つの方法があります。

1つは、プロジェクトの[プロパティ]タブに切り替えて、AssemblyListプロパティを選択し、コレクション エディタを呼び出してアセンブリを追加します。

これに関する詳細は、プロパティを参照してください。

もう1つは、[エクスプローラ]タブに切り替えて、メニューを開き、[アセンブリの追加]を選択します。

参照


新しい形式と互換性を持たせるために.iloprjプロジェクトの形式を変更するには

.iloprjファイルの<AssemblyList>セクションの<FileName>タグと</FileName>タグを、次のように<AssemblyFileName>と</AssemblyFileName>に変更するだけです。

変更前:
<AssemblyList>
<FileName>
<Name>..\Net\ILOMD\Spices.Net\bin\Release\NineRays.ILOMD.Options.dll</Name>
</FileName>
</AssemblyList>

変更後:
<AssemblyList>
<AssemblyFileName>
<Name>..\Net\ILOMD\Spices.Net\bin\Release\NineRays.ILOMD.Options.dll</Name>
</AssemblyFileName>
</AssemblyList>

参照


メソッドを逆アセンブルするには

難読化するメソッドのノードを選択してください。
もしくは、[ツール]メニューから[逆アセンブラ]を選択、またはF5を押して逆アセンブラを実行することができます。
また、メソッドと関連するノード上でアセンブリブラウザのメニューを開いて、[逆アセンブラ]を選択 してください。

参照


アセンブリに他のアセンブリを組み込むには

2つの方法があります。

  1. アセンブリをバイト配列として組み込んでください。
    exe/dllのマネージド リソースを隠すにはの章のユーティリティ コードを使用して、アセンブリ ファイルをバイト配列のリソースに変換してください。
    System.Reflection.Assembly.Load(byte[])メソッドを使用して、このアセンブリをロードできます。
  2. 組み込まれたリソースとしてアセンブリを組み込んでください。
    プロジェクトにアセンブリファイルを追加して、このファイルのプロパティのBuild ActionをEmbedded resourceに変更してください。
    次のコードを使用して、このアセンブリをロードできます。

using System;

using System.IO;

using System.Reflection;

public class AssemblyLoader

{

   public Assembly LoadAssemblyFromResource(Assembly assembly, string resourceName)

  {

    Stream stream = assembly.GetManifestResourceStream(resourceName);

    if (stream != null)

    {

      byte[] buffer = new byte[(int)stream.Length];//prepare buffer for assembly loading

      stream.Read(buffer, 0, buffer.Length);//read assembly into byte array buffer

      try

      {

        Assembly resasm = Assembly.Load(buffer);

        return resasm;

      }

      catch(Exception e)

      {

        Console.WriteLine("Cannot load assembly from {0} resource, Exception message {1}", resourceName, e.Message);

      }

    }

    return null;

  }

}

注意

  • リソースのシンプルな暗号化を使用して、安全性を高めることができます。アセンブリを読込むために、アセンブリ には十分な認証が必要です。
  • 他のアセンブリを読込むためには、アセンブリには十分な認証が必要です。
    アセンブリに組み込もうとしているアセンブリは、検証できるものでなければなりません(一部のmanaged C++アセンブリは検証できないのでこの方法で読込むことはできませんが、バイト配列をファイルに保存して、Assembly.LoadFromメソッドでアセンブリを読込むことができます)。

参照


アセンブリリソースを取り出すには

アセンブリのリソースは[リソース]セクションにあります。

表示しようとするアセンブリのリソースを選択し、メニューを開いて、[リソースの保存]を選択します。

参照


トークンでアセンブリメンバを検索するには

Spices.Informerがインストールされている場合、[ツール]メニューの[トークン情報]をクリックして、Token Infoツールを呼び出すことができます。このツールでトークンの値を入力し、「情報入力」ボタンをクリックすると必要なトークン値の詳細情報を検索できます。

参照


アセンブリメンバを検索するには

メンバの検索 を参照してください。

参照


選択したメンバに関連するトークン値を検索するには

Spices.Informerがインストールされていると、この情報はInformerペインで検索できます。このメンバに関する詳細をInformerペインに表示するには、アセンブリのメンバを選択してください。
下図を参照してください。

参照


exe/dllのマネージド リソースを隠すには

リソースをバイナリ配列に変換し、それをフィールドとしてプロジェクトの一部のクラスで定義してください。ストリームを使用して、同じようにこのリソースをロードできます。

public class MyResources

{

//File Image of ILOLOGO.ico Length:1078bytes

private byte[] ilologo = new byte[]

{0x00,0x00,0x01,0x00,0x02,0x00,0x20,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0xe8,0x02,

0x00,0x00,0x26,0x00,0x00,0x00,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x28,0x01,

0x00,0x00,0x0e,0x03,0x00,0x00,0x28,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x40,0x00,

0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,

0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0xc0,0xc0,

0xc0,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,

0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0xff,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00,0xcc,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0x00,0x00,0xcf,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xfc,0xcc,0xcc,0xff,0xff,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xfc,0xcc,0xcc,0xcc,0xcc,0xff,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xcc,0xcc,0xff,0xfc,0xcc,0xcf,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xcc,0xcf,0xff,0xff,0xcc,0xcf,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xfc,0xcc,0xff,0xff,0xff,0xfc,0xcc,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xcc,0xcf,0xff,0xff,0xcc,0xcf,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xcc,0xcc,0xff,0xfc,0xcc,0xcf,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xfc,0xcc,0xcc,0xcc,0xcc,0xff,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xfc,0xcc,0xcc,0xff,0xff,0xff,0xcc,0xcf,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x0c,0xff,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,0x00,0xcf,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x00,0xcc,

0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0x00,0x00,0x00,

0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,

0xff,0xff,0xf0,0x00,0x00,0x0f,0xc0,0x00,0x00,0x03,0xc0,0x00,0x00,0x03,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,

0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0x80,0x00,0x00,0x01,0xc0,0x00,

0x00,0x03,0xc0,0x00,0x00,0x03,0xf0,0x00,0x00,0x0f,0xff,0xff,0xff,0xff,0x28,0x00,

0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,

0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x80,

0x00,0x00,0x00,0x80,0x80,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,

0x00,0x00,0x80,0x80,0x80,0x00,0xc0,0xc0,0xc0,0x00,0x00,0x00,0xff,0x00,0x00,0xff,

0x00,0x00,0x00,0xff,0xff,0x00,0xff,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0xff,0xff,

0x00,0x00,0xff,0xff,0xff,0x00,0x0c,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xc0,0xcf,0xff,

0xff,0xff,0xff,0xff,0xff,0xfc,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0xcf,0xff,

0xfc,0xcf,0xff,0xff,0xcc,0xfc,0xcf,0xfc,0xcc,0xcc,0xcf,0xff,0xcc,0xfc,0xcf,0xfc,

0xcf,0xfc,0xcf,0xff,0xff,0xfc,0xcf,0xcc,0xff,0xff,0xcc,0xff,0xcc,0xfc,0xcf,0xcc,

0xff,0xff,0xcc,0xff,0xcc,0xfc,0xcf,0xcc,0xff,0xff,0xcc,0xff,0xcc,0xfc,0xcf,0xcc,

0xff,0xff,0xcc,0xff,0xcc,0xfc,0xcf,0xcc,0xff,0xff,0xcc,0xff,0xcc,0xfc,0xcf,0xfc,

0xcf,0xfc,0xcf,0xff,0xcc,0xfc,0xcf,0xfc,0xcc,0xcc,0xcf,0xff,0xcc,0xfc,0xcf,0xff,

0xfc,0xcf,0xff,0xff,0xcc,0xfc,0xcf,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x0c,0xcc,

0xcc,0xcc,0xcc,0xcc,0xcc,0xc0,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x80,0x01,0x00,0x00};

 public Image ILO_Icon

 {

    get

    {

      MemoryStream stream = new MemoryStream(ilologo);

      return Image.FromStream(stream);

    }

 }

}

次のコードは、リソースをバイナリ配列に変換します。

   private void ConvertFileToByteArray(TextBox textBox)

    {

      OpenFileDialog ofd = new OpenFileDialog();

      if (ofd.ShowDialog() == DialogResult.OK)

      {

        Stream stream = new FileStream(ofd.FileName, FileMode.Open, FileAccess.Read);

        stream.Position = 0;

        byte[] buffer = new byte[stream.Length];

        stream.Read(buffer, 0, (int)stream.Length);

        string output = "//File Image of " +Path.GetFileName(ofd.FileName) +" Length:"+stream.Length +" bytes\r\n";

        output += "private byte[] "+Path.GetFileNameWithoutExtension(ofd.FileName)+" = new byte[] {";

        int part = 0;

        for(int i=0; i < buffer.Length; i++)

        {

          output += "0x"+buffer[i].ToString("x2")+",";

          if (part < 15)

            part++;

          else

          {

            part = 0;

            output += "\r\n";

          }

        }

        output = output.Remove(output.Length-1, 1);//removes last ',' char

        output += "};";

        textBox.Text = output;

      }

    }

参照


処理速度を上げるには

難読化:

  • 難読化処理を速くするには、Spices.ObfuscatorのSilentModeプロパティをTrueに設定してください。これによりobfuscatorはエラー 、注意メッセージや一般的なメッセージだけを表示します。

逆コンパイル:

  • 逆コンパイルを速めるには、Spices.DecompilerのOptions.DecompileToFileプロパティをTrueに設定してください。

参照


Spices.Netにプロジェクトをロードするには

[ファイル]メニューの[開く]を選択し、開いたファイルのマスクを*.iloprjに設定して希望するプロジェクトファイルを選択し てください。
.Netアセンブリ(.exe、.dll)とプロジェクトファイル(.iloprj)の両方を開くことができます。
プロジェクトを開いたら、プロパティを変更してプロジェクトファイルを保存できます。

参照


Spices.Netで逆コンパイルからアセンブリを守るには?

AntiILDASM 機能を使用してください。これは、ILDASM、Anakrino、Reflector、Remotesoft Salamander Decompilerなどの逆コンパイラ/逆アセンブラでの逆アセンブルからアセンブリを守る機能です。
Spices.Decompilerの逆コンパイルからアセンブリを守るには、NineRays.Decompiler.NotDecompile属性を アセンブリ属性に添付してください。
この属性のソースは\SDK\Obfuscation Attributesフォルダにあります。自由にこの属性をアセンブリに挿入できます(プライベートまたは内部的な属性を使用できます)。

参照


アセンブリブラウザにアセンブリを表示させないようにするには

アセンブリの難読化オプションのObfuscationOptions.Naming.NonDisplayableを使用してください。

参照


アセンブリリンカでアセンブリを使用させないようにするには

アセンブリの難読化オプションのObfuscationOptions.Naming.NonDisplayableを使用してください。

参照


プロジェクトからアセンブリを削除するには

２つの方法があります。
詳細は、プロパティを参照してください。
他には、[エクスプローラ]タブに切り替えて、削除したいアセンブリのルートノードを選択して、メニューを開き、[アセンブリの削除]を選択し てください。

参照


コールグラフを表示するには

解析するメソッドのノードを選択します。

メニューを開いて[コールグラフ]を選択します。

参照


アセンブリのリソースを表示するには

アセンブリのリソースは[リソース]セクションにあります。

表示しようとするアセンブリリソースを選択し、メニューを開き、[リソースの表示]を選択してください。

参照


Spices.Obfuscatorで.NETアセンブリを難読化すると、そのアセンブリはどこに保存されますか?

質問: Spices.Obfuscatorで.NETアセンブリを難読化すると、そのアセンブリはどこに保存されますか？
回答: 難読化されたアセンブリは、Project.SaveToDirectoryディレクトリに保存されます。
Spices.Net.Settings (編集 -> オプション)を開いてDefaultSaveToDirectoryを設定するか、開い てあるプロジェクトでSaveToDirectoryを難読化されたアセンブリの出力フォルダに設定してください。

参照


Spices.Obfuscatorを使用してASP.Netのコード ビハインド DLLを難読化できますか?

質問: Spices.Obfuscatorを使用してASP.Netのコード ビハインド DLLを難読化できますか?
回答: はい。Spices.Obfuscator.Netを使用して、ASP.NETのコード ビハインド DLLを難読化できます。コード ビハインド DLLは、通常のDLLと変わらないので、難読化の手順もまったく同じです。

参照


Spices.Obfuscatorを使用してスマート デバイス アプリケーションを難読化できますか?

質問: Spices.Obfuscatorを使用してスマート デバイス アプリケーションを難読化できますか?
回答: はい。Spices.Obfuscatorは、Microsoft .NETのコンパクト フレームワークでのスマート デバイス アプリケーションの構築をサポートしています。

参照


Spices.Decompilerにはコマンドライン インターフェイスはありますか?

質問: Spices.Decompilerにはコマンドライン インターフェイスはありますか？
回答: いいえ。Spices.Decompilerにはありません。

参照


Spices.Obfuscatorにはコマンドライン インターフェイスはありますか?

質問: Spices.Obfuscatorにはコマンドライン インターフェイスはありますか？obfuscate x.exe y.exeのようなものが欲しいのですが。
回答: はい。Obfuscatorのコンソールの使用を参照してください。

参照