PreEmptive Solutions メニュー
ENGLISH

アセンブリリンク機能

概要

アセンブリのリンク機能とは複数の .NET アセンブリ (実行可能形式およびダイナミックリンク ライブラリ (DLL)) から成るアプリケーションの作成を補助する機能であり、Dotfuscator Professional Edition (PE) でご利用いただくことができます。アセンブリリンク機能は、アセンブリの配置誤りに起因するエラーを抑止し、コードの肥大化の防止、あるいはソフトウェア保護に役立ちます。この記事ではアセンブリリンク機能の概要とその利点を解説します。

アセンブリリンク機能とは何か

アセンブリリンク機能は既存の複数のアセンブリを入力とし、それらを併合して単一のアセンブリを生成します。この処理には多くの役に立つ効果がありますし、既存の Dotfuscator for .NET の機能と共に使用することでコードのセキュリティを高め、かつ最適化することが可能となります。

利点

アセンブリリンク機能は、キーとなる3つの領域、即ち最適化、可用性およびセキュリティにおいて .NET アプリケーションに対する利益をもたらします。

最適化

Dotfuscator Professional Edition におけるアセンブリリンク機能は、既存の機能と共にしようすることで、.NET アプリケーションの最適化に大きな効果をもたらします。

この機能を枝刈り機能 (Pruning) と共に使用すれば、コードの肥大化をかなり押さえることができます。例えば、あるアプリケーションが不使用部分を含むサードパーティ製のライブラリ群と共に提供されるものとしましょう。アプリケーションがそれらのライブラリのうち僅かなメソッドしか使用しない場合であっても、それらの巨大な DLL ファイル群と共にパッケージ化されなければならず、配布可能パッケージのファイルサイズとメモリーフットプリント (メモリー消費量) を増大させます。

アセンブリリンク機能を使用すれば、Dotfuscator for .NET は与えられた DLL 群を実行可能形式と共にマージし、ライブラリ内から不使用コードを除去します。下図は Dotfuscator for .NET を通じて、どのようにサードパーティ製 DLL 群から不使用メソッドが刈り取られ、結果の実行可能形式にマージされるかを示しています。

可用性

別々のアセンブリ群からのコードを単一のコア実行可能形式に格納することで、ユーザの負担を低減し、関連ファイルのメンテナンスにおける「DLL 地獄」を抑止できます。ある典型的なアプリケーションにとって重要な DLL 群が無くなってしまった場合、通常はそれらを復元するためには、アプリケーション全体の再インストールが必要となります。これは不便ですし、そのアプリケーション用の設定情報やその他のデータが消去されてしまう可能性もあります。しかし、アセンブリリンク機能ではライブラリコードを実行可能形式それ自体の中に配置することで、作成したアプリケーションにおける余分なエラー発生源を無くすことができるのです。

またアセンブリリンク機能を使用することで、サードパーティ製ライブラリ群の変更の有無に関わり無くアプリケーションの動作が保証されます。ダイナミックリンク ライブラリを更新した場合、旧コードが停止したり解析の困難な問題を引き起こす可能性があります。開発者は開発時にはサードパーティライブラリを DLL 形式にして置けますが、配布するアプリケーションではそれらのライブラリを内部に含めてしまうことで、ユーザのコンピュータ上でライブラリのバージョン不整合を抑止することができるのです。

また Dotfuscator Professional は名前の衝突を自動的に処理し、同名の型やメソッド、およびフィールドを持つライブラリのマージ時のエラーを防止することでアセンブリリンク処理は完全に自動化されます。

セキュリティ

賢明なハッカーは、登録確認処理のようなセキュリティ上重要なコードを迂回するような、あるいは外部メソッドの呼び出しを横取りするような改竄アセンブリを作成することが可能です。複数アセンブリを1つにリンクすることで、ハッカーが改竄したファイルや疑わしいソフトウェアと置換することを抑止します。

また Dotfuscator Professional では、難読化(隠蔽処理)技術とアセンブリリンク機能を同時に用いることで、アセンブリ内に格納されている重要な情報を隠すことが可能となります。難読化されていないアセンブリのメソッド呼び出しはその型とメソッドおよびフィールドの名称を明記しなければなりませんが、これはハッカーにとって逆コンパイルされたコードの理解を助け、リバースエンジニアリング結果に手を加えるための情報を提供します。しかし、アセンブリリンク機能と難読化が適用されてしまえば、これは事実上不可能となります。より大きなコードベースでは恐らく同名のメソッド数が増加するでしょうし、それ故プログラムのクラッキングは以前に比べ難しくなるでしょう。

結論

アセンブリリンク機能は複数のアセンブリから構成されるあらゆるアプリケーションにとって、極めて重要な部分となる可能性があります。Dotfuscator の他の機能と複合して使用することにより、アセンブリリンク機能はあなたの .NET アプリケーションに、セキュリティおよび信頼性の向上とサイズの縮小という、極めて明白な利益をもたらすことができます。あなたの実行可能形式が .NET アセンブリに依存しているのであれば、アセンブリリンク機能はリバースエンジニアリングやハッカーに対しアプリケーションを防御するため、およびアプリケーションを効率よくパッケージ化するための基本中の基本です。

Dotfuscator for .NET / DashO for Java/Android
記事情報、動画、参考資料

ここでは、難読化について解説もしくは掲載された記事、動画、関連資料をご紹介しております。

メディア、パートナー会社等に掲載された「難読化」に関連した記事をご紹介しております。(各社のホームページに移動します)

動画

Demo of Dotfuscator – .NET Obfuscator
PreEmptive Solutions 社提供。
難読化ツール「Dotfuscator for .NET」を使用して、難読化の操作方法をご紹介しております。

Demo of DashO Java and Android Obfuscator
PreEmptive Solutions 社提供。
難読化ツール「DashO」を使用して、難読化の操作方法をご紹介しております。

難読化について、様々な角度から解説した資料です。

アセンブリリンク機能は、キーとなる3つの領域、即ち最適化、可用性およびセキュリティにおいて .NET アプリケーションに対する利益をもたらします。

一部の書類のファイル形式は PDF となっております。閲覧には Adobe Reader が必要です。左のリンクより入手できます。

一部の書類のファイル形式は PDF となっております。
閲覧には Adobe Reader が必要です。左のリンクより入手できます。

難読化の技術

難読化およびアプリケーションセキュリティ技術について

ソースコードの難読化は、幾重もの防御を作成するために、互いに補完することができる多くの異なる技術から構成されています。
難読化およびアプリケーションセキュリティ技術の典型的な例には、次のものがあります。

名前変更

メソッドと変数の名前を変更いたします。これは、コンパイルされていないソースを人間には理解しづらくしますが、プログラムの実行には影響しません。新しい名前は、 “a”、 “b”、 “c”、数字、印字不能文字、または不可視文字のような異なる規則を利用することができます。また、スコープが異なる限り、名前をオーバーロードすることができます。名前の難読化は、ほとんどの .NET、iOS、Java および Android の難読化ツールで使用される基本的な変換です。

文字列暗号化

実行ファイルからは、すべての文字列が明確に検出でき、読み取り可能です。メソッドと変数の名前が変更されても、バイナリ内の文字列を検索することによって、重要なソースコードの箇所を見つけることができます。これには、ユーザーに表示されるメッセージ(特にエラーメッセージ)が含まれます。この種の攻撃に対して有効なバリアを提供するために、文字列の暗号化は実行ファイル内の文字列を隠し、必要なときだけ元の値に戻します。実行時に文字列を復号すると、通常、実行パフォーマンスがわずかに低下します。

制御フロー難読化

制御フローの難読化は、実行可能なロジックを生成するように条件付き分岐や繰り返しの構文を合成しますが、逆コンパイル時にはロジック的に意味のない多くのコードも生成します。簡単に言うと、逆コンパイルされたコードは、ハッカーが理解することが非常に難しいスパゲッティロジックのように見えます。これらの手法は、実行時のパフォーマンスに影響を与える可能性があります。

命令パターンの変換

コンパイラによって生成された一般的な命令を、理解しにくい他の構造に変換します。これらは、Java や C# のような高水準の言語にきれいにマッピングされないかもしれないですが、文法的には完全に正しい機械語の命令です。1つの例は、Java および .NET ランタイムのスタックベースの性質を利用する、可変長のキャッシングです。

ダミーコードの挿入

プログラムのロジックに影響を与えず、逆コンパイラを止めたり、リバースエンジニアリングされたコードを分析するのがはるかに難しくなるように、コード中、にダミーのコードを挿入する。

未使用コードとメタデータの削除

アプリケーションからデバッグ情報や重要でないメタデータとコードを削除することで、実行コードを小さくし、攻撃者が入手できる情報を最小限に減らすことができます。これにより、実行時のパフォーマンスが向上する可能性があります。

バイナリのリンク・マージ

この変換は、複数の実行ファイルやライブラリを、1つ以上の出力バイナリにリンクします。リンクすることで、アプリケーションのサイズを小さくすることができます。特に、名前の変更や不要コードの削除をした上でリンクすると、展開されるコードが単純化され、ハッカーが利用できる情報が減少する可能性があります。

不明瞭な述語(predicate)挿入

条件付き分岐を追加することで、定まっている結果(値)を、静的分析では判別できない結果(値)に見えるように難読化します。これは、実際には実行されない不正なコードを導入する方法ですが、逆コンパイルされた出力を理解しようとする攻撃者にとって混乱を招きます。

改ざん検出

難読化ツールは、アプリケーションの自己保護機能をコードに挿入して、アプリケーションが改ざんされていないことを確認できます。改ざんが検出された場合、アプリケーションのシャットダウン、機能の制限、ランダム的なクラッシュ(クラッシュの理由を隠すため)、またはその他のユーザー定義したコードの実行が可能です。また、管理者やクラウド上のアクセス解析ツールなどのサービスにメッセージを送信して、検出された改ざんの詳細データを提供することもできます。

デバッガ検出

ハッカーがアプリケーションの違法コピーや偽造を試みたり、データを盗んだり、インフラストラクチャソフトウェアの重要な部分の動作を変更したりするときは、逆コンパイラでリバースエンジニアリングをし、デバッガでアプリケーションを実行することから始めます。難読化ツールは、アプリケーションがデバッガ内で実行されているかどうかを検出するためのコードを注入することで、アプリケーションの自己保護機能を実現します。デバッガを使用すると、機密データが壊れたり(盗難から保護される)、ランダムなクラッシュが発生したり(デバッグチェックの結果であることを隠すため)、その他のユーザー定義したコードの実行が可能です。また、警告を出すために設定されたサービスにメッセージを送信することもあります。

リバースエンジニアリングコード
この資料では、.NETとJavaの世界で「バイナリとソースコードが等しい」ことを実証し、リバースエンジニアリングがもたらす可能性のある種類のリスクと、アプリケーションの難読化がどのように役立つかについて説明します。詳しくはこちら(PDF)

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ

    必須会社名

    個人のお客様は「個人」と入力してください。

    必須お名前
    必須メールアドレス
    必須メールアドレス(確認)
    必須ライセンス ありなし
    ダウンロード目的