Dotfuscatorを使用してXamarinアプリケーションを保護する

これは、PreEmptiveSolutionsのDotfuscatorチームの開発者であるJoe Sewellによるストーリーの翻訳です。



正直に言って、ライブラリ、デスクトップアプリケーション、またはモバイルアプリケーションをリリースするのは苦い経験になる可能性があります。 プログラムを全世界のパブリックドメインに置くとすぐに、プログラムの使用方法をある程度制御できなくなります。 特に、開発者はしばしばリバースエンジニアリングの脅威に直面します。

多くのプラットフォームおよび多くの言語で、コード難読化ツールはリバースエンジニアリングに対するよく知られた防御策です。 たとえば、Android開発者の場合、Javaコードの短縮と難読化のためにProGuardを既に使用している可能性があります。



Xamarin開発者は、AndroidおよびiOSからユニバーサルWindows(UWP)まで、モバイルデバイスのすべての主要なファミリで同じタイプの保護にアクセスできるようになりました。 作業用のツールはDotfuscatorと呼ばれ、Community EditionはVisual Studioで利用可能です。



今日は、難読化によってXamarinアプリケーションを保護する方法を検討します。 リバースエンジニアリングのAndroidと、わずか数ステップで同じ保護を独自のXamarinアプリに適用する方法。



難読化がアプリケーションを保護する方法



難読化は、コンパイルされたアプリケーションコードを、リバースエンジニアリングがより困難な機能的に同一のコードに変換するプロセスです。 これは通常、自動難読化ツールまたは難読化ツールを使用して行われます。 以下は、コード難読化がアプリケーションをリバースエンジニアリングから保護する方法を示す簡単な例です。



Xamarin.Androidゲームのソースコードで次のC#メソッドを検討してください。



画像



このゲームの開発者は、デバイスに統合するか、アプリケーションストアにアップロードする準備ができたら、ソースコードをライブラリにコンパイルし、これらのライブラリをアプリケーションパッケージにパックします。 この例では、開発者はAndroidデバイスで配布するためにライブラリをAPKファイルにパッケージ化しました。



ただし、アプリケーションがアプリケーションストアにアップロードされるとすぐに、「悪者」は簡単にAPKを取得して開くことができ、元のコードとほぼ同じ逆コンパイルされたコードが生成されます。



画像



ここでの要素のタイプ、メソッド、および識別子は、コード要素がプロジェクトの外部で通常利用できない場合(たとえば、内部(「内部」)としてマークされている場合)でも、ソースコードの場合と同じです。 また、一般的なメソッドコマンドのフロー、たとえばifステートメントの順序(「if」)がはっきりと見えることに注意してください。



APKの配布前に開発者が既にDotfuscator Community Editionを介してライブラリを実行していた場合、リバース開発の結果は異なります。



画像



コードは、名前の変更中に難読化によって保護されます-コードの難読化の主な形式です。 ArrowsOnHand



などの単純な名前のプロパティは、bやgなどの直感的ではない命名方法に置き換えられました。 他のコード要素も同様に名前が変更されます。 これにより、名前によって提供される重要なコンテキストキーがないため、逆コンパイルされたコードの読み取りと生成が非常に困難になります。



アプリケーションを難読化する方法



次に、DotfuscatorのCommunity Editionバージョンの名前をXamarinアプリケーションのビルドプロセスに変更するときに難読化を統合する方法に進みましょう。 例として、前のセクションで説明したXamarin.Androidアプリケーションを使用します。 iOSやUWPバージョンなど、独自のXamarinアプリですべてを繰り返すことができます。



Dotfuscator PreEmptive Protectionを使用します。これは、難読化ツールおよび.NET保護ツールであり、現在はXamarinもサポートしています。



注:これらの手順は、VisualStudio 2017 for Windowsでアプリケーションを開発していることを前提としています。



Dotfuscatorをインストールして構成する



まず、開発マシンにDotfuscatorをインストールする必要があります。 Dotfuscatorコマンドラインインターフェイスを使用しているため、コピーを登録し、インターフェイスへのパスを記録する必要もあります。



Dotfuscatorをインストールして構成するには:



1. PreEmptive Solutions WebサイトのDotfuscatorダウンロードページに移動します。

2. Visual Studio 2017のDotfuscator Community Edition(CE)の最新バージョンをダウンロードします。





3.ダウンロードしたVSIXファイルを開き、指示に従います。

4. Visual Studio 2017を開き、ツール-PreEmptive Protection-Dotfuscatorを選択して、Dotfuscator Community Editionユーザーインターフェイスを起動します

5.コマンドラインインターフェイスを使用する前に、Dotfuscatorのコピーを登録する必要があります。 Dotfuscatorは、初めて開くときに登録するように求めます。 これらの指示に従ってください。





6.後でアセンブリ統合を構成するには、コマンドラインインターフェイスへのパスを知る必要があります。 この方法を見つけるには:





アセンブリ統合ファイルをダウンロードする



統合プロセスを簡素化するために、Dotfuscatorチームは、Xamarinプロジェクトが参照できるMSBuildターゲットターゲットファイルを作成しました。 こちらからダウンロードできます。



ファイルPreEmptive.Dotfuscator.Xamarin.targetsを、バージョン管理下でソリューションと共にディレクトリに保存します。



アセンブリ統合を使用するようにプロジェクトを変更します。 次に、難読化するVisual Studioのプロジェクトのプロジェクトファイルを変更する必要があります。



プロジェクトファイルを変更するには:



  1. 保護するプロジェクトビルド構成を決定します。 通常、これらはデバッグ構成(デバッグ)を除くすべての構成です。 詳細な手順については、ドキュメント全体の「保護対象の選択」セクションを参照してください。
  2. テキストエディターでプロジェクトファイルを開きます。 C#のプロジェクトファイルの例は、 `YourProjectName.csproj`です。
  3. このファイルから、ダウンロードしたアセンブリ統合ファイルへの相対パスを決定します。
  4. / Projectフラグメントの直前のファイルに次の行を追加して、アセンブリ統合ファイルをインポートします。
  5. プロジェクトのインポート= ".. \ .. \ PreEmptive.Dotfuscator.Xamarin.targets" /、手順3で定義した相対パスを置き換えます。
  6. Condition属性のないPropertyGroupフラグメントの下に、次のフラグメントを追加します。



    • DotfuscatorXamarinCliPathC:\ pathto \ dotfuscatorCLI.exe / DotfuscatorXamarinCliPath。以前に書き留めたDotfuscator Community Editionコマンドラインインターフェイスへのフルパスを置き換えます。
    • DotfuscatorXamarinConfigFileNameDotfuscatorConfig.xml / DotfuscatorXamarinConfigFileName
    • DotfuscatorXamarinGenerateNewConfigFiletrue / DotfuscatorXamarinGenerateNewConfigFile
  7. 手順1で選択した各アセンブリ統合構成について、対応するPropertyGroupを見つけ、次のスニペットを追加します。



    • DotfuscatorXamarinEnabledtrue / DotfuscatorXamarinEnabled
  8. ItemGroupの最後のフラグメントの後に、次を追加します。



    • ItemGroupNone Include = "DotfuscatorConfig.xml" // ItemGroup
  9. ファイルを保存して閉じます。


アプリケーションを構築する





これで、Dotfuscator保護を使用してアプリケーションを構築できます。 これを行うには:



  1. Visual Studioでプロジェクトを開くか再読み込みします
  2. 保護するプロジェクトアセンブリ構成を検証するソリューションアセンブリ構成を選択します。
  3. プロジェクトを構築する
  4. この最初のビルドの後、ビルド結果にDotfuscatorの次の行が含まれているかどうかを確認します。



    画像
  5. DotfuscatorConfig.xmlファイルをプロジェクトに追加します。 これは、コードを難読化する方法をDotfuscatorに指示するDotfuscator構成ファイルです。 バージョン管理システムで確認することをお勧めします。
  6. ディレクトリとファイル構造で、プロジェクトディレクトリで新しいDotfuscatorReportsディレクトリを見つけます。 このディレクトリには、名前変更プロセスを元に戻す方法に関する情報など、プロジェクトの難読化が行われた方法に関する情報が含まれています。 このディレクトリをビルド結果と同様に処理し、バージョン管理システムがそれを無視することを確認する必要があります。
  7. アプリケーションをテストします。 エラーが表示された場合、正しい動作を得るためにDotfuscatorをさらに構成する必要がある場合があります。参照については次のセクションを参照してください。
  8. アプリケーションの開発を続け、通常どおりにビルドします。 ビルド中にDotfuscatorを使用すると、ビルド結果には次の行が含まれます。



    画像


確立された難読化を使用した開発の継続の詳細については、Dotfuscatorユーザーガイドの「開発の継続」を参照してください。



設定の名前を変更



コンパイル時のコード要素の名前は、アプリケーションの操作中と同じであるとアプリケーションが想定する場合があります。 これは、XAMarinベースのXAMLおよびリフレクションアプリケーションに特に当てはまります。 難読化の名前を変更すると、この前提に違反し、難読化後のアプリケーションの動作が異なる可能性があります。



Dotfuscatorの新しいバージョンでは、このようなスクリプトを自動的に処理する能力が向上していますが、場合によっては手動で構成する必要があります。 手順と例については、Dotfuscatorユーザーガイドの「名前の変更から除外を識別する」ページを参照してください。



高度な難読化



Dotfuscator Community Editionの無料バージョンの代わりに、Dotfuscator Professional EditionでXamarinアプリを難読化することもできます。 Professional Editionは商用製品での使用が許可されており、無料のプローブはリクエストに応じて入手できます。



CommunityバージョンとProfessionalバージョンの違いを確認するには、上記のサンプルゲームを検討してください。 開発者がCommunity EditionではなくDotfuscator Professional Editionを使用してディレクトリを渡すと、逆の開発結果は次のようになります。



画像



名前の変更による難読化に加えて、このコードは制御フローを変更することによっても難読化されます。 ソースコード演算子には、見かけ上任意の順序で読み取ることが困難な「認識」ブロックが散在しており、コマンドの実行が大幅に複雑になります。 この難読化およびその他の高度な形式の難読化は、Dotfuscator Professional Editionにのみ含まれています。



結論



この投稿では、Dotfuscatorを使用してXamarinディレクトリとアプリケーションをリバースエンジニアリングから保護する方法を説明しました。 例としてAndroidベースのアプリケーションを使用しましたが、iOSおよびUWPに基づくプロジェクトに対して同じ手順を実行できるため、実行するプラットフォームに関係なくアプリケーションを保護できます。



Dotfuscatorを使用してXamarinプロジェクトを保護する方法の詳細については、DotfuscatorユーザーガイドのXamarinページを参照してください。 また、3つのプラットフォームすべてのDotfuscatorをXamarinアプリに統合する方法を示すgitリポジトリもあります。



All Articles