(57)【要約】  本明細書で説明される技術は、プログラムの正当なコードおよび／または無関係なコードを特定し、および／または区分して、プログラムのコードを表示する時、解析者が無関係なコードを選り分けるおよび／または考慮に入れる余分な時間を費やさずに済むようにする。従って、解析者は、プログラム（例えば、マルウェア）のタイプを判定する時および／またはプログラムのアクションを判定する時により効率的に行うことができる。例えば、セキュリティ研究者は、マルウェアを識別しおよび／またはマルウェアがコンピュータ上で実行する有害なまたは不正なアクション（例えば、ファイルの削除、社会保障番号またはクレジットカード番号などの機密情報を標的にすること）を判定する任務を負うことがある。
2016525760.tif 000002
【特許請求の範囲】
【請求項１】
実行ファイルの１または複数の正当なコード要素を、１または複数の仮定に少なくとも部分的に基づいて特定することと、
前記１または複数の正当なコード要素とインタラクトする１または複数のコード要素を特定することと、
前記１または複数のコード要素を正当とラベル付けすることと、
正当でない１または複数のその他のコード要素を無関係なコード要素とラベル付けすることと、
前記無関係なコード要素を前記実行ファイルから除去することと
を含むことを特徴とする方法。
【請求項２】
前記１または複数の正当なコード要素は、関数に対する少なくとも１つの入力引数を含み、前記１または複数の仮定は、関数に対する入力引数が正当であるという仮定を含むことを特徴とする請求項１に記載の方法。
【請求項３】
少なくとも１つのコード要素は、前記関数に対する前記少なくとも１つの入力引数によって汚染されるローカル関数変数を含むことを特徴とする請求項２に記載の方法。
【請求項４】
前記１または複数の正当なコード要素は、前記実行ファイルに対する少なくとも１つのグローバル変数を含み、前記１または複数の仮定は、グローバル変数は正当であるという仮定を含むことを特徴とする請求項１に記載の方法。
【請求項５】
前記１または複数の正当なコード要素は、関数呼び出しのパラメータとして使用される少なくとも１つのローカル関数変数を含み、前記１または複数の仮定は、関数呼び出しのパラメータとして使用されるローカル関数変数は正当であるという仮定を含むことを特徴とする請求項１に記載の方法。
【請求項６】
前記１または複数の正当なコード要素は、関数呼び出しの戻り値を格納する少なくとも１つのローカル関数変数を含み、前記１または複数の仮定は、関数呼び出しの戻り値を格納するローカル関数変数は正当であるという仮定を含むことを特徴とする請求項１に記載の方法。
【請求項７】
前記無関係なコード要素を除去することは、前記実行ファイルに基づいて生成された視覚的表現から前記無関係なコード要素を除去することを含むことを特徴とする請求項１に記載の方法。
【請求項８】
前記視覚的表現は、前記実行ファイルを人間が読み取り可能なフォーマットに逆アセンブルして逆コンパイルした後に生成されたテキストファイルであることを特徴とする請求項７に記載の方法。
【請求項９】
前記視覚的表現は、前記実行ファイルを人間が読み取り可能なフォーマットに逆アセンブルして逆コンパイルした後に生成された制御フローグラフであることを特徴とする請求項７に記載の方法。
【請求項１０】
前記実行ファイルはマルウェアであり、前記１または複数の正当なコード要素および前記１または複数のコード要素は、有害なアクションの実行に関与することを特徴とする請求項１に記載の方法。
【請求項１１】
前記実行ファイルはマルウェアであり、前記無関係なコード要素の実行は、有害なアクションの原因とならないまたは実行可能としないことを特徴とする請求項１に記載の方法。
【請求項１２】
リターン文が前記無関係なコード要素の１つであると判定することと、
前記リターン文をレジスタの場所にマップすることと、
前記レジスタの前記場所の値が関数によって読み取られているか判定することと、
前記リターン文を、無関係なコード要素の代わりに正当なコード要素とラベル付けすることと
をさらに含むことを特徴とする請求項１に記載の方法。
【請求項１３】
プロセッサによって実行されると、
コンピュータプログラムの少なくとも一部の１または複数の正当なコード要素を特定することと、
前記コンピュータプログラムの前記少なくとも一部の１または複数の無関係なコード要素を特定することと、
前記コンピュータプログラムの前記少なくとも一部の視覚的表現を出力することであって、前記視覚的表現は、表示から除去された前記１または複数の無関係なコード要素を有するか、若しくは、前記１または複数の正当なコード要素と前記１または複数の無関係なコード要素とを区分することと
を含む動作を実行する命令を備えたことを特徴とするコンピュータが読み取り可能な非一時的媒体。
【請求項１４】
前記１または複数の正当なコード要素は、前記コンピュータプログラムの前記少なくとも一部に対する少なくとも１つの入力コード要素を含むことを特徴とする請求項１３に記載のコンピュータが読み取り可能な非一時的媒体。
【請求項１５】
前記１または複数の正当なコード要素は、前記コンピュータプログラムの前記少なくとも一部に対する少なくとも１つのグローバル変数を含むことを特徴とする請求項１３に記載のコンピュータが読み取り可能な非一時的媒体。
【請求項１６】
前記１または複数の正当なコード要素は、呼び出しのパラメータとして使用される少なくとも１つのローカル変数を含むことを特徴とする請求項１３に記載のコンピュータが読み取り可能な非一時的媒体。
【請求項１７】
前記１または複数の正当なコード要素は、正当であると仮定された初期のコード要素とインタラクトする少なくとも１つのコード要素を含むことを特徴とする請求項１３に記載のコンピュータが読み取り可能な非一時的媒体。
【請求項１８】
前記コンピュータプログラムはマルウェアであり、前記１または複数の正当なコード要素の実行は、有害なアクションの原因となるまたは実行可能とし、前記１または複数の無関係なコード要素の実行は、前記有害なアクションの原因とならないまたは実行可能としないことを特徴とする請求項１３に記載のコンピュータが読み取り可能な非一時的媒体。
【請求項１９】
１または複数のプロセッサと、
１または複数のメモリと、
前記１または複数のメモリに格納され、前記１または複数のプロセッサによって動作可能な難読化解除モジュールであって、実行ファイルの複数のコード要素から少なくとも１つの無関係なコード要素を特定し、前記実行ファイルから少なくとも１つの無関係なコード要素を除去する難読化解除モジュールと
を備えたことを特徴とするデバイス。
【請求項２０】
前記実行ファイルはマルウェアであり、前記少なくとも１つの無関係なコード要素の実行は有害なアクションの原因とならないまたは実行可能としないことを特徴とする請求項１９に記載のデバイス。
【発明の詳細な説明】
【背景技術】
【０００１】
（優先出願）
本特許出願は、２０１３年７月２９日に出願された「Ｉｒｒｅｌｅｖａｎｔ  ＣｏｄｅＩｄｅｎｔｉｆｉｃａｔｉｏｎ（無関係なコードの特定）」と題する米国特許出願第１３／９５３，６０８号明細書の利益および優先権を主張し、そのすべての開示内容は参照により本明細書に組み込まれる。
【０００２】
コンピュータおよびインターネットの使用が日常生活でますます大きな部分を占めるにつれ、コンピュータ資源、データ、および個人情報を盗んで破壊することを目的としたセキュリティエクスプロイトおよびサイバー攻撃の問題が深刻化している。例えば、「マルウェア」または悪意のあるソフトウェアは、さまざまな形態の敵対するまたは侵入するコンピュータプログラムを指すために用いられる一般的な用語である。つまり、マルウェアは、サイバー攻撃者がコンピュータ動作を邪魔し、コンピュータに格納されたまたはユーザによってコンピュータに提供された機密情報にアクセスして盗み、またはコンピュータおよび／またはコンピュータのユーザにとって有害である他のアクションを遂行するために使用される。マルウェアは、コンピュータウイルス、ワーム、トロイの木馬、ランサムウェア、ルートキット、キーロガー、スパイウェア、アドウェア、偽装セキュリティソフトウェアおよび他の悪意のあるプログラムを含む場合があり、そしてマルウェアは、実行ファイル、動的リンクライブラリ（ｄｌｌ）、スクリプト、および／または他のタイプのコンピュータプログラムとしてフォーマットされ得る。
【０００３】
政府または民間団体は、マルウェアの使用によって生じるコンピュータへの侵入および盗用を防ぐためにかなりの量の資源を投入している。例えば、政府または民間団体は、プログラムのコードをリバースエンジニアリングしてそのコードを解析し、そのプログラムがマルウェアかどうかを判定するためにセキュリティ研究者を雇うことがある。プログラムがマルウェアであるまたはすでにマルウェアであると知られていると判定されると、セキュリティ研究者は、マルウェアが遂行する１または複数の有害なアクションを特定する任務を負うことがある。従って、プログラムは、セキュリティ研究者がコードを一覧してプログラムがマルウェアであるかおよび／またはマルウェアが遂行する有害なアクションであるかどうかを判定することができるように、高水準の、人間が読み取り可能な言語に変換されることがある。
【０００４】
しかしながら、セキュリティ研究者の心を乱すまたは努力を阻むために、サイバー攻撃者（例えば、ハッカー）は、無関係なコード（例えば、無用な乱数、正当でないマクロコードまたは他の「ジャンク」コード）を正当なコード（例えば、有害なアクションを遂行する意味のあるコード、または関係のあるコード）に意図的に挿入してコードを難読化して正当なコードになりすます。その結果として、マルウェアの正当なコードを解析しようと試みる場合、セキュリティ研究者は、少なくとも大量の無関係なコードを選り分けなければならないので、セキュリティ研究者が、プログラムがマルウェアであるかどうかを判定し、そしてマルウェアが遂行する有害なアクションを判定することは、多大な時間を要する。
【図面の簡単な説明】
【０００５】
詳細な説明は、添付図面を参照して提示される。図面において、参照番号の左端の数字（複数）は、参照番号が最初に現れる図面と同一である。異なる図面における同じ参照番号の使用は、同様または同一の項目を示す。
【図１】正当なコードおよび／または無関係なコードを特定する難読化解除(deobfuscation)モジュール１０２の例示的な実装を示す図である。
【図２】難読化解除モジュールを動作する計算デバイスの例示的な環境およびコンポーネントを示す図である。
【図３】実行ファイル（複数）を逆アセンブルして逆コンパイルし、そして正当なコード要素および無関係なコード要素を判定する例示的なプロセスを示す図である。
【図４】正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けする例示的な進行段階を示す図である。
【図５】正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けする別の例示的な進行段階を示す図である。
【図６】正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けするさらに別の例示的な進行段階を示す図である。
【図７】正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けする例示的なプロセスを示す図である。
【図８】リターン文が正当なコード要素または無関係なコード要素であるかどうかを判定する例示的なプロセスを示す図である。
【発明を実施するための形態】
【０００６】
本明細書で説明される技術では、プログラムを解析する時、解析者が無関係なコードを選り分けるおよび／または考慮に入れる余分な時間を費やさずに済むように、プログラムの正当なコードおよび／または無関係なコードを特定し、および／または識別する。従って、解析者（例えば、セキュリティ研究者）は、プログラムがマルウェアであるかどうかを判定する時および／またはマルウェアがコンピュータ上で実行する有害なまたは不正なアクション（例えば、ファイルの削除、社会保障番号またはクレジットカード番号など、機密情報を標的にすること）を判定する時により効率的に行うことができる。
【０００７】
本明細書で説明される技術では、解析者を潜在的にマルウェアとなり得るプログラムを解析する研究者と呼ぶが、技術はまた、コードの難読化（例えば、正当なコードと意味的に(semantically)無関係なまたは「ジャンクな」コードを合わせたプログラム）を含む悪意のないソフトウェアを考慮に入れる他の解析者にも適用できる。例えば、ウェブサーバアプリケーションは、解析者がウェブサーバアプリケーションのコードにおけるセキュリティの脆弱性を見つけるのをより困難にするコードの難読化を含み得る。デジタルビデオプレーヤは、解析者がビデオデコーディングプロセス（ＤＲＭ）をリバースエンジニアリングするのをより困難にするコードの難読化を含み得る。市販のソフトウェア製品は、ソフトウェア海賊(software pirate)が登録番号をただで作成することがより困難になるように、製品のシリアル番号アルゴリズムを保護するコードの難読化を含み得る。暗号化ソフトウェア製品は、暗号アルゴリズムを隠蔽するコードの難読化を含み得る。それによって、本明細書で論じられるコードの難読化解除は、マルウェア対策のセキュリティ研究者、ホワイトハットの脆弱性研究者、相互運用性の開発者、海賊対策の試験者または他の難読化コードの解析者によって使用され得る。
【０００８】
さまざまな実施形態において、技術は、プログラムの逆アセンブリプロセスおよび／または逆コンパイリングプロセス中に無関係なコード特定できる。技術はその後、解析者に出力されるまたは提示されるプログラムのコードの視覚的表現から無関係なコードを除去できる。視覚的表現は、人間が読み取り可能なフォーマットで出力され得る。さまざまな実施形態において、技術は、プログラムが無関係なコード（例えば、除去されたコード）を実行しないことによってより効率的に実行することができるように、無関係なコードを含むプログラムのバージョンを無関係なコードを含まないプログラムのバージョンに置き換えることができる。従って、解析者は、無関係なコードを選り分ける必要なしにプログラムのコードを一覧することができる。
【０００９】
いくつかの実施形態において、技術は、解析者が有害なアクションの実行に関与する（例えば、ｃａｕｓｅｓ、ｅｎａｂｌｅｓ、ｃｏｎｔｒｉｂｕｔｅｓ  ｔｏなど）関係のある（例えば、意味のある、必要な）コードと、有害なアクションの実行に関与しない無意味なまたは不要なコードとを見分けることができるように、無関係なコードを正当なコードから（例えば、異なる色、強調表示、下線、注釈、ラベル付け、異なるテキストサイズなどによって）区分できる。
【００１０】
それによって、本明細書で論じられる技術は、解析者が彼のまたは彼女の解析を正当なコードに集中させることができるように、コンピュータシステムに潜在的に害を及ぼし得るアクションの原因となるまたは実行可能にするプログラムのコードをクリーンアップする。その一方、解析者は、正当なコードになりすまして、解析者の努力を阻むことを意図する意味的に無関係なまたはジャンクなコードを無視することができる。技術はさらに、無関係なコードを除去することによってプログラムにより効率的に実行させることができる。
【００１１】
本明細書で論じられるように、解析者は、別個のコンピュータプログラムまたは全体のコンピュータプログラムの個々の部分を一覧することができる。例えば、解析者は、プログラムを備える複数の関数から個々の関数を見て解析することができる。プログラミング言語に応じて、プログラムの部分をプロシージャ、ルーチン、サブルーチン、サブプログラム、サブクエリなどと呼ぶこともできる。関数は、本明細書では説明のために使用されているが、説明される技術は、プログラムの任意に分けられる部分または別の外部プログラムなどによって、プログラムの内部に対して個々に呼ばれ得るプログラムの単位と一緒に使用されてもよいことを本明細書の文脈において理解されたい。
【００１２】
プログラムまたはプログラムの一部（例えば、関数）は、正当なコード要素または無関係なコード要素のいずれかになり得る別個に特定可能なコードである複数のコード「要素」を含むことができる。従って、コード要素は、グローバルおよび／またはローカル変数（例えば、ｉｎｔ、ｆｌｏａｔ、ｃｈａｒなど）、文（例えば、ａｓｓｉｇｎｍｅｎｔ、ｃａｌｌ、ｇｏｔｏ、ａｓｓｅｒｔｉｏｎ、ｉｆ−ｔｈｅｎ、ｆｏｒ  ｌｏｏｐ、ｄｏ  ｌｏｏｐ、ｗｈｉｌｅ  ｌｏｏｐ、ｂｌｏｃｋ、ｓｗｉｔｃｈなど）、表現、宣言、またはサイバー攻撃者、ハッカーまたは他のプログラマーが無関係なコード要素として挿入することができ、および特定のアクション（例えば、マルウェアの有害なアクション）を遂行する必要がないプログラムの別個に特定可能なその他のコードを含むことができる。
【００１３】
図１は、解析者１０４（例えば、セキュリティ研究者、ホワイトハットの脆弱性研究者、相互運用性の開発者、海賊対策の試験者など）がプログラムによって遂行されるアクションに寄与しない、および関連付けられていない無関係なコードを解析して考慮に入れる余分な努力を費やさずに済むように、プログラム（例えば、マルウェアプログラム）の正当なコードおよび／または無関係なコードを特定する難読化解除モジュール１０２の例示的な概略図１００を示している。一部の事例において、難読化解除モジュール１０２は、計算デバイス１０８のプレゼンテーション機構１０６経由で解析者１０４に提供される人間が読み取り可能なコードの視覚的表現（例えば、テキスト出力、制御フローグラフなど）から無関係なコードを完全に除去できる。他の事例において、難読化解除モジュール１０２は、解析者１０４によって考慮に入れられる正当なコードと解析者１０４によって無視される無関係なコードとを（例えば、テキストの色、テキストのサイズ、強調表示、注釈などによって）区分することができる。さらなる事例において、難読化解除モジュール１０２は、より効率的に実行することができるように、プログラムから無関係なコードを除去し、そしてジャンクのないプログラムをメモリに格納できる。これは、ユーザがプログラムのコードの変更（例えば、無関係なコードの除去）を一切見ないように透過的に行われ得る。
【００１４】
従って、難読化解除モジュール１０２は、解析者１０４によって（例えば、ローカルにまたはリモートに）制御されて操作され得る計算デバイス１０８上で実行する。計算デバイス１０８は、ラップトップコンピュータ、デスクトップコンピュータ、タブレットコンピュータ、ポータブルコンピュータ、スマートフォン、携帯電話、携帯情報端末（ＰＤＡ、電子書籍デバイス、ゲーム機、パーソナルメディアプレーヤデバイス、サーバコンピュータ、またはコードが解析者１０４によってプレゼンテーション機構１０６（例えば、表示画面、コンピュータモニタなど）経由で出力されて一覧表示されることができるように、プログラムを受信して、プログラムのバイナリコードを人間が読み取り可能なフォーマット（例えば、高水準のプログラミング言語）に変換することができるその他の電子デバイスなど、さまざまなデバイスのうちのいずれか１つを含むことができるが、これらに限定されない。
【００１５】
上記で論じたように、解析者は、典型的には、要素１１０に示すように、正当なコード間に散在する無関係なコードを含み得る数百のコード要素を行単位で考慮に入れなければならない。つまり、サイバー攻撃者およびハッカーは、解析者１０４による正当なコードの解析を乱すまたは阻止するための無関係なコードを意図的に挿入することによってマルウェアの有害なアクションまたは他の悪意のあるプログラムを実行するコードを難読化する。無関係なコードはまた、プログラムの実行速度を落とすことにもなる。従って、難読化解除モジュール１０２は、例えば、要素１１２に示すように、無関係なコードが考慮から除外されるように、プログラムのコードの１または複数の要素が正当なコードまたは無関係なコードと見込まれると判定するように構成され得る。
【００１６】
図２は、難読化解除モジュール１０２を動作する計算デバイス１０８のコンポーネントをさらに説明する環境２００を示している。
【００１７】
計算デバイス１０８は、１または複数のプロセッサ２０２およびメモリ２０４を含むことができる。プロセッサ（複数）２０２は、単独の処理装置またはいくつかの処理装置であってよく、各装置は、複数の異なる処理装置を含むこともあり得る。プロセッサ（複数）２０２は、マイクロプロセッサ、マイクロコンピュータ、マイクロコントローラ、デジタル信号プロセッサ、中央処理装置（ＣＰＵ）、画像処理装置（ＧＰＵ）などを含むことができる。代替的に、または付加的には、本明細書で説明される技術は、少なくとも一部において、１または複数のハードウェア論理コンポーネントによって遂行され得る。例えば、使用することができる図示したタイプのハードウェア論理コンポーネントは、ＦＰＧＡ(Field-programmable Gate Array)、ＡＳＩＣ(Program-specific Integrated Circuit)、ＡＳＳＰ(Program-specific Standard Products)、ステートマシン、ＣＰＬＤ(Complex Programmable Logic Device)、他の論理回路、システムオンチップ（ＳｏＣ）、および／または操作命令に基づいて信号をマニピュレートするその他のデバイスを含むがこれらに限定されない。能力の中でも特に、プロセッサ（複数）２０２は、メモリ２０４に格納されたコンピュータが読み取り可能な命令およびデータをフェッチするおよび／または実行するように構成され得る。
【００１８】
メモリ２０４は、コンピュータが読み取り可能な媒体の１つまたは組み合わせを含むことができる。本明細書で使用される際、「コンピュータが読み取り可能な媒体」は、コンピュータ記憶媒体および通信媒体を含む。
【００１９】
コンピュータ記憶媒体は、コンピュータが読み取り可能な命令、データ構造、プログラムモジュール、または他のデータなど、情報を格納するための任意の方法または技術に実装される揮発性および不揮発性、リムーバブルおよびノンリムーバブル媒体を含む。コンピュータ記憶媒体は、相変化メモリ（ＰＲＡＭ）、スタティックランダムアクセスメモリ（ＳＲＡＭ）、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）、他のタイプのランダムアクセスメモリ（ＲＡＭ）、リードオンリーメモリ（ＲＯＭ）、ＥＥＰＲＯＭ(electrically erasable programmable ROM)、フラッシュメモリまたは他のメモリ技術、コンパクトディスクＲＯＭ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）または他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置または他の磁気記憶デバイス、またはアクセス情報を格納するために計算デバイスによって使用され得るその他の媒体を含むが、これらに限定されない。
【００２０】
その一方、通信媒体は、コンピュータが読み取り可能な命令、データ構造、プログラムモジュール、または搬送波など、変調データ信号による他のデータを具体化できる。本明細書で定義される際、コンピュータ記憶媒体は、通信媒体を含まない。
【００２１】
メモリ２０４は、他のモジュール、コンポーネントおよびデバイス（例えば、周辺デバイス、リモートデバイスなど）の利益のために計算デバイス１０８内およびその計算デバイスに結合されたハードウェアおよびサービスを管理するように構成されているオペレーティングシステム２０６を含む。メモリ２０４はまた、入力モジュール２０８、逆アセンブラモジュール２１０、逆コンパイラモジュール２１２、難読化解除モジュール１０２、出力モジュール２１４および１または複数のレジスタ（複数）２１６も含むことができ、それぞれについて本明細書でさらに論じられる。
【００２２】
本明細書で使用される際、用語「モジュール」は、考察を目的とした、ソフトウェアの例示的な分割を表すことを意図し、任意のタイプの要件または必要とされる方法、やり方または組織を表すことを意図しない。それによって、さまざまな「モジュール」が論じられるが、それらの機能および／または同様の機能は、異なって配置されることもあり得る（例えば、より少ない数のモジュールに組み合わされる、より多い数のモジュールに細分化されるなど）。さらに、ある関数およびモジュールは、本明細書ではプロセッサ上で実行可能なソフトウェアおよび／またはファームウェアによって実装されるものとして説明されているが、他の実施形態において、モジュールの一部または全ては、（例えば、ＡＳＩＣ、専用処理装置などのような）ハードウェアが、説明された関数を実行することによって全体においてまたは一部において実装され得る。一部の事例において、本明細書で論じられる機能および／またはモジュールは、オペレーティングシステム２０６の一部として実装され得る。他の事例において、機能および／またはモジュールは、デバイスドライバ、ファームウェアなどの一部として実装され得る。
【００２３】
さまざまな実施形態において、計算デバイス１０８はまた、解析者１０４から入力を受信する入力装置（複数）２１８（例えば、キーボード、マウス、マイクロフォン、カメラ、センサなど）と、解析者１０４にコードを伝達するおよび／または視覚的に提示する出力装置（複数）２２０（例えば、表示画面、スピーカ、プリンタなど）も含む。計算デバイス１０８はまた、ローカルエリアネットワーク（「ＬＡＮ」）、ワイドエリアネットワーク（「ＷＡＮ」）、携帯電話ネットワーク（ＭＴＮ）といったより広いネットワーク、および／またはインターネットといったネットワークの集合など、１または複数のさまざまなネットワークへの接続を確立するように構成された通信装置（複数）２２２も含むことができる。
【００２４】
さまざまな実施形態において、入力モジュール２０８は、解析者１０４によって解析されおよび／または計算デバイス１０８上で実行されるプログラム２２４を例えば、通信装置（複数）２２２経由で受信するように構成される。プログラム２２４は、１または複数の実行ファイル（例えば、ｅｘｅ、ｄｌｌなど）を備えることができる。プログラム２２４は、政府機関または企業体によってセキュリティサービスを提供する任務を負う（例えば、マルウェアを特定し、マルウェアの有害なアクションを回避するなど）解析者１０４に提供され得る。一実施形態において、解析者１０４が、プログラム２２４がマルウェアであるかどうか、およびマルウェアであれば、マルウェアが遂行する有害なアクションを判定することができるように、プログラム２２４は、計算デバイス１０８および解析者１０４に提供され得る。他の実施形態において、計算デバイス１０８および解析者１０４に提供されるプログラム２２４は、すでにマルウェアであると知られている場合もあり、解析者１０４は、マルウェアが遂行する有害なアクションを判定する作業（例えば、マルウェアの有害なアクションを回避する矯正アクションを実装することができるように、コードをリバースエンジニアリングする）を有する。
【００２５】
さまざまな実施形態において、逆アセンブラモジュール２１０は、プログラム２２４のバイナリコードをアセンブリ言語または人間が読み取り可能なフォーマット（例えば、逆アセンブルされたコードまたは低水準のプログラミング言語）に変換する。バイナリコードの逆アセンブリングは、解析者１０４がプログラム２２４をリバースエンジニアリングするのに役立つ、人間が読み取り可能なフォーマットにすることができる。
【００２６】
さまざまな実施形態において、逆コンパイラモジュール２１２は、逆アセンブラモジュール２１０によって出力される逆アセンブルされたコードを受け取って、逆アセンブルされたコードを、解析者１０４がコードをより良く理解して解析することができる高水準のプログラミング言語に逆コンパイルする。逆アセンブルされたコードの逆コンパイリングプロセスの一部として、逆コンパイラモジュール２１２は、プログラム２２４の異なる部分（例えば、関数）および／または個々の部分へのさまざまな入力（例えば、引数）を個々に特定できる。
【００２７】
上記で論じたように、解析者によって考慮に入れられる逆アセンブルされて逆コンパイルされたコードは、典型的には、正当なコード要素（例えば、有害なまたは意味のあるアクションの実行に関与するコード要素１−Ｎ）に散在する無関係なコード要素（例えば、有害なまたは意味のあるアクションの実行に関与しないコード要素１−Ｍ）を含む難読化コード２２６を含む。難読化コード２２６は、解析者１０４または難読化コード２２６を解析するその他の人によって遂行される解析に負担をかけ得る正当なコードおよび／または無関係なコードから成る多数の行（例えば、数百行または数千行）を含む場合がある。
【００２８】
それによって、難読化解除モジュール１０２は、コードの個々の要素を、解析者１０４によって考慮に入れられる正当なコード要素か、解析者１０４によって無視される無関係なコード要素のいずれかであると特定するおよび／または内部的にラベル付けする（例えば、マークを入れる、タグを付けるなど）ように構成される。難読化解除モジュール１０２は、逆コンパイラモジュール２１２内で使用されるモジュールまたは逆コンパイラモジュール２１２と一緒に使用されるモジュールとして実装され得る。さらに、難読化解除モジュール１０２は、逆アセンブラモジュール２１０内で使用されるモジュールまたは逆アセンブラモジュール２１０と一緒に使用されるモジュールとして実装され得る。例えば、難読化解除モジュール１０２は、逆コンパイラモジュール２１２および／または逆アセンブラモジュール２１０をサポートするプログラム可能なプラグインまたはアドオンにすることができる。つまり、コンピュータプログラマーは、難読化解除モジュール１０２を備えるコードを書き込むことができ、そしてそのコードは、正当なコード要素と無関係なコード要素とを特定し、そして識別するコードの内部表現とインタラクトできる。
【００２９】
さまざまな実施形態において、解析者１０４がプログラム２２４を一覧して、プログラムが特定のタイプのプログラム（例えば、マルウェア）および／または計算デバイス上で実行される時にプログラムが遂行するアクション（例えば、マルウェアによって実行される有害なアクション）であるかどうかを判定することができるように、出力モジュール２１４は、プログラム２２４を備えるコードのクリーンアップバージョン２２８を視覚的に出力するように構成される。例えば、コードのクリーンアップバージョン２２８は、難読化解除モジュール１０２によって特定される無関係なコード要素を含まないようにできる（例えば、無関係なコード要素は、出力から除去されるまたは隠蔽される）。その結果として、解析者１０４が大量の無関係なコードを一覧して選り分ける必要がないので、解析者１０４は、解析を遂行する時により効率的に行うことができる。別の例において、解析者１０４がプログラム２２４を備える全てのコードを一覧することができるが、解析者１０４が解析される正当なコード要素と、区分の結果として無視される無関係なコード要素とを容易に識別することができるように、コードのクリーンアップバージョン２２８は、正当なコードおよび／または無関係なコードを区分できる。一部の事例において、出力モジュール２１４は、無関係なコードが含まれるが区分されていない第１のバージョン、および無関係なコードが除去された第２のバージョンである、プログラムのコードの２つのバージョンを出力できる。従って、解析者１０４は、難読化解除モジュール１０２の改善および／または結果の機能を可視化できるようになる。
【００３０】
さまざまな実施形態において、出力モジュール２１４は、コードのクリーンアップバージョン２２８をテキスト形式で出力できる。いくつかの実施形態において、出力モジュール２１４は、コードのクリーンアップバージョン２２８を制御フローグラフとして出力できる。逆アセンブラモジュール２１０および／または逆コンパイラモジュール２１２は、制御フローグラフを、条件文のフローを示す視覚的表現として作成する機能を含むことができる。
【００３１】
さまざまな実施形態において、クリーンアップコード２２８を視覚的に出力する代わりにまたはそれに加えて、難読化解除モジュール１０２は、より効率的に実行できるように、クリーンアップコード２２８をメモリ２０４の一部に格納できる。これは、ユーザがプログラムのコードの変更（例えば、無関係なコードの除去）を一切見ないように透過的に行われ得る。一部の事例において、難読化解除モジュール１０２は、リモートに格納されるおよび／または実行されることができるように、クリーンアップコード２２８を通信装置（複数）２２２経由でリモートデバイスに送信できる。
【００３２】
図３は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの組み合わせに実装することができる動作のシーケンスを表す論理フローグラフとする、例示的なプロセスを示している。ソフトウェアの文脈において、動作は、１または複数のプロセッサによって実行される場合、列挙された動作を遂行するコンピュータが読み取り可能な命令を表す。一般的に、コンピュータが読み取り可能な命令は、特定の関数を遂行するまたは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。いくつかの実施形態において、動作の一部または全ては、説明した機能を実行する（例えば、ＡＳＩＣ、専用処理装置などのような）ハードウェアによって全体においてまたは一部において実装され得る。
【００３３】
動作が説明される順序は、限定として解釈されることを意図せず、そして説明される任意の数の動作は、任意の順序で組み合わされおよび／または並行してプロセスを実装することができる。図３の例示的な動作は、図１および図２に示されているモジュール、コンポーネントおよび／または要素を参照して説明され得る。
【００３４】
図３は、プログラム２２４を受信し、そしてプログラム２２４を、人間が読み取り可能なフォーマットで解析者１０４に視覚的に出力される、コードのクリーンアップバージョン２２８に変換する例示的なプロセス３００を示している。コードのクリーンアップバージョン２２８はまた、実行のために格納されてもよい。
【００３５】
動作３０２において、入力モジュール２０８は、プログラム２２４を備える１または複数の実行ファイルを受信する。さまざまな実施形態において、プログラム２２４は、周知のマルウェアプログラムでない場合もあり、従って、プログラム２２４は、計算デバイス１０８に提供されて、解析者１０４が、プログラム２２４がマルウェアであるかどうかを判定し、および／または実行される時にマルウェアが遂行する有害なアクションを特定することができる。他の実施形態において、プログラム２２４は、すでにマルウェアであると知られている場合もあり、解析者１０４は、プログラムのコードをリバースエンジニアリングして解析し、実行される時にマルウェアが遂行する有害なアクションを特定する任務を負うこともある。
【００３６】
動作３０４において、逆アセンブラモジュール２１０は、入力モジュール２０８によって受信された実行ファイルを逆アセンブルする。つまり、逆アセンブラモジュール２１０は、実行ファイルのバイナリコードを人間が読み取り可能なフォーマット（例えば、低水準のプログラミング言語）に変換する。
【００３７】
動作３０６において、コードが、解析者１０４がコードをより良く理解して解析することができる高水準のプログラミング言語に（例えば、テキスト出力または制御フローグラフ経由で）変換されるように、逆コンパイラモジュール２１２は、逆アセンブルされたコードを逆コンパイルする。
【００３８】
動作３０８において、難読化解除モジュール１０２は、正当なコード要素を判定する。さまざまな実施形態において、難読化解除モジュール１０２は、一部のコード要素が正当なコード要素（例えば、仮定された正当なコード要素の第１または初期のセット）であると初期にまたは自動的に仮定することによって正当なコード要素を判定する。例えば、難読化解除モジュール１０２は、以下：プログラムの一部への入力（例えば、関数の引数）、全プログラムに定義されるグローバル変数、関数呼び出しのパラメータとして使用されるローカル関数変数、関数呼び出しの戻り値を格納するローカル関数変数、および／またはリターン文に使用されるローカル関数変数の１または複数が正当なコード要素であると仮定できる。
【００３９】
さまざまな実施形態において、難読化解除モジュール１０２が、仮定された正当なコード要素の第１または初期のセットを仮定した後、難読化解除モジュール１０２は、第１または初期のセットとインタラクトする関数の他のコード要素もまた、正当なコード要素（例えば、仮定された正当なコード要素から読み取られるまたはその要素に書き込まれる値を有するコード要素）であると判定できる。別のコード要素とインタラクトするコード要素はまた、汚染(tainting)コード要素または接触(touching)コード要素と呼ばれることもある。
【００４０】
動作３１０において、難読化解除モジュール１０２は、無関係なコード要素を判定する。さまざまな実施形態において、難読化解除モジュール１０２は、正当なコードであると判定されないような無関係なコード要素を判定する。例えば、難読化解除モジュール１０２が正当なコード要素を特定し、および／またはラベル付けした後、残りのコード要素は、無関係なコードであると判定され、それに応じてラベル付けされ得る。
【００４１】
いくつかの実施形態において、上記で論じた動作３０８および３１０は、逆アセンブリング動作３０４および／または逆コンパイリング動作３０６の一部としておよび／またはそれと一緒に遂行され得る。
【００４２】
動作３１２において、出力モジュール２１４は、プログラムの正当なコードの視覚的表現を提示する。さまざまな実施形態において、視覚的表現は、無関係なコード要素を含まない（例えば、出力モジュール２１４は、ラベル付けされた無関係なコード要素を探し出して除去する）。さまざまな実施形態において、視覚的表現を一覧している解析者１０４が無関係なコードと正当なコードとを識別することができるように、視覚的表現は、無関係なコード要素を区分する。例えば、出力モジュール２１４は、ラベル付けされたコード要素および／またはラベル付けされた正当なコード要素に対して区分調整（例えば、テキストの色、強調表示、注釈、マーキングなど）を遂行できる。
【００４３】
図４から図６は、プログラムの例示的な一部（逆アセンブリおよび逆コンパイリングの後の関数）の正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けする難読化解除モジュール１０２の例示的な進行を示している。
【００４４】
例えば、図４は、進行における初期の段階４００を示している。関数は、入力コード要素４０２または引数（例えば、ｉｎｔ  ａ１、ｉｎｔ  ａ２、ｉｎｔ  ａ３）を含む。この例において、難読化解除モジュール１０２は、例示的な要素４０４（例えば、「ｖ１０＝ａ１」）に示すように、入力コード要素４０２が正当なコード要素の初期のセットであり、従って、入力コード要素４０２の１つとインタラクトする任意のコード要素も正当であると仮定する。その一方、難読化解除モジュール１０２は、例示的な要素４０６（例えば、関数に挿入される大きい乱数）に示すように、正当なコード要素とインタラクトしない他のコード要素が無関係なコード要素であると判定できる。
【００４５】
図５は、進行における中間段階５００を示している。正当なコード要素の特定および／またはラベル付けを示すのに役立つように、図５において用語「ＯＫ」が使用される。しかしながら、この明細書の文脈は、正当なコード要素および／または無関係なコード要素を内部的にまたは視覚的にラベル付けする（例えば、マークを入れる、タグを付けるなど）か、または正当なコード要素と無関係なコードとを内部的にまたは視覚的に識別する（例えば、他のラベルまたは指定、強調表示、色、テキストサイズ、注釈など）他のやり方を企図する。
【００４６】
図５に示すように、入力コード要素５０２は、初期に正当であると仮定される（例えば、「ＯＫ」とラベル付けされる）。従って、その仮定に基づいて、難読化解除モジュール１０２は、コード要素が正当なコード要素（例えば、入力コード要素５０２）とインタラクトするかどうかを判定する関数によって各コード要素の評価を開始する。例えば、例示的なコード要素５０４は、その要素が「ａ１」とインタラクトする理由で「ｖ１０」はＯＫであることを示す。従って、ｖ１０の引数または定義もまた、５０６に示すように「ＯＫ」とラベル付けされるということになる。従って、難読化解除モジュール１０２は、仮定された正当なコード要素（例えば、入力コード要素５０２）とインタラクトするコード要素の第２のセットを特定する第１の評価反復を遂行できる。
【００４７】
さらに、難読化解除モジュール１０２は、特定されたばかりの正当なコード要素（例えば、前の反復において正当と特定されたコード要素）とインタラクトするコード要素の後続グループを特定する１または複数の後続評価反復を遂行できる。例えば、例示的なコード要素５０８は、５１０に示すように、「ａ３」とのインタラクションに基づいて、そのコード要素が、正当なコード要素と特定された「ｖ８」とインタラクトする理由で「ｖ４」は「ＯＫ」であることを示す。従って、「ｖ４」の引数または定義もまた、５１２に示すように「ＯＫ」とラベル付けされるということになる。
【００４８】
従って、難読化解除モジュール１０２は、評価反復がこれ以上のインタラクションを明示しなくなるまで（例えば、最終の反復まで）正当とラベル付けされたコード要素とインタラクトするコード要素の特定を継続する複数の反復を遂行できる。
【００４９】
図５はさらに、関数の値を戻すコード要素５１４を示している。正当なコード要素のラベル付けに見られるように、コード要素５１４の表現は、正当なコード要素に基づいていない（例えば、難読化解除モジュール１０２は、「ｖ７」または「ｖ９」を正当と特定しなかった）。コード要素５１４は、図８を参照して本明細書でさらに論じるように、無関係なコード要素または正当なコード要素として考慮に入れられ得る。
【００５０】
図６は、無関係なコード要素が関数から除去されたまたは一覧表示から隠蔽された段階６００を示している。図示されたように、図６に提示されているコード要素は、正当としてそれぞれラベル付けされている（例えば、図５からの「ＯＫ」要素）。つまり、難読化解除モジュール１０２は、正当とラベル付けされていない図５からのコード要素が逆に、意味的に無関係なコード要素であると判定した。いくつかの実施形態において、難読化解除モジュール１０２は、無関係なコード要素を、図５の「ＯＫ」の使用と同様に無関係またはジャンクとラベル付けする（例えば、マークを入れる、タグを付ける）ことができる。
【００５１】
図６は、出力モジュール２１４によって出力され得る視覚的表現の例である。図示されたように、図６の関数の内容は、図４の関数の内容に比べて解析者１０４が考慮に入れて理解するのが容易である。
【００５２】
図４から図６の仮定された正当なコード要素は、入力コード要素であるが、この明細書の文脈において、仮定された正当なコード要素もまた、全プログラムに定義されるグローバル変数、関数呼び出しのパラメータとして使用されるローカル関数変数、関数呼び出しの戻り値を格納するローカル関数変数、および／またはリターン文に使用されるローカル関数変数の１または複数を含むこともできることを理解されたい。
【００５３】
図７から図８もまた、ハードウェア、ソフトウェア、ファームウェア、またはそれらの組み合わせに実装することができる動作のシーケンスを表す論理フローグラフとして図示された例示的なプロセスを示している。ソフトウェアの文脈において、動作は、１または複数のプロセッサによって実行される場合、列挙された動作を遂行するコンピュータが実行可能な命令を表す。一般的に、コンピュータが実行可能な命令は、特定の関数を遂行するまたは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含む。いくつかの実施形態において、動作の一部または全ては、説明した機能を実行する（例えば、ＡＳＩＣ、専用処理装置などのような）ハードウェアによって全体においてまたは一部において実装され得る。一部の事例において、関数および／またはモジュールは、オペレーティングシステムの一部として実装される。他の事例において、関数および／またはモジュールは、デバイスドライバ（例えばタッチ表面のドライバ）、ファームウェアなどの一部として実装される。
【００５４】
動作が説明される順序は、限定として解釈されることを意図せず、そして説明される任意の数の動作は、任意の順序で組み合わされおよび／または並行してプロセスを実装することができる。図７から図８の例示的な動作は、図１から図６に示されているモジュール、コンポーネントおよび／または要素を参照して説明され得る。
【００５５】
図７は、正当なコード要素および／または無関係なコード要素を特定するおよび／またはラベル付けする例示的なプロセス７００を示している。例示的なプロセス７００は、プログラム（例えば、マルウェア、ウェブサーバアプリケーション、ビデオデコーディングプロセス、市販のソフトウェア製品、暗号ソフトウェア製品など）を備える１または複数の実行ファイル部で遂行され得る。
【００５６】
動作７０２において、難読化解除モジュール１０２は、正当性の初期の仮定を判定する。例えば、難読化解除モジュール１０２は、以下：プログラムの一部（例えば、関数引数）への入力、全プログラムに定義されるグローバル変数、関数呼び出しのパラメータとして使用されるローカル関数変数、関数呼び出しの戻り値を格納するローカル関数変数、および／またはリターン文に使用されるローカル関数変数の１または複数が、仮定された正当なコード要素であると定義する設定にアクセスできる。
【００５７】
動作７０４において、難読化解除モジュール１０２は、仮定に基づいてプログラム（例えば、関数）の一部のコード要素の初期のまたは第１のセットを特定する。例えば、難読化解除モジュール１０２は、入力コード要素４０２を特定できる。
【００５８】
動作７０６において、難読化解除モジュール１０２は、第１のコード要素を正当とラベル付けする。例えば、難読化解除モジュール１０２は、入力コード要素５０２を「ＯＫ」とラベル付けすることができる。
【００５９】
動作７０８において、難読化解除モジュール１０２は、第１のコード要素とインタラクトする後続のコード要素を判定する。例えば、難読化解除モジュール１０２は、コード要素５０４および５１０を入力コード要素５０２とインタラクトするコード要素と特定できる。
【００６０】
動作７１０において、難読化解除モジュール１０２は、後続コード要素を正当とラベル付けする。例えば、難読化解除モジュール１０２は、コード要素５０４および５１０を「ＯＫ」とラベル付けすることができる。例示的なプロセスはその後、動作７０８に戻って別の評価反復を遂行する。つまり、難読化解除モジュール１０２は、前の反復において正当と特定されたコード要素とインタラクトする後続コード要素を判定する。例えば、難読化解除モジュール１０２は、コード要素５０８を、前の反復において正当と特定された、コード要素５１０とインタラクトするコード要素と特定できる。
【００６１】
さまざまな実施形態において、難読化解除モジュール１０２は、評価反復がコード要素と正当なコード要素との間のインタラクションを明示しなくなるまで評価反復の遂行を継続する。
【００６２】
動作７１２において、難読化解除モジュール１０２はその後、残りのコード要素が正当なコード要素とラベル付けされない理由でそれらの要素を無関係なコード要素とラベル付けできる。
【００６３】
リターン文が正当なコード要素に基づいていなくても（例えば、図５の要素５１４は、無関係なコード要素であると判定されている）、解析者１０４がリターン文または戻り値を一覧してもよいおよび／または考慮に入れてもよい事例があり得る。それによって、難読化解除モジュール１０２は、無関係なコード要素であるリターン文を出力（例えば、視覚的表現）から除去するデフォルト設定を実装できる。難読化解除モジュール１０２はまた、その他の無関係なリターン文を正当とラベル付けできる代替設定を実装して、その文が解析者１０４に提示されて解析されるようにすることもできる。この代替設定は、関数の呼び出し側(caller)がリターン文によって戻された値を使用するシナリオに適用され得る。
【００６４】
図８は、リターン文が正当なコード要素または無関係なコード要素かどうかを判定する例示的なプロセス８００を示している。
【００６５】
動作８０２において、難読化解除モジュール１０２は、関数のリターン文が無関係なコードのリターン文であると判定する（例えば、例示的なプロセスを実装した後、難読化解除モジュール１０２は、コード要素５１４を無関係と特定してラベル付けする）。
【００６６】
動作８０４において、難読化解除モジュール１０２は、リターン文をレジスタ（複数）２１６（例えば、ＥＡＸレジスタ、ＲＡＸレジスタなど）の少なくとも１つの記憶場所にマップする。
【００６７】
決定動作８０６において、難読化解除モジュール１０２は、レジスタの特定された記憶場所の値がその記憶場所から読み取られているか否かを判定する。例えば、バイナリコードの静的な逆アセンブリに基づいて、難読化解除モジュール１０２は、その値が記憶場所から読み取られているかまたは関数によって記憶場所に単に書き込まれているかどうかを判定することができる。
【００６８】
決定動作８０６の応答が「はい」（例えば、値が読み取られている）であれば、決定動作８０８において、難読化解除モジュール１０２は、前に無関係であると判定されたリターン文を正当なコード要素とラベル付けする（例えば、ラベルのオーバーライド）。決定動作８０６の応答が「いいえ」（例えば、値が読み取られず、唯一書き込まれている）であれば、動作８１０において、難読化解除モジュール１０２は、リターン文を無関係なコード要素とするラベル付けを維持する。
【００６９】
さまざまな実施形態において、難読化解除モジュール１０２は、無関係とオーバーライドされたラベルを正当なコード要素に提供できる。例えば、難読化解除モジュール１０２は、正当なｇｏｔｏ文が無関係なコード要素に移動する（例えば、ポイントする、参照する、アクセスする）ことを判定できる。従って、難読化解除モジュール１０２は、ｇｏｔｏ文を無関係とラベル付けして、それを出力（例えば、視覚的表現）から除去できる。一部の事例において、無関係なコード要素に移動する正当なｇｏｔｏ文を無関係とラベル付けする代わりに、難読化解除モジュール１０２は、ｇｏｔｏ文が正当なコード要素（例えば、無関係なコード要素の次の正当なコード要素）に移動するように、ｇｏｔｏ文を変えることができる。
【００７０】
さまざまな実施形態において、難読化解除モジュール１０２は、プログラムのさまざまな関数によって呼び出されるラベル付けされたマクロのリストを維持できる。例えば、難読化解除モジュール１０２は、マクロの第１のセットがトリビアル(trivial) （例えば、バイトを循環またはシフトさせるマクロ、一定数のビットをマスクするマクロ）であり、意味のある動作を遂行しないので、無関係なコード要素であると判定できる。その一方、難読化解除モジュール１０２は、マクロの第２のセットが複雑で有害なアクションを遂行するマルウェアにとって必要となる恐れがあると判定できる。
【００７１】
さまざまな実施形態において、解析者１０４は、難読化解除モジュール１０２の機能と関連付けられた設定をカスタマイズする入力を提供できる。例えば、解析者１０４は、出力（例えば、テキスト出力または制御フローグラフ）を一覧表示する優先フォーマットを定義できる。さらに、解析者１０４は、難読化解除モジュール１０２に、一覧から除去されて隠蔽された無関係なコード（例えば、図６に示したテキスト）の視覚的表現を出力するか、または正当なコード要素と無関係なコード要素（例えば、図５に示したテキスト）とを区分するまたは識別する視覚的表現を出力するように命令する設定を定義できる。解析者１０４はまた、正当なコード要素と無関係なコード要素とを識別する好適なやり方（例えば、視覚的ラベル、テキストの色、強調表示、注釈など）も定義できる。
【００７２】
さまざまな実施形態において、クリーンアップコードの出力に付加的に、または代替的に、難読化解除モジュール１０２は、現在の実行または今後の実行のためにクリーンアップコードをメモリ（例えば、ローカルメモリまたはリモートメモリ）に格納できる。
【００７３】
（結論）
発明の主題を、構造的特徴および／または方法論的動作に特有の言葉で説明しているが、特許請求の範囲において定義される発明の主題は、上記の特有の特徴または動作に必ずしも限定されないことが理解されよう。むしろ、上記の特有の特徴または動作は、特許請求の範囲を実施する例示的な形として説明されている。
【図１】
2016525760.tif 000003
【図２】
2016525760.tif 000004
【図３】
2016525760.tif 000005
【図４】
2016525760.tif 000006
【図５】
2016525760.tif 000007
【図６】
2016525760.tif 000008
【図７】
2016525760.tif 000009
【図８】
2016525760.tif 000010
【国際調査報告】
2016525760.tif 000011
2016525760.tif 000012