(57)【要約】  本発明のいくつかの実施形態の一態様によれば、コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法が提供され、この方法は、コンピュータのプロセッサ上で、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成した、許可されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、テンプレートが記憶デバイスのリポジトリに格納されている、マッチを識別する行為、および、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、を実行するステップを含む。【選択図】  図１
2019502197.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法であって、前記コンピュータのプロセッサ上で、
コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、
前記ランタイム生成コードに関連するシグネチャデータと、前記ランタイム生成コードを作成した、許可されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、前記テンプレートが記憶デバイス上のリポジトリに格納されている、マッチを識別する行為、および、
マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、
を実行するステップを含む、方法。
【請求項２】
前記テンプレートシグネチャが、許可されたジャストインタイム（ＪＩＴ）コンパイラを表す、請求項１に記載の方法。
【請求項３】
前記シグネチャデータと前記テンプレートシグネチャとの間の前記マッチを識別するステップが、
オペレーティングシステム機能を呼び出すために前記ランタイム生成コードによって呼び出された第１の実行可能なモジュールと、前記許可されたＪＩＴコンパイラを表す前記テンプレートとの間の関連を識別するステップ、および、
前記ランタイム生成コードを作成した第２の実行可能なモジュールと、前記許可されたＪＩＴコンパイラを表す前記テンプレートとの間の関連を識別するステップ
のうちの少なくとも一方を含む、請求項２に記載の方法。
【請求項４】
前記シグネチャデータが、前記ランタイム生成コードを格納する前記メモリにおけるエリアのあらかじめ定義されたサイズを含む、請求項２に記載の方法。
【請求項５】
前記シグネチャデータが、前記ランタイム生成コードを格納するメモリ領域の、読取り専用またはアクセス禁止としての指定を含む、請求項２に記載の方法。
【請求項６】
前記シグネチャデータが、少なくとも１つのコードパターンを含む、請求項２に記載の方法。
【請求項７】
前記少なくとも１つのコードパターンが、前記ランタイム生成コードの少なくとも１つの関数の開始領域における少なくとも１つのあらかじめ定義されたプロローグ、少なくとも１つのエピローグ、および少なくとも１つのマジックオペランド値からなるグループから選択される少なくとも１つのメンバを含む、請求項６に記載の方法。
【請求項８】
前記シグネチャデータが、前記ランタイム生成コードの開始領域および終了領域のうちの少なくとも一方に、前記ＪＩＴコンパイラに関係するあらかじめ定義された制御構造を含む、請求項２に記載の方法。
【請求項９】
前記あらかじめ定義された制御構造が、前記ランタイム生成コードの一部分を各々格納する複数の異なるメモリ領域の各々にあるリンクリスト、ならびに前記それぞれのリンクリストの後に位置する前記それぞれのメモリ領域のサイズおよびアドレスを定義するフィールドのうちの少なくとも一方を含む、請求項８に記載の方法。
【請求項１０】
前記リンクリストが、各メモリ領域のポインタをトラバースすることによって検証され、前記フィールドが、前記フィールドの前記値をオペレーティングシステム値と相関させることによって検証される、請求項９に記載の方法。
【請求項１１】
前記シグネチャデータが、前記許可されたＪＩＴコンパイラが制限される前記ランタイム生成コードに関連するアプリケーションを含む、請求項２に記載の方法。
【請求項１２】
前記テンプレートシグネチャが、許可されたフックエンジンを表す、請求項１に記載の方法。
【請求項１３】
前記シグネチャデータが、前記ランタイム生成コードがフックエンジンによって作成されるという識別を含み、前記識別が、
フックされたモジュールの外にある外部コードに到達するために、前記フックされたモジュールの前記プロローグにおける既存のコードをエミュレートすること、および
前記フックをインストールした前記許可されたフックエンジン実行ファイルの前にスタックトレースに現れる前記ランタイム生成コードの位置を特定することによって前記ランタイム生成コードを識別するために、前記外部コードに関係する前記スタックトレースを分析すること、
のうちの少なくとも一方によって行われる、請求項１２に記載の方法。
【請求項１４】
前記シグネチャデータが、前記ランタイム生成コードがある前記メモリエリアのあらかじめ定義されたサイズ、少なくとも１つのコードパターン、前記ランタイム生成コードメモリ領域の開始部分および終了部分のうちの少なくとも一方におけるあらかじめ定義された制御構造、ならびに可変パラメータを除いて前記ランタイム生成コードに逆アセンブルプログラムを適用することによって取得されたアセンブリから計算されたオペコードシグネチャからなるグループから選択される少なくとも１つのメンバを含む、請求項１２に記載の方法。
【請求項１５】
前記少なくとも１つのコードパターンが、前記ランタイム生成コードの少なくとも１つの関数の開始領域における少なくとも１つのあらかじめ定義されたプロローグ、少なくとも１つのエピローグ、および少なくとも１つのマジックオペランド値からなるグループから選択される少なくとも１つのメンバを含む、請求項１４に記載の方法。
【請求項１６】
前記テンプレートシグネチャが、許可された実行可能なコンプレッサを表す、請求項１に記載の方法。
【請求項１７】
前記シグネチャデータが、前記解凍された実行可能ファイルのフォーマットに従ったメモリ割振りのサイズ、前記実行可能ファイル構造およびコードの不変部分について計算された暗号学的ハッシュ関数、ならびに前記解凍された実行可能ファイルがあるメモリページ上のパーミッションからなるグループから選択される少なくとも１つのメンバを含む、請求項１６に記載の方法。
【請求項１８】
前記解凍された実行可能ファイルの前記フォーマットに従って前記メモリ割振りのコンテンツをパースすることによって、前記メモリ割振りのベースでの前記メモリのコンテンツが前記解凍された実行可能ファイルの前記フォーマットに従ったものであることを検証するステップと、フィールド値が論理的であり、前記フォーマットに従っていることをチェックするステップとをさらに含む、請求項１７に記載の方法。
【請求項１９】
悪意のあるコードを含むランタイム生成コードの検出のためのシステムであって、
コードを格納するためのメモリと、
ランタイム生成コードを作成する、許可（authorize）されたソース作成モジュールを表すテンプレートのリポジトリを格納するための記憶デバイスと、
コードを格納するプログラム記憶装置と、
前記格納されたコードを実行するために、前記メモリ、前記記憶デバイス、および前記プログラム記憶装置に結合されたプロセッサと、
を含み、
前記格納されたコードが、
前記メモリにおけるランタイム生成コードの前記作成および前記実行のうちの少なくとも一方のインジケーションを受け取り、前記ランタイム生成コードに関連するシグネチャデータと前記リポジトリのテンプレートシグネチャとの間のマッチを識別し、マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための格納されたコードを含む、
システム。
【請求項２０】
悪意のあるコードを含むランタイム生成コードの検出のためのシステムのプロセッサによって実行されるようにプログラムコードを格納した非一時的コンピュータ可読記憶媒体を含むコンピュータプログラム製品であって、前記プログラムコードが、
コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取るための命令、
前記ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成する、許可（authorize）されたソース作成モジュールを表すテンプレートのセットのテンプレートシグネチャとの間のマッチを識別するための命令、および、
マッチが見つからないとき、前記ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための命令、
を含む、コンピュータプログラム製品。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、そのいくつかの実施形態では、悪意のあるコードの検出に関し、より詳細には、しかし排他的ではなく、ランタイム生成コードにおける悪意のあるコードの検出に関する。
【背景技術】
【０００２】
プロセッサによる実行のために、記憶デバイス（例えば、ハードドライブ）に格納された実行可能ファイルからメモリ（例えば、ランダムアクセスメモリ（ＲＡＭ））にロードされる実行中のプログラムのコードとは対照的に、コードが、ランタイム中に生成されることがある。例えば、ランタイム生成コードは、ジャストインタイム（ＪＩＴ）コンパイラによって生成されることがあり、ＪＩＴコンパイラは、ソースコードまたはバイトコードを機械コードにコンパイルし、これをランタイム中に実行する。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
ランタイム生成コードは、良性であることがあり、または悪意のあるコード、例えば、マルウェアおよびシェルコードによって使用されることがある。悪意のあるコードは、検出を逃れる助けとなるように、ランタイムに生成されることがあり、例えば、セキュリティプログラムがソースファイルを識別しないようにするために、ランタイム生成コードを（例えば、ハードディスクに格納された）ファイルから切り離すこと、コードを他のプロセスに導入すること、およびシグネチャに基づく検出を回避するために、メモリにおいてそれ自体のコードをモーフィングすることを行う。
【課題を解決するための手段】
【０００４】
本発明のいくつかの実施形態の一態様によれば、コンピュータ内で実行されるランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法が提供され、この方法は、コンピュータのプロセッサ上で、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る行為、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成した、許可（authorize）されたソース作成モジュールを表す複数のテンプレートのテンプレートシグネチャとの間のマッチを識別する行為であって、テンプレートが記憶デバイスのリポジトリに格納されている、マッチを識別する行為、および、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする行為、を実行するステップを含む。
【０００５】
任意選択で、テンプレートシグネチャは、許可されたジャストインタイム（ＪＩＴ）コンパイラを表す。
【０００６】
任意選択で、シグネチャデータとテンプレートシグネチャとの間のマッチを識別することは、オペレーティングシステム機能を呼び出すためにランタイム生成コードによって呼び出された第１の実行可能なモジュールと、許可されたＪＩＴコンパイラを表すテンプレートとの間の関連を識別すること、およびランタイム生成コードを作成する第２の実行可能なモジュールと許可されたＪＩＴコンパイラを表すテンプレートとの間の関連を識別することのうちの少なくとも一方を含む。
【０００７】
任意選択で、シグネチャデータは、ランタイム生成コードを格納するメモリにおけるエリアのあらかじめ定義されたサイズを含む。代替または追加として、シグネチャデータは、ランタイム生成コードを格納するメモリ領域の、読取り専用またはアクセス禁止としての指定を含む。代替または追加として、シグネチャデータは、少なくとも１つのコードパターンを含む。
【０００８】
任意選択で、ここにおいて、少なくとも１つのコードパターンは、ランタイム生成コードの少なくとも１つの関数の開始領域における少なくとも１つのあらかじめ定義されたプロローグ、少なくとも１つのエピローグ、および少なくとも１つのマジックオペランド値からなるグループから選択される少なくとも１つのメンバを含む。
【０００９】
代替または追加として、シグネチャデータは、ランタイム生成コードの開始領域および終了領域のうちの少なくとも一方に、ＪＩＴコンパイラに関係するあらかじめ定義された制御構造を含む。
【００１０】
任意選択で、あらかじめ定義された制御構造は、ランタイム生成コードの一部分を各々格納する複数の異なるメモリ領域の各々にあるリンクリスト、ならびにそれぞれのリンクリストの後に位置するそれぞれのメモリ領域のサイズおよびアドレスを定義するフィールドのうちの少なくとも一方を含む。任意選択で、リンクリストは、各メモリ領域のポインタをトラバースすることによって検証され、フィールドは、フィールドの値をオペレーティングシステム値と相関させることによって検証される。
【００１１】
代替または追加として、シグネチャデータは、許可されたＪＩＴコンパイラが制限されるランタイム生成コードに関連するアプリケーションを含む。
【００１２】
任意選択で、テンプレートシグネチャは、許可されたフックエンジンを表す。
【００１３】
任意選択で、シグネチャデータは、ランタイム生成コードがフックエンジンによって作成されるという識別を含み、識別は、フックされたモジュールの外にある外部コードに到達するために、フックされたモジュールのプロローグにおける既存のコードをエミュレートすること、および、フックをインストールした許可されたフックエンジン実行ファイルの前にスタックトレースに現れるランタイム生成コードの位置を特定することによってランタイム生成コードを識別するために、外部コードに関係するスタックトレースを分析することのうちの少なくとも一方によって行われる。
【００１４】
代替または追加として、シグネチャデータは、ランタイム生成コードがあるメモリエリアのあらかじめ定義されたサイズ、少なくとも１つのコードパターン、ランタイム生成コードメモリ領域の開始部分および終了部分のうちの少なくとも一方におけるあらかじめ定義された制御構造、ならびに可変パラメータを除いてランタイム生成コードに逆アセンブルプログラムを適用することによって取得されたアセンブリから計算されたオペコードシグネチャからなるグループから選択される少なくとも１つのメンバを含む。
【００１５】
任意選択で、少なくとも１つのコードパターンは、ランタイム生成コードの少なくとも１つの関数の開始領域における少なくとも１つのあらかじめ定義されたプロローグ、少なくとも１つのエピローグ、および少なくとも１つのマジックオペランド値からなるグループから選択される少なくとも１つのメンバを含む。
【００１６】
任意選択で、テンプレートシグネチャは、許可された実行可能なコンプレッサを表す。
【００１７】
任意選択で、シグネチャデータは、解凍された実行可能ファイルのフォーマットに従ったメモリ割振りのサイズ、実行可能ファイル構造およびコードの不変部分について計算された暗号学的ハッシュ関数、ならびに解凍された実行可能ファイルがあるメモリページ上のパーミッションからなるグループから選択される少なくとも１つのメンバを含む。
【００１８】
任意選択で、方法は、解凍された実行可能ファイルのフォーマットに従ってメモリ割振りのコンテンツをパースすることによって、メモリ割振りのベースでのメモリのコンテンツが、解凍された実行可能ファイルのフォーマットに従ったものであることを検証するステップと、フィールド値が論理的であり、フォーマットに従っていることをチェックするステップとをさらに含む。
【００１９】
本発明のいくつかの実施形態の一態様によれば、悪意のあるコードを含むランタイム生成コードの検出のためのシステムが提供され、システムは、コードを格納するためのメモリと、ランタイム生成コードを作成する、許可（authorize）されたソース作成モジュールを表すテンプレートのリポジトリを格納するための記憶デバイスと、コードを格納するプログラム記憶装置と、格納されたコードを実行するために、メモリ、記憶デバイス、およびプログラム記憶装置に結合されたプロセッサと、を備え、格納されたコードは、メモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取り、ランタイム生成コードに関連するシグネチャデータとリポジトリのテンプレートシグネチャとの間のマッチを識別し、マッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガするための格納されたコードを含む。
【００２０】
本発明のいくつかの実施形態の一態様によれば、悪意のあるコードを含むランタイム生成コードの検出のためのシステムのプロセッサによって実行されるようにプログラムコードを格納した非一時的コンピュータ可読記憶媒体を含むコンピュータプログラム製品が提供され、プログラムコードは、コンピュータのメモリにおけるランタイム生成コードの作成および実行のうちの少なくとも一方のインジケーションを受け取る命令、ランタイム生成コードに関連するシグネチャデータと、ランタイム生成コードを作成する、許可（authorize）されたソース作成モジュールを表すテンプレートのセットのテンプレートシグネチャとの間のマッチを識別する命令、ならびにマッチが見つからないとき、ランタイム生成コード内の悪意のあるコードに対処するためにセキュリティプロセスをトリガする命令、を含む。
【００２１】
特に定義されない限り、本明細書で使用される技術用語および／または科学用語はすべて本発明が属する技術分野の当業者によって一般に理解されるのと同じ意味を有する。本明細書で説明する方法および材料と同様のまたは同等の方法および材料を本発明の実施形態の実施または試験で使用することができるが、例示的な方法および／または材料を以下で説明する。矛盾する場合、定義を含む特許明細書が統制することになる。加えて、材料、方法および例は、例示にすぎず、必ずしも限定することを意図していない。
【００２２】
本発明のいくつかの実施形態が、添付図面を参照しながら、単なる例として、本明細書で説明される。次に図面を詳細に具体的に参照すると、図示の詳細は、例としてのものであり、本発明の実施形態の例示的な議論のためのものであることが強調される。この点に関して、図面とともに行われる説明は、本発明の実施形態をどのように実践できるかを当業者に明らかにする。
【図面の簡単な説明】
【００２３】
【図１】本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法のフローチャートである。
【図２】本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードを検出するシステムの構成要素のブロック図である。
【図３】本発明のいくつかの実施形態による、ランタイム生成コードのシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチを識別する方法のフローチャートである。
【発明を実施するための形態】
【００２４】
本発明は、そのいくつかの実施形態では、悪意のあるコードの検出に関し、より詳細には、しかし排他的ではなく、ランタイム生成コードにおける悪意のあるコードの検出に関する。
【００２５】
本発明のいくつかの実施形態の一態様は、物理メモリ（例えば、ランダムアクセスメモリ（ＲＡＭ））に格納され、プロセッサによって実装可能なランタイム生成コード内の悪意のあるコード（例えば、マルウェア、シェルコード、および他の悪意のあるコード）を検出する、プロセッサによって実行可能なコードに関する。
【００２６】
任意選択で、悪意のあるコードは、排除によって検出される。ランタイム生成コードに関連するシグネチャデータ間のマッチは、ランタイム生成コードを作成する、許可（authorize）された（すなわち、安全なおよび／または許容される）モジュールを表すテンプレートのセットのテンプレートシグネチャを用いて識別される。マッチが見つかるとき、例えば、テンプレートが、許可されたソース作成モジュールを表すホワイトリスト内に現れるとき、ランタイム生成コードは安全であると推定される。マッチが見つからないとき、ランタイム生成コードは、悪意のあるものであると推定されてもよい。任意選択で、マッチがないことに応じて、悪意のあるコードに対処するために、セキュリティプロセスがトリガされ、例えば、悪意のあるコードを除去するためのプログラムがトリガされる。このようにして、本明細書で説明するシステムおよび／または方法は、コンピュータのメモリ内に悪意のあるコードを含むランタイム生成コードを識別する能力を向上させる。
【００２７】
任意選択で、ランタイム生成コード内の悪意のあるコードの存在は、ランタイムコンパイルプロセスの一部としてランタイム生成コードを作成する許可されたジャストインタイム（ＪＩＴ）コンパイラ、例えば、ＪＡＶＡ（登録商標）、ＤＯＴＮＥＴ（商標）、およびＪａｖａＳｃｒｉｐｔ（登録商標）エンジンを表すテンプレートシグネチャとのマッチを識別することによって排除される。このようにして、ランタイム生成コードは、許可されたコンパイラによって生成された、コンパイルされた命令であると推定される。
【００２８】
代替的に、ランタイム生成コード内の悪意のあるコードの存在は、許可されたフックエンジンを表すテンプレートシグネチャとのマッチを識別することによって排除される。そのようなフックエンジンは、プログラム挙動を変えるためのランタイム生成コード、例えば、アンチウィルスおよび他のセキュリティアプリケーションを作成する場合がある。このようにして、ランタイム生成コードは、安全なおよび／または許容されるフックエンジンが作成したものであると推定される。
【００２９】
代替的に、ランタイム生成コード内の悪意のあるコードの存在は、コードを解凍し、解凍したコードを実行する許可された実行可能なコンプレッサ（すなわち、ソフトウェアパッカーと呼ばれることがある）を表すテンプレートシグネチャとのマッチを識別することによって排除される。作成されたおよび／または実行中のランタイム生成コードは、オペレーティングシステムローダを使用する代わりにおよび／または使用せずに、圧縮された実行可能ファイルをメモリ位置にマップするためにソフトウェアパッカーによって使用される場合がある。
【００３０】
任意選択で、テンプレートとのマッチングに使用されるランタイム生成コードに関連するシグネチャデータは、例えば、ランタイム生成コードを格納するためのあらかじめ定義されたメモリサイズ、ランタイム生成コード内のあらかじめ定義されたコードパターン（例えば、固有のプロローグ、エピローグ、およびマジックオペランド値）、ならびにランタイム生成コードを格納するメモリ領域（ページ）に関連する割り当てられたパーミッションのうちの１つまたは複数を含んでもよい。
【００３１】
シグネチャデータとテンプレートとの間のマッチは、完全（すなわち、１００％マッチ）、または部分的（すなわち、１００％未満の一致）、例えば相関値であってもよいことに留意されたい。完全に満たない相関および／または部分的マッチは、例えば、確率しきい値に従って使用されてもよい。例えば、確率値７０％、しきい値５０％超に関連するテンプレートとの部分的マッチが、セキュリティプロセスをトリガすることがある。
【００３２】
本発明の少なくとも１つの実施形態を詳細に説明する前に、本発明は、その適用において、以下の説明に記載され、および／または図面および／または実施例に示される構成要素および／または方法の構築および配列の詳細に必ずしも限定されないことを理解されたい。本発明は、他の実施形態が可能であり、または様々な方法で実践もしくは実行することが可能である。
【００３３】
本発明は、システム、方法、および／またはコンピュータプログラム製品とすることができる。コンピュータプログラム製品は、プロセッサに本発明の態様を実行させるためのコンピュータ可読プログラム命令を有する１つのコンピュータ可読記憶媒体（または複数の媒体）を含むことができる。
【００３４】
コンピュータ可読記憶媒体は、命令実行デバイスによる使用のための命令を保持し格納することができる有形デバイスとすることができる。コンピュータ可読記憶媒体は、例えば、限定はしないが、電子記憶デバイス、磁気記憶デバイス、光学記憶デバイス、磁気記憶デバイス、半導体記憶デバイス、または前述のものの任意の好適な組合せとすることができる。コンピュータ可読記憶媒体のより具体的な例の包括的でないリストは、以下のものを含む：ポータブルコンピュータディスケット、ハードディスク、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭまたはフラッシュメモリ）、スタティックランダムアクセスメモリ（ＳＲＡＭ）、ポータブルコンパクトディスク読取り専用メモリ（ＣＤ−ＲＯＭ）、デジタル多用途ディスク（ＤＶＤ）、メモリスティック、フロッピーディスク、および前述のものの任意の好適な組合せ。本明細書で使用するコンピュータ可読記憶媒体は、電波または他の自由に伝播する電磁波、導波路または他の伝送媒体を通って伝搬する電磁波（例えば、光ファイバケーブルを通過する光パルス）、またはワイヤを通して伝送される電気信号などの一時的な信号自体であると解釈されるべきでない。
【００３５】
本明細書で説明するコンピュータ可読プログラム命令は、コンピュータ可読記憶媒体からそれぞれのコンピューティング／処理デバイスに、またはネットワーク、例えば、インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、および／またはワイヤレスネットワークを介して外部コンピュータもしくは外部記憶デバイスにダウンロードすることができる。ネットワークは、銅伝送ケーブル、光伝送ファイバ、ワイヤレス伝送、ルータ、ファイアウォール、スイッチ、ゲートウェイコンピュータ、および／またはエッジサーバを含むことができる。各コンピューティング／処理デバイスのネットワークアダプタカードまたはネットワークインターフェースは、ネットワークからコンピュータ可読プログラム命令を受け取り、それぞれのコンピューティング／処理デバイス内のコンピュータ可読記憶媒体に格納するためにコンピュータ可読プログラム命令を転送する。
【００３６】
本発明の動作を実行するためのコンピュータ可読プログラム命令は、アセンブラ命令、命令セットアーキテクチャ（ＩＳＡ）命令、機械語命令、機械依存命令、マイクロコード、ファームウェア命令、状態設定データ、またはＳｍａｌｌｔａｌｋ、Ｃ＋＋などのようなオブジェクト指向プログラミング言語および「Ｃ」プログラミング言語もしくは類似したプログラミング言語などの従来の手続き型プログラミング言語を含む１つまたは複数のプログラミング言語の任意の組合せで書かれたソースコードもしくはオブジェクトコードのいずれかとすることができる。コンピュータ可読プログラム命令は、ユーザコンピュータで全面的に、ユーザコンピュータで部分的に、スタンドアロンソフトウェアパッケージとして、ユーザコンピュータで部分的におよびリモートコンピュータで部分的に、またはリモートコンピュータもしくはサーバで全面的に実行することができる。後者のシナリオでは、リモートコンピュータは、ローカルエリアネットワーク（ＬＡＮ）またはワイドエリアネットワーク（ＷＡＮ）を含む任意のタイプのネットワークによってユーザコンピュータに接続されてもよく、または外部コンピュータへの接続がなされてもよい（例えばインターネットサービスプロバイダーを使用するインターネットを通して）。いくつかの実施形態では、例えば、プログラマブル論理回路、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、またはプログラマブル論理アレイ（ＰＬＡ）を含む電子回路は、本発明の態様を実行するために、コンピュータ可読プログラム命令の状態情報を利用することによってコンピュータ可読プログラム命令を実行して、電子回路を個人専用にすることができる。
【００３７】
本発明の態様は、本発明の実施形態による方法、装置（システム）、およびコンピュータプログラム製品のフローチャート図および／またはブロック図を参照して本明細書で説明される。フローチャート図および／またはブロック図の各ブロック、およびフローチャート図および／またはブロック図のブロックの組合せは、コンピュータ可読プログラム命令によって実装できることを理解されよう。
【００３８】
これらのコンピュータ可読プログラム命令は、汎用コンピュータ、専用コンピュータ、または他のプログラマブルデータ処理装置のプロセッサに提供されて、コンピュータまたは他のプログラマブルデータ処理装置のプロセッサにより実行される命令が、フローチャートおよび／またはブロック図の１つまたは複数のブロックに明記される機能／行為を実施するための手段を作成するように、機械を生成してもよい。これらのコンピュータ可読プログラム命令は、コンピュータ、プログラマブルデータ処理装置、および／または他のデバイスに、特定の方法で機能するように指示することができるコンピュータ可読記憶媒体に格納されてもよく、命令を格納したコンピュータ可読記憶媒体が、フローチャートおよび／またはブロック図の１つもしくは複数のブロックに明記される機能／行為の態様を実装する命令を組み込んだ製品を含むようにする。
【００３９】
コンピュータ可読プログラム命令は、コンピュータ、他のプログラマブルデータ処理装置、または他のデバイスにロードされて、一連の動作ステップをコンピュータ、他のプログラマブル装置、または他のデバイス上で実行させ、コンピュータまたは他のプログラマブル装置、または他のデバイス上で実行される命令が、フローチャートおよび／またはブロック図の１つもしくは複数のブロックに明記される機能／行為を実施するように、コンピュータ実装プロセスを生成することもできる。
【００４０】
図のフローチャートおよびブロック図は、本発明の様々な実施形態によるシステム、方法、およびコンピュータプログラム製品のあり得る実施態様のアーキテクチャ、機能、および動作を示す。この点に関して、フローチャートまたはブロック図の各ブロックは、特定の論理機能を実装するための１つまたは複数の実行可能命令を含む命令のモジュール、セグメント、または一部分を表すことができる。いくつかの代替実施態様では、ブロックに記された機能は、図に記された順序から外れて行われることがある。例えば、連続して示された２つのブロックは、関係する機能に応じて、実際には実質的に同時に実行されることがあり、またはブロックは時には逆の順序で実行されることがある。ブロック図および／またはフローチャート図の各ブロック、およびブロック図および／またはフローチャート図のブロックの組合せは、特定の機能もしくは動作を実行するかまたは専用ハードウェアとコンピュータ命令との組合せを実行する専用ハードウェアベースシステムによって実装されてもよいことにも留意されたい。
【００４１】
次に図１を参照すると、図１は、本発明のいくつかの実施形態による、ランタイム生成コード内の悪意のあるコードの検出のためのコンピュータ実装方法のフローチャートである。また図２を参照すると、図２は、本発明のいくつかの実施形態による、ランタイム生成コードを悪意のあるコードとして識別するために、および／または悪意のあるコードを含むランタイム生成コードを排除するために、ランタイム生成コードに関連するシグネチャデータと、テンプレートシグネチャとのマッチを自動的に識別するシステムの構成要素のブロック図である。図１の方法は、図２のシステムによって実装されてもよい。
【００４２】
本明細書で説明するシステムおよび／または方法は、コンピュータのメモリ上で実行中のランタイム生成コード内に含まれる悪意のあるコードの識別の技術的問題に関する。本明細書で説明するシステムおよび／または方法は、コンピュータのメモリ上に格納され、コンピュータのプロセッサによって実行されるランタイム生成コード内に含まれる悪意のあるコードの識別のためのソフトウェア技術に関する。悪意のあるコードの識別は、悪意のあるコードを除去および／または隔離するためにプロセッサによって実行可能なプロセスをトリガしてもよい。したがって、本明細書で説明するシステムおよび／または方法は、コンピュータ技術と密接に結び付いている。本明細書で説明するシステムおよび／または方法は、悪意のあるコードを識別し、コードのブロッキング、除去、および／または隔離を可能にすること、（例えば、悪意のあるコードが既存の処理リソースおよび／またはメモリリソースを利用することに起因する）コンピュータへのダメージを軽減および／または回避することによって、コンピュータの性能を向上させることができる（例えば、プロセッサおよび／またはメモリ利用の改善）。
【００４３】
システム２００は、１つまたは複数のメモリ構造２０２、例えば、ランダムアクセスメモリ（ＲＡＭ）、１次記憶装置、メインメモリ、内部メモリ、仮想メモリ（例えば、２次記憶装置にアクセスする）、および／または他の物理メモリ構造（互いに抽象的に連結される場合がある）を含む。
【００４４】
メモリ２０２は、メモリ２０２と通信している１つまたは複数のプロセッサ２０４に直接アクセス可能であり、プロセッサ２０４は、（例えば、マシンコードとして）メモリ２０２内に格納された命令を実行する。プロセッサ２０４は、例えば、中央処理ユニット（ＣＰＵ）、グラフィック処理ユニット（ＧＰＵ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、デジタル信号プロセッサ（ＤＳＰ）、および特定用途向け集積回路（ＡＳＩＣ）を含む場合がある。プロセッサ２０４（ホモジニアスまたはヘテロジニアス）は、クラスタとしておよび／または１つもしくは複数のマルチコア処理ユニットとして、並列処理用に配置されてもよく、または互いに独立していてもよい。
【００４５】
メモリ２０２およびプロセッサ２０４は、１つまたは複数のコンピューティングユニット２０６、例えば、パーソナルコンピュータ、モバイルデバイス（例えば、スマートフォン、タブレット）、ウェアラブルデバイス（例えば、コンピューティング眼鏡、コンピューティング腕時計）、および／またはサーバとして実装されてもよい。
【００４６】
コンピューティングユニット２０６は、プロセッサ２０４によって実行可能なコードを格納するプログラム記憶装置２０８を含むおよび／またはこれに関連付けられてもよい。プログラム記憶装置２０８は、メモリ２０２によって実装されてもよく、および／またはプロセッサ２０４には直接利用できない（すなわち、実行するためにはメモリ２０２にロードする必要がある）命令を格納する２次記憶装置２１０、例えば、記憶デバイス、例えば、不揮発性メモリ、磁気メディア、半導体メモリデバイス、ハードドライブ、リムーバブルストレージ、および光メディア（例えば、ＤＶＤ、ＣＤ−ＲＯＭ）によって実装されてもよい。図１の方法を実施する命令は、プログラム記憶装置２０８にコードとして格納されてもよい。
【００４７】
コンピューティングユニット２０６は、外部デバイスおよび／または構成要素と、例えば、ネットワークと、サーバと、別のコンピュータと、記憶デバイス、ならびに／または他のデバイスおよび／もしくは構成要素と、通信するための１つまたは複数のデータ通信インターフェース２１２を含んでもよい。例えば、コンピューティングユニット２０６は、（本明細書で説明するように）許可されたランタイム生成コードの検出に使用される新しいシグネチャ、および／または更新された許可されたソース作成モジュールのホワイトリストをダウンロードするために、（例えば、ネットワークを介して）リモートサーバ２１４にアクセスしてもよい。
【００４８】
コンピューティングユニット２０６は、物理ユーザインターフェース２１６、例えば、ディスプレイ、タッチスクリーン、キーボード、マウス、および音声作動インターフェースのうちの１つまたは複数を含んでもよい。検出された悪意のあるコードのインジケーションは、画面（すなわち、インターフェース２１’６）を使用してユーザに表示されてもよい。ユーザは、検出された悪意のあるコードにさらなるアクションを行うこと、例えば、悪意のあるコード除去プロセスを実行することを選択してもよい。
【００４９】
図１の方法のブロックは、処理ユニット２０４によって実行可能な、プログラム記憶装置２０８に格納されたコードにおける命令として表されてもよい。
【００５０】
１０２において、コンピューティングデバイス２０６のメモリ２０２におけるランタイム生成コードの作成および／または実行のインジケーション（例えば、信号、内部メッセージ、ネットワークメッセージ）が、処理ユニット２０４によって受け取られる。
【００５１】
インジケーションは、ランタイム生成コードの作成および／または実行を監視および／または識別するコード（例えば、監視モジュール）から受け取られてもよい。監視は、プロセッサ２０４によって実行可能な、プログラム記憶装置２０８（例えば、監視モジュール２０８Ａ）に格納されたコードによって行われてもよい。
【００５２】
以下の例示的な方法は、ランタイム生成コードの作成および／または実行を検出するために使用されてもよい。説明する方法は、必ずしも限定的であることを意図されず、他の方法が使用されてもよい。例えば、ランタイム生成コードは、スタックトレーシングプロセスの一部として検出されてもよい。例えば、プロセスが新しい接続を作成しようとするとき、監視モジュール２０８Ａがスタックをウォークし、接続確立に関連するすべてのコードを識別する。ファイルに関連しないコードが検出されるときはいつでも、悪意のあるランタイム生成コードのチェックが行われる。別の例では、ランタイム生成コードの作成は、データをコードに変えるまたは新しい実行可能なメモリを作成するオペレーティングシステム機能を監視することによって検出される。ランタイム生成コードの実行は、プロセッサ固有の機能、例えば、ブランチトレーシングを使用して検出されてもよい。
【００５３】
良性モジュール（すなわち、許可された、安全なおよび／もしくは許容されるプロセス）、または悪意のあるモジュールである場合があるソース作成モジュール２１８が、ランタイム生成コード２２０を生成する。作成されたランタイム生成コードは、良性（すなわち、許可された、安全なおよび／もしくは許容されるプロセス）である場合があり、または悪意のあるコード２２２（例えば、悪意のある行為、例えば、コンピュータにダメージを与えること、コンピュータの性能を低下させること、情報を盗むこと、および／もしくはリモートユーザがコンピュータを制御できるようにすることを行うように設計されたコード）を含む場合がある。
【００５４】
本明細書で使用するソース作成モジュールという用語は、実行可能ファイルに関連するコード、例えば、アプリケーションによって呼び出されたオペレーティングシステムファイル、および／またはダイナミックリンクライブラリ（ＤＬＬ）ファイル、および／または．ＥＸＥファイルを意味する。コードは、実行可能ファイルに関連するアプリケーションの一部であってもよい。
【００５５】
悪意のあるコードは、良性プロセスの情況において生成される場合があることに留意されたい。本明細書で説明するシステムおよび／または方法は、良性ランタイム生成コードを示すテンプレートシグネチャを排除することによって、良性プロセスの情況において悪意のあるコードの生成および／または実行を検出することがある。例えば、良性ランタイム生成コードを示すテンプレートシグネチャとのマッチが見つからないとき。
【００５６】
現在、メモリ２０２にある（記憶装置２１０からロードされていてもよい）ソース作成モジュール２１８は、ソース作成モジュールの実行中に、動的にランタイム生成コードを作成する。ランタイム生成コードは、プロセッサ２０４による実行に備えて、任意選択では機械語で、メモリ２０２内に作成され、格納されてもよい。ランタイム生成コードは、仮想マシンによる実行のために仮想メモリ内に作成され、格納されてもよい。
【００５７】
１０４において、ランタイム生成コード２１０に関連するシグネチャデータと、任意選択で記憶装置２１０に格納されたテンプレートシグネチャリポジトリ２１０Ｂからの、テンプレートシグネチャとの間に、マッチが識別される。テンプレートシグネチャは、ランタイム生成コードを作成した許可されたソース作成モジュールを表す。許可されたソース作成モジュールのリストが、記憶装置２１０に格納されたリポジトリ２１０Ａに格納されてもよい。識別は、プロセッサ２０４によって実行可能な、プログラム記憶装置２０８（例えば、分析モジュール２０８Ｂ）に格納されたコードによって行われてもよい。
【００５８】
テンプレートは、ランタイム生成コード用のホワイトリストとして使用されてもよい。ホワイトリストのメンバが識別されたとき、ランタイム生成コードは、実行すること（または実行を続けること）を可能にされてもよい。ホワイトリストのメンバが識別されていないとき、例えば、セキュリティプログラムが悪意のあるコードの存在についてランタイム生成コードを評価するまで、ランタイム生成コードは、実行をブロックまたは回避されてもよい。テンプレートおよび／または許可されたソース作成モジュールは、例えば、リモートサーバ２１４にアクセスすることによって取得および／または更新されてもよい。
【００５９】
次に図３を参照すると、図３は、本発明のいくつかの実施形態による、ランタイム生成コードのシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチを識別する方法のフローチャートである。方法は、許可されたＪＩＴコンパイラ、フックエンジン、および／またはランタイム生成コードを作成した実行可能なコンプレッサを表すテンプレートとのマッチを見つけようと試みる。方法は、ランタイム生成コード自体、ランタイム生成コードに関係するデータ、ランタイム生成コードを格納するメモリに関係するデータ、および／または他のパラメータに基づいて、シグネチャデータを収集し、シグネチャデータをテンプレートにマッチングさせようと試みる。テンプレートは、（ソース作成モジュールの一般的なカテゴリーの１つのメンバであってもよい）あるソース作成モジュールを表してもよく、かつ／またはテンプレートは、ソース作成モジュールの一般的なカテゴリーを表してもよい。悪意のあるコードは、マッチが見つからないことによって識別されてもよい。
【００６０】
３０２において、シグネチャデータと、ランタイム生成コードを作成した許可されたジャストインタイム（ＪＩＴ）コンパイラとの間でマッチが識別される。ＪＩＴコンパイラは、プログラムの実行中に（すなわちランタイム中に）動的に（例えば、ソースコード、またはバイトコードの）コンパイルを行って、プロセッサによって実行されるランタイム生成コードを（例えば、機械可読フォーマットで）作成する。
【００６１】
シグネチャデータは、メモリ２０２にロードされたＪＩＴコンパイラの１つまたは複数の実行可能なモジュールの存在の識別を含んでもよい。実行可能なモジュールは、ランタイム生成コードを生成することがある。実行可能なモジュールおよび／またはＪＩＴコンパイラは、ランタイム生成コードがオペレーティングシステムと直接対話しないときなどに、オペレーティングシステム機能を呼び出すために、ランタイム生成コードによって呼び出されることがある。実行可能なモジュールは、ランタイム生成コードを呼び出すことがある。実行可能なモジュールの識別が、関係するＪＩＴコンパイラを表すテンプレートにマッチングさせるためのシグネチャデータとして使用されてもよい。ＪＩＴコンパイラが実行可能なモジュールを含む（例えば、ＪＩＴコンパイラおよび実行可能なモジュールが同じである）とき、実行可能なモジュールの識別は、ＪＩＴコンパイラを表すテンプレートとマッチングしてもよい。実行可能なモジュールは、例えば、関係するファイルがストレージ２１０に存在することを検証することによって識別されてもよく、例えば、ＪＡＶＡ（登録商標）ＪＩＴコンパイラとの関連を識別するためのシグネチャとして、ファイルＪＶＭ．ｄｌｌを検証することが使用されてもよい。
【００６２】
シグネチャデータは、ランタイム生成コードを格納するために割り振られたメモリ２０２の領域を管理するために、それぞれのＪＩＴコンパイラによって使用されるあらかじめ定義されたメモリ構造を含んでもよい。異なるＪＩＴコンパイラは、あらかじめ定義された異なるメモリ構造を有してもよい。あらかじめ定義されたメモリ構造の識別が、関係するＪＩＴコンパイラを表すテンプレートシグネチャにマッチングさせるためのシグネチャデータとして使用されてもよい。
【００６３】
シグネチャデータは、ランタイム生成コードを格納するメモリ２０２におけるエリアのあらかじめ定義されたサイズを含んでもよい。異なるＪＩＴコンパイラは、あらかじめ定義された異なるサイズを使用してもよく、例えば、それぞれのチャンクサイズを使用することがわかっているＪＩＴコンパイラのシグネチャとして、一定のコードチャンクサイズが使用されてもよい。例えば、ｄｏｔｎｅｔ（商標）ＪＩＴコンパイラのいくつかのバージョンは、サイズ０×１００００のコードチャンクを使用する。したがって、ランタイム生成コードがサイズ０×１００００のチャンクで格納されると識別することが、ｄｏｔｎｅｔ（商標）ＪＩＴコンパイラを表すテンプレートシグネチャとマッチングするためのシグネチャデータとして使用されてもよい。
【００６４】
シグネチャデータは、それぞれのＪＩＴコンパイラによるランタイム生成コードの生成のメカニズムに関係してもよい。異なるＪＩＴコンパイラは、ランタイム生成コードを生成するためのあらかじめ定義された異なるメカニズムを有してもよい。ランタイム生成コードの生成のメカニズムの識別が、関係するＪＩＴコンパイラを表すテンプレートシグネチャとマッチングさせるためのシグネチャデータとして使用されてもよい。
【００６５】
シグネチャデータは、読取り専用またはアクセス禁止として指定された、ランタイム生成コードを格納する１つまたは複数のメモリ領域に関係してもよい。異なるＪＩＴコンパイラが、例えば、新しく作成されたコードの変更を防止するためのセキュリティ対策として、読取り専用またはアクセス禁止としてランタイム生成コードを格納するメモリ領域を指定してもよい。例えば、異なるＪＩＴコンパイラが同じ指定を使用するとき、指定は、許可されたＪＩＴコンパイラの生成カテゴリーを表すテンプレートシグネチャとマッチングするためのシグネチャデータとして使用されてもよい。例えば、ＪＩＴコンパイラは、読取り専用としてメモリセグメント（例えば、メモリページ）の保護を設定することがあるが、悪意のあるコードは、それらのそれぞれのランタイム生成コードを書込み可能として指定する可能性があることに留意されたい。例えば、いくつかのＪＩＴコンパイラがいくつかの指定を使用するとき、指定は、あるＪＩＴコンパイラを表すテンプレートとマッチングするためのシグネチャデータとして使用されてもよい。例えば、Ｖ８  ＪＩＴコンパイラは、ランタイム生成コードのいくつかのページの指定をアクセス禁止に設定してもよい。アクセス禁止の指定は、攻撃者（例えば、人間またはソフトウェア）がコードを悪用するのをより困難にすることができる。
【００６６】
シグネチャデータは、１つまたは複数のコードパターン、例えば、ランタイム生成コードの１つもしくは複数の関数の開始領域でのあらかじめ定義されたプロローグ、エピローグ、および／またはマジックオペランド値に関係してもよい。あらかじめ定義されたプロローグは、ランタイム生成コードを作成した許可されたＪＩＴコンパイラを表すテンプレートシグネチャとマッチングさせるためのシグネチャデータとして使用されてもよい。例えば、マジック値をスタックにプッシュすることによって始まるプロローグは、ある許可されたＪＩＴコンパイラに関連する場合がある。
【００６７】
シグネチャデータは、ＪＩＴコンパイラに関係する１つまたは複数のあらかじめ定義された制御構造に関係してもよい。コード構造は、ランタイム生成コードを格納するメモリ部分の開始領域および／または終了領域に位置してもよい。あらかじめ定義された制御構造は、ランタイム生成コードの一部分を格納する異なるメモリ領域の各々にリンクリストを含んでもよい。あらかじめ定義された制御構造は、それぞれのリンクリストの後に位置するそれぞれのメモリ領域のメモリサイズおよび／またはメモリアドレスを定義するフィールドを含んでもよい。例えば、Ｖ８（商標）ＪＩＴコンパイラは、各それぞれのコード領域のベースに位置するリンクリストを使用してランタイム生成コードのコード領域を連結する。Ｖ８（商標）ＪＩＴコンパイラのリンクリストは、以下のフィールドが後にくる：それぞれのメモリ領域のサイズ、メモリ領域の制御フラグ、メモリ領域が始まるアドレス、およびメモリ領域が終わるアドレス。リンクリスト構造および／または関係するフィールドの１つもしくは複数を識別することによって、シグネチャデータは、Ｖ８（商標）ＪＩＴコンパイラを表すテンプレートシグネチャとマッチングすることができる。
【００６８】
制御構造がそれぞれのコード領域に存在するという検証は、検出された値をあらかじめ定義されたオペレーティングシステム値と相関させることによって行われてもよい。例えば、コード領域のサイズを、制御構造に基づいて検出し、オペレーティングシステムによって指定されたあらかじめ定義されたサイズと相関させてもよい。別の例では、各領域の開始アドレスおよび終了アドレスを（例えば、制御構造から）検出し、オペレーティングシステム構成と相関させてもよい。マッチが、制御構造を検証する。リンクリストは、領域間でポインタを使用して、１つのメモリ領域から別のメモリ領域へトラバースすることによって検証されてもよい。各ポインタをたどって、ポインタが実際に有効なコード領域をポイントすること、およびコードの以前のポインタが実際に元のコード領域をポイントすることを検証してもよい。
【００６９】
制御構造を検証できないことが、ランタイム生成コードが悪意のあるコードを含む可能性があり、かつ／または悪意のあるソース作成モジュールによって作成されたことを示唆してもよい。
【００７０】
シグネチャデータは、ランタイム生成コードに関連することがわかっているアプリケーションまたはプロセスに関係してもよい。許可されたＪＩＴコンパイラは、そのアプリケーションまたはプロセスに限定されることがわかっていることがある。例えば、Ｆｉｒｅｆｏｘ（商標）ブラウザをランタイム生成コードに関連すると識別することが、ＪａｅｇｅｒＭｏｎｋｅｙ  ＪＩＴコンパイラがＦｉｒｅｆｏｘ（商標）ブラウザに限定されることに基づいて、ＪａｅｇｅｒＭｏｎｋｅｙ  ＪＩＴコンパイラをソース作成モジュールとして表すテンプレートシグネチャにマッチングさせるためのシグネチャデータとして、使用されてもよい。
【００７１】
代替的に、３０４において、シグネチャデータと、ランタイム生成コードを作成した許可されたフックエンジンを表すテンプレートシグネチャとの間でマッチが識別される。許可されたフックエンジンは、例えば、既存のコードをパッチして、現在のコードの実行をフックエンジンのコードへ、またはフックエンジンによって作成されたランタイム生成コードへリダイレクトするために、ランタイム生成コードを作成することがある。
【００７２】
シグネチャデータは、ランタイム生成コードがフックエンジンによって作成されるという識別情報を含んでもよい。識別は、フックされたモジュールのプロローグにおける既存のコードをエミュレートして、フックがつながる場所を決定することによって行われてもよく、例えば、コードは、サンドボックス内で実行される仮想マシンによって、および／またはコードエミュレータによって、エミュレートされてもよい。フックされたモジュールの外にあるコードに到達するまで、コードは、エミュレートされ、監視される。外部コードは、フックエンジンによって作成されたランタイム生成コード、またはフックをインストールした実行ファイル（例えば、フックエンジン）であることがある。外部コードがランタイム生成コードであるというケースは、例えば、外部コードがランタイム生成コードのアドレス空間内にあるかどうかを検証することによって決定されてもよい。外部コードが実行ファイルであるとき、実行ファイルとランタイム生成コードとの関連は、スタックトレースを分析することによって検証されてもよい。フックされた関数および／または外部コードに関係するスタックトレースは、スタックトレースにおけるランタイム生成コードのリファレンスを識別するために、フックをインストールした許可されたフッキングエンジン実行ファイルの前の、スタックトレースにおけるランタイム生成コードへのリファレンスの位置を特定することによって、分析されてもよい。
【００７３】
ランタイム生成コードがフックエンジンに関連する（すなわち、フックエンジンによって作成された）ことがわかっているとき、シグネチャデータは、許可されたフックエンジンを表すテンプレートシグネチャにマッチングされる。マッチは、ランタイム生成コードを作成したフックエンジンを必ずしも識別せずに、例えば、許可されたエンジンによって共有される１つまたは複数のプロパティに基づいて、ランタイム生成コードが許可されたクラスのフックエンジンによって作成されたかどうかを決定することがある。マッチは、例えば、あるフックエンジンに固有のプロパティに基づいて、コードを作成したある許可されたフックエンジンを決定することがある。
【００７４】
任意選択で、シグネチャデータは、許可されたフッキングエンジン、または許可されたエンジンのクラスを示す。例えば、シグネチャデータは、シグネチャリポジトリ２１０Ｂに格納された、許可されたフックエンジン（またはエンジンのクラス）のテンプレートシグネチャとマッチングされてもよい。シグネチャリポジトリ２１０Ｂのテンプレートシグネチャは、例えば、ネットワークを介してサーバ２１４からダウンロードすることによって、自動的におよび／または手動で検索されてもよい。サーバ２１４は、シグネチャのアップデートを提供してもよい。
【００７５】
例示的なシグネチャデータは、以下のうちの１つまたは複数を含んでもよい：
【００７６】
＊  ランタイム生成コードがあるメモリエリアのあらかじめ定義されたサイズ。（クラスとしてまたは個別に）許可されたエンジンが、あらかじめ定義されたコードチャンクサイズ、例えば、サイズ０×１０００で、コードを書き込んでもよい。
【００７７】
＊  ランタイム生成コードの１つまたは複数の関数の始めの１つまたは複数のあらかじめ定義されたプロローグ。例えば、あるアンチウィルスフックエンジンが、アンチウィルスフックエンジンによって作成されたランタイム生成コードの各チャンクの最初に、オペコードｐｕｓｈ  ＭａｇｉｃＶａｌｕｅを使用する場合がある。
【００７８】
＊  ランタイム生成コードを格納するメモリ領域の開始領域および／または終了領域に位置する１つまたは複数のあらかじめ定義された制御構造。例えば、ランタイム生成コードの一部分を各々格納する異なるメモリ領域を連結するリンクリスト。
【００７９】
＊  逆アセンブラプログラムを使用して生成されたオペコードシグネチャ。逆アセンブラは、可変パラメータ、例えばアドレスを除いて、ランタイム生成コードのアセンブリに適用されてもよい。逆アセンブラは、可変パラメータがランタイム生成コードから除去された後に適用されてもよい。
【００８０】
３０６において、シグネチャデータは、ランタイム生成コードを作成した許可された実行可能なコンプレッサを表すテンプレートシグネチャとマッチングされる。実行可能ファイルは、解凍コードとともに単一の実行可能ファイルに圧縮されてもよい。圧縮された実行可能ファイルが実行されるとき、解凍コードはデータを解凍し、元の（すなわち、圧縮前の）プログラムを復元する。デコンプレッサは、解凍したコードをメモリに直接マップすることによって、解凍したコードをメモリに直接書き込んでもよい。
【００８１】
ランタイム生成コードを格納するメモリ領域のコンテンツは、実行可能なコンプレッサに関連するあらかじめ定義されたオペレーティングシステムフォーマットに従って検証される。各実行可能ファイルは、関連するあらかじめ定義されたオペレーティングシステムフォーマットを有し、オペレーティングシステムフォーマットは、圧縮されたファイルがメモリにマップされるとき、メモリに存在する。解凍したプログラムを格納するメモリ割振りのベースでのメモリのコンテンツは、解凍した実行可能ファイルのフォーマットに従って検証される。検証は、解凍した実行可能ファイルのフォーマットに従って、メモリ割振りのコンテンツをパースすることによって行われてもよい。フィールド値は、論理的であり、フォーマットに準拠しているとチェックされてもよい。
【００８２】
例示的なシグネチャデータは、以下のうちの１つまたは複数を含んでもよい：
【００８３】
＊  実行可能なコンプレッサに関連するあらかじめ定義されたフォーマットに従って、ランタイム生成コード（すなわち、解凍されたプログラム）を格納するために割り振られたメモリのあらかじめ定義されたサイズ。（クラスとしてまたは個別に）許可されたコンプレッサが、あらかじめ定義されたコードチャンクサイズでコードを書き込んでもよい。
【００８４】
＊  実行可能ファイル構造および／またはコードの不変部分について計算されたハッシュ関数（任意選択で、暗号学的ハッシュ関数）。ハッシュ関数によって出力された値は、１つまたは複数の許可された実行可能なコンプレッサにマップされてもよい。
【００８５】
＊  解凍されたランタイム実行可能コードがメモリに格納されているメモリページのパーミッション指定。パーミッション指定は、許可された実行可能なコンプレッサのクラスを示してもよい。例えば、作成されたランタイム生成コードは、読取り専用として指定されてもよい。
【００８６】
１０６において、シグネチャデータとテンプレートシグネチャとの間でマッチが見つからないとき、ランタイム生成コードに悪意のあるコードが存在するというインジケーションが、生成されてもよい。インジケーションは、例えば、分析モジュールからのセキュリティプログラムへの内部メッセージ通信であって、悪意のあるコードについてランタイム生成コードを調べるためにセキュリティプログラムの起動をトリガしてもよい。インジケーションは、例えば、ユーザに対して画面上に表示されるメッセージであって、悪意のある可能性があるコードが見つかったことをユーザに通知してもよい。
【００８７】
代替または追加として、ランタイム生成コードが許可されたソース作成モジュールに関連しているというインジケーションは、（例えば、一般的な、またはあるプロセスにおいて）許可されたソース作成モジュールを表すテンプレートシグネチャとのマッチが見つかるとき生成される。インジケーションは、例えば、ランタイム生成コードが許可されたソース作成モジュールに関連していると分析されたとき、ランタイム生成コードが実行される（または実行を続ける、または実行のブロックを回避する）ことが可能となるように、１つのプロセスから別のプロセスに通信される内部メッセージであってもよい。
【００８８】
１０８において、ランタイム生成コードに悪意のある（例えば、可能性がある）コードが存在するというインジケーションが生成されるとき、コードによって自動的にまたはユーザによって手動で（例えば、悪意のあるコードの可能性を示すメッセージを画面上に提示し、セキュリティプロセスを起動するかどうかをユーザに尋ねて）、１つまたは複数のセキュリティ対策がトリガされてもよい。
【００８９】
セキュリティ対策（例えば、セキュリティアプリケーション、例えば、プログラム記憶装置２０８および／または別の記憶デバイスに格納されたセキュリティモジュール２０８Ｃによって実行可能）の例には、ランタイム生成コードのさらなる実行をブロックすること、ランタイム生成コードおよび／もしくは関連するソース作成モジュールの削除、悪意のあるコードを除去するための悪意のあるコード対策セキュリティプログラムの起動、ランタイム生成コードおよび／もしくは関連するソース作成モジュールの隔離、ならびに／またはコードがメモリの他のエリアにアクセスしないようにすることが含まれる。
【００９０】
ブロック１０６の代替として、１１０において、ランタイム生成コードに関連するシグネチャデータと、許可されたソース作成モジュールを表すテンプレートシグネチャとの間のマッチが見つかるとき、良性コードが存在するというインジケーションが作成されてもよい。本明細書で説明するように、マッチを見つけることは、ランタイム生成コードが許可されたソース作成モジュールに関連していることを示す。例えば、制御モジュールが、ランタイム生成コードは良性コードを表すというインジケーションを受け取るとき、ランタイム生成コードは、続行することを許可されてもよい。ランタイム生成コードの実行を一時停止していることがある、または作成されたインジケーションを監視する制御モジュールは、ランタイム生成コードの実行を再開してもよい。代替的には、インジケーションが作成されず、ランタイム生成コードが実行されるようにする。
【００９１】
本発明の様々な実施形態の説明を、例示の目的で提示したが、網羅的であること、または開示する実施形態に限定することを意図していない。説明した実施形態の範囲および趣旨を逸脱することなく、多くの変更形態および変形形態が当業者には明らかであろう。本明細書で使用する用語は、実施形態の原理、実際の応用、または市場で見つけられる技術に優る技術改善を最も良く説明するように、または、当業者が本明細書に開示する実施形態を理解できるように選択した。
【００９２】
本出願から満期となる特許の存続期間の間に、多くの関連するソース作成モジュール、ランタイム生成コード、および悪意のあるコードが開発されることが予想され、ソース作成モジュール、ランタイム生成コード、および悪意のあるコードという用語の範囲は、そのような新しい技術を事前にすべて含むものとする。
【００９３】
本明細書で使用する「約」という用語は±１０％を指す。
【００９４】
「備える」、「備えている」、「含む」、「含んでいる」、「有している」、という用語およびそれらの活用形は、「限定はしないが、含む」を意味する。この用語は、「からなる」および「から基本的になる」という用語を包含する。
【００９５】
「から基本的になる」という句は、組成または方法が、追加の成分および／またはステップを含む場合があることを意味するが、追加の成分および／またはステップが、特許請求する組成または方法の基本的および新規な特徴を物質的に変えない場合に限る。
【００９６】
本明細書で使用する単数形「ａ」、「ａｎ」、および「ｔｈｅ」は、文脈上別段明確に示されない限り複数の指示内容を含む。例えば、「化合物」または「少なくとも１つの化合物」という用語は、それらの混合物を含む複数の化合物を含むことができる。
【００９７】
「例示的」という語は、本明細書では「例、事例、または例示としての役割を果たすこと」を意味するために使用される。「例示的」として説明するいかなる実施形態も、他の実施形態と比べて好ましいもしくは有利であると必ずしも解釈されてはならず、かつ／または他の実施形態からの特徴の取入れを必ずしも排除してはならない。
【００９８】
「任意選択で」という語は、本明細書では、「いくつかの実施形態では提供され、他の実施形態では提供されない」を意味するように使用される。本発明のいかなる特定の実施形態も、複数の「任意選択の」特徴を、そのような特徴が矛盾しない限り、含む場合がある。
【００９９】
本出願の全体を通して、本発明の様々な実施形態は、範囲の形式で提示されることがある。範囲の形式での説明は、単に便宜および簡潔のためであり、本発明の範囲に対する柔軟性がない限定と解釈されるべきでないことを理解されたい。したがって、範囲の説明は、すべての可能な部分範囲ならびにその範囲内の個々の数値を具体的に開示したものと考えるべきである。例えば、１から６までなどの範囲の説明は、１から３まで、１から４まで、１から５まで、２から４まで、２から６まで、３から６まで等のような部分範囲、ならびにその範囲内の個々の数、例えば、１、２、３、４、５、および６を具体的に開示したものと考えるべきである。これは、範囲の広さに関係なく適用される。
【０１００】
数の範囲が本明細書で示されるときは常に、数の範囲は、示された範囲内の任意の引用される数字（小数または整数）を含むように意図される。第１の表示数と第２の表示数との「間に及んでいる／及ぶ」、ならびに第１の表示数「から」第２の表示数「まで」「及んでいる／及ぶ」という語句は、本明細書では交換可能に使用され、第１および第２の表示された数、ならびにそれらの数の間のすべての小数および整数を含むことを意味する。
【０１０１】
明確にするために別々の実施形態の文脈で説明されている本発明の特定の特徴は、単一の実施形態において組み合わせて提供されることも可能であることが理解される。逆に、簡潔にするために単一の実施形態の文脈で説明されている本発明の様々な特徴は、本発明の任意の他の説明されている実施形態において、別々に、または任意の適切な部分的組合せで、または好適であるように提供されることも可能である。様々な実施形態の文脈で説明したいくつかの特徴は、それらの要素なしでは実施形態が動作不能である場合を除いて、それらの実施形態の必須の特徴と考えるべきではない。
【０１０２】
本発明を、その特定の実施形態とともに説明したが、多くの代替形態、変更形態、および変形形態が当業者には明らかとなることは明白である。したがって、添付の特許請求の範囲の趣旨および広い範囲内にあるこのような代替形態、変更形態、および変形形態をすべて包含するものとする。
【０１０３】
本明細書において言及したすべての公報、特許、および特許出願は、各個々の公報、特許、または特許出願が参照により本明細書に組み込まれるよう具体的かつ個別に示された場合と同じ程度に、それらの全体が参照により本明細書に組み込まれる。加えて、本出願におけるいかなる参照の引用または特定も、そのような参照が本発明に対する先行技術として利用可能であると認めるものとして解釈されてはならない。項目の見出しが使用される限りにおいて、項目の見出しは、必ずしも限定的であると解釈されるべきではない。
【図１】
2019502197.tif 000003
【図２】
2019502197.tif 000004
【図３】
2019502197.tif 000005
【国際調査報告】
2019502197.tif 000006
2019502197.tif 000007
2019502197.tif 000008