このページでは、設定する必要がある対象除外を特定する方法について説明します。 この例では名前の変更に焦点を合わせていますが、概念は他の保護にも適用できます。 ここでは Xamarin アプリケーションの例を使用しますが、下記のワークフローは保護しようとしているすべてのアプリケーションに適用できます。
アプリケーションで名前変更の対象除外を行わなければならない理由は複数個あります。 一般的な理由の 1 つは、一部のフレームワークにあります。Xamarin などの、リフレクションに大きく依存しているフレームワークでは、コンパイル時の型およびメンバーの名前は実行時も変わらないことを前提としています。 Dotfuscator の名前の変更による保護では、このシナリオでの適切な動作を保証するためにさまざまな規則を適用しています。 Dotfuscator がリリースされるたびに規則が改善されているため、特に最新版の Dotfuscator をお持ちの場合には、多くのケースが自動的に処理される可能性があります。
ただし、Dotfuscator が検出できないケースがある場合もあります。 そのような場合には、アプリの正しい動作を保持するために、問題のあるコード項目を名前の変更対象から除外する必要があります。
名前の変更で必要とされる正しい対象除外は、アプリによって大きく異なります。
全体のワークフロー
Dotfuscator の名前の変更による保護を構成するには
-
名前の変更を有効にします。 詳細については、[設定]タブを参照してください。
-
[名前の変更]エディターを使って、名前の変更の対象除外を作成します。
-
Dotfuscator プロジェクトをビルドします。
-
難読化されたアプリを実行し、その動作をテストします。
-
問題がある場合は、デバイス ログ、例外メッセージ、または他の診断ツールで調べます。
-
アプリが正常に動作するまで、必要に応じて名前変更の対象除外を引き続き作成するため、手順 2 以降を繰り返します。
詳細な例
上記のアドバイスには名前変更の対象除外を作成するための基本事項が示されていますが、例を挙げた方がわかりやすくなるでしょう。 以下に、本書のはじめに - Xamarin アプリの保護で使用したサンプル、BugSweeper.Android
の名前変更の対象除外を判断するために弊社が取った、詳細な手順を示します。
これらの手順は Dotfuscator Professional 4.33 に対して執筆したものですので、注意してください。 新しいバージョンの Dotfuscator では、この同じ例に対して必要となる対象除外は少なくなっているかもしれません。
-
Android デバイスで、保護された
BugSweeper.Android
アプリを起動したところ、アプリは実行されました。しかし、私たちがゲームをしたのに、探すバグの数を報告するテキスト(例:"Flagged 2 out of 10 bugs.")は更新されていないことに気付きました。 -
ソース コードで私たちが注目した点は、
BugSweeperPage.xaml
ファイルでは、このテキストを 2 つのラベル(どちらもBindingContext
でboard
フィールドを参照する)を使って定義していることでした。<StackLayout Orientation="Horizontal" Spacing="0" VerticalOptions="CenterAndExpand" HorizontalOptions="Center"> <Label BindingContext="{x:Reference board}" Text="{Binding FlaggedTileCount, StringFormat='Flagged {0} '}" /> <Label BindingContext="{x:Reference board}" Text="{Binding BugCount, StringFormat=' out of {0} bugs.'}"/> </StackLayout>
-
問題の原因は、
BugCount
プロパティの名前が変更されたことに違いないと判断しました。 Dotfuscator 構成エディターを使ってこれを手動で除外しました。 -
BugSweeper.Android
をビルドし、再展開しました。 今回はアプリが実行されたけでなく、ゲームをプレイしているときや勝ったり負けたりしたときも問題は発生しませんでした。 -
DotfuscatorConfig.xml
に加えた変更をローカル ソース管理にコミットしました。
その他のヒント
-
Xamarin を使用して、電話の USB デバッグを有効にした後、Visual Studio で Android デバイス ログを開いて、起こりうるエラーの詳細なログを表示します。 わかりやすくするため、
Error
とWarning
のみが抽出表示されるようにログにフィルターをかけます。 -
エラーが発生した場合は、スタック トレースを調査して、エラーの原因を特定します。関数の元の名前を見つけ出すために、名前変更の割り当てファイルと相互参照を行う必要があるかもしれません。 たとえば、次のようなスタック トレースがあるとします。
Caused by: android.runtime.JavaProxyThrowable: System.Exception: Can't resolve name on Element at Xamarin.Forms.Xaml.ReferenceExtension.ProvideValue (System.IServiceProvider serviceProvider) [0x000b6] in <cdab8e5cc6744897b152dd4075cc1cb0>:0 ... at Xamarin.Forms.Xaml.Extensions.LoadFromXaml[TXaml] (TXaml view, System.Type callingType) [0x00000] in <cdab8e5cc6744897b152dd4075cc1cb0>:0 at BugSweeper.BugSweeperPage.b () [0x00000] in <7a7fbb7c3c1f42e59202c72d51d629fe>:0 at BugSweeper.BugSweeperPage..ctor () [0x00006] in <7a7fbb7c3c1f42e59202c72d51d629fe>:0 at BugSweeper.App..ctor () [0x00006] in <7a7fbb7c3c1f42e59202c72d51d629fe>:0 at BugSweeper.Droid.MainActivity.OnCreate (Android.OS.Bundle bundle) [0x0000e] in <bf5a3ea557124c988f94e73e801e2727>:0 ...
このスタック トレースから、型
BugSweeper.BugSweeperPage
のメソッドb()
でエラーが発生したことがわかります。 BugSweeper のソース コードには、前述の型の当該の名前のメソッドはないため、これ(b()
)は難読化された名前に違いないと推測できます。 名前変更の割り当てファイル(C:\code\BugSweeper\BugSweeper\BugSweeper.Android\DotfuscatorReports\Release\Renaming.xml
)を開き、該当するモジュール(BugSweeper.dll
)、名前(BugSweeper.BugSweeperPage
)、およびメソッド(b
という新しい名前)を調べます。<mapping> <module> <name>BugSweeper.dll</name> <type> <name>BugSweeper.BugSweeperPage</name> <methodlist> <method> <signature>void()</signature> <name>InitializeComponent</name> <newname>b</newname> </method> </methodlist> </type> </module> </mapping>
割り当てファイルは、このメソッドの元の名前が
InitializeComponent
であることを示しています。 これは、エラーの原因を探し始めるのに適した場所です。