アプリケーションコードが、実行に先立って保持のために、ストレージから難読化されたドメインにロードされる時に、前記アプリケーションコードを変換するためのコンピュータ実装方法であって、実行のためにプロセスにロードすべき1つまたは複数の実行可能モジュールを指定するモジュール実行要求を受け取るステップと、前記指定された実行可能モジュールの中の実行可能コードを識別するステップと、当該識別された実行可能コードをロードするステップと、前記プロセスがオペコード変換で保護されると決定すると、前記ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換するステップと、前記変換された実行可能コードを実行に備えて格納するステップとを備え、当該記載の複数のステップが、少なくとも1つのプロセッサによって実行されることを特徴とする方法。前記モジュール実行要求を受け取るステップは、実行可能バイナリコードを含む格納実行可能モジュールを識別するステップを備えることを特徴とする請求項1に記載の方法。前記モジュール実行要求を受け取るステップは、メインモジュールによって参照される1つまたは複数の静的にリンクされたモジュールを識別し、さらに前記静的にリンクされたモジュールをロードするステップを備えることを特徴とする請求項1に記載の方法。実行可能コードを識別するステップは、モジュールフォーマットに基づいてモジュールの中の実行可能コードのロケーションを特定するステップを備えることを特徴とする請求項1に記載の方法。実行可能コードを識別するステップは、実行可能領域を識別するデバッグシンボルまたは他のメタデータをロードするステップを備えることを特徴とする請求項1に記載の方法。前記実行可能コードをロードするステップは、前記実行可能コードの前記オペコードをネイティブドメインから難読化されたドメインに変換するステップを挿入するようにオペレーティングシステムローダプロセスをフックするか、または変更するステップを備えることを特徴とする請求項1に記載の方法。前記プロセスがオペコード変換で保護されないと決定すると、前記ロードされた、変換されていない実行可能コードを正常な実行のために格納するステップをさらに備えることを特徴とする請求項1に記載の方法。前記実行可能コードを変換するステップは、各オペコードを、ルックアップテーブルの中で識別された新たなオペコードで置き換えるステップを備えることを特徴とする請求項1に記載の方法。実行可能コードを変換するステップは、各オペコードを識別し、さらに前記識別されたオペコードを、悪意のあるコードが予測するのが困難である、明確に定義された、元に戻せるプロセスを使用してスクランブルするステップを備えることを特徴とする請求項1に記載の方法。前記変換された実行可能コードを格納するステップは、前記実行可能コードをメインメモリの中に格納し、さらに前記コードの来たるべき実行を検出すると、前記変換プロセスを元に戻して、前記モジュールコードをモジュールコードの元の形態に変換し、さらに悪意のあるコードを無効な形態に変換するステップを備えることを特徴とする請求項1に記載の方法。オペコードランダム化によりアプリケーションプロセスセキュリティをもたらすためのコンピュータシステムであって、以下の構成要素、すなわち、実行可能コードをストレージロケーションから実行前ストレージエリアにロードするコードローディング構成要素、前記ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換するオペコード変換構成要素、ロードされ、さらに変換された実行可能コードを後の実行のために格納するコードデータストア、識別されたメモリ内プログラムコードを実行する命令を受け取るコード実行構成要素、前記オペコード変換構成要素の前記変換を元に戻して、難読化されたドメインの実行可能コードを、プロセッサが実行することができるネイティブドメインの実行可能コードに変換する逆変換構成要素、および実行ストリームの中で誤りのあるオペコードを検出し、さらに悪意のあるコード、または変更されたコードが正しく実行されることを防止するエラー検出構成要素の内部で実施されるソフトウェア命令を実行するように構成されたプロセッサおよびメモリを備えることを特徴とするコンピュータシステム。前記コードローディング構成要素の実行前ストレージエリアは、パーソナルコンピュータのメインメモリを含み、さらに前記構成要素は、オペレーティングシステムシェルまたはオペレーティングシステムローダから実行可能コードをロードする要求を受け取り、さらに前記実行可能コードに関連する1つまたは複数のモジュールを識別することを特徴とする請求項11に記載のシステム。前記オペコード変換構成要素は、前記実行可能コードの命令ストリームの中の少なくともオペコードを変更して、前記実行可能コードの予測するのが困難な変更をもたらし、さらにコンピュータシステムのファームウェア層のローディング中に動作することを特徴とする請求項11に記載のシステム。前記コード実行構成要素は、前記コードデータストアから変換された実行可能コードにアクセスし、さらに前記逆変換構成要素を呼び出して前記変換を元に戻し、前記変換されたコードが、コードが変換された時点以来、変更されている場合、前記逆変換構成要素は、元のプログラムコードをネイティブドメインのオペコードに変換し、さらに悪意のあるコードを、エラーを生じさせるオペコードに変換することを特徴とする請求項11に記載のシステム。いずれのプロセスに前記オペコード変換構成要素を適用して難読化されたオペコードを生成するかを選択するプロセス選択構成要素をさらに備えるシステムであって、すべてのプロセスには前記変換を適用せず、さらに前記プロセス選択構成要素は、所与のプロセスが変換を受けるかどうかを決定することを特徴とする請求項11に記載のシステム。これらの攻撃はすべて、システムの振舞いを攻撃者が理解し、さらに予期することができることを前提としている。攻撃者が理解する必要がある最も基本的な振舞いは、マシン命令コードセットすなわち、オペコード、ならびに所望される振舞いを得るためにいずれの命令を実行すべきかである。多くのタイプのコンピューティングデバイスがなぜ、パーソナルコンピュータほど頻繁にハッキングされてこなかったかに寄与している大きな要因が、単に、それらのコンピューティングデバイスが、異なる命令セットを使用していることにある。例えば、多くのモバイル電話機は、非x86命令セットを用いるARMプロセッサまたは他のプロセッサを使用する。悪意のあるコードの実行を防止することにかかわるほとんどのソリューションは、開発中の防止、悪意のあるコードのソフトウェア検出例えば、アンチウイルススキャン、またはプロセスの状態を管理する他の手段例えば、ヒープレイアウトをランダム化するメモリマネージャ、および他の変更に依拠する。これらの方法はいくらかの成功を収めているが、悪意のあるコードの実行は、大きな問題であり続けている。アプリケーションがメモリの中に格納されている間、オペレーティングシステムまたはアプリケーションコードによって使用されるオペコードの値を変えるオペコード難読化システムが、本明細書で説明される。アプリケーションがメモリの中に格納されており、実行に先立つ期間は、悪意のあるコードが注入される最も一般的な時間である。このシステムは、アプリケーションコードがロードされるにつれ、アプリケーションコードを変換プロセスにかけて、そのコードが、ランダムな命令セットとともにメモリの中に置かれるようにする。新たな、潜在的に悪意のあるコードがこのプロセスに注入された場合、そのコードの命令セットは、変換されたアプリケーションコードの命令セットと合致しない。アプリケーションコードを実行する時間が近づくと、このシステムは、アプリケーションコードを、アプリケーションコードを元のオペコードに戻すように変換する逆変換プロセスにかける。このプロセスに注入された悪意のあるコードもまた、逆変換を受け、このことが、無効なオペコードを検出する、または知られていない、多分、無意味な命令セットを悪意のあるコードに実行させて、多分、CPU違反を生じさせる効果を有する。構造化されていないオペコードから成るコードは、一般に、それほど長い間、実行されることなしに、オペレーティングシステムによって捉えられる何らかの種類の割り込みまたはトラップを生じさせ、このことが、プロセスを終了させる。このため、アプリケーションコードは良好に実行される一方で、悪意のあるコードは、顕著なエラーを生じさせる。この概要は、詳細な説明において後段でさらに説明される選定された概念を、簡略化された形態で概説するように与えられる。この概念は、主張される主題の重要な特徴、または不可欠な特徴を特定することを意図しておらず、主張される主題の範囲を限定するのに使用されることも意図していない。アプリケーションがメモリの中に格納されている間、オペレーティングシステムまたはアプリケーションコードによって使用されるオペコードの値を変えるオペコード難読化システムが、本明細書で説明される。アプリケーションがメモリの中に格納されており、実行に先立つ期間は、悪意のあるコードがそのメモリに注入される最も一般的な時間である。このオペコード難読化システムは、アプリケーションコードがロードされるにつれ、アプリケーションコードを変換プロセスにかけて、そのコードが、ランダムな、または擬似ランダムな命令セットとともにメモリの中に置かれるようにする。新たな、潜在的に悪意のあるコードがこのプロセスに注入された場合、そのコードの命令セットは、変換されたアプリケーションコードの命令セットと合致しない。アプリケーションコードを実行する時間が近づくと、このオペコード難読化システムは、アプリケーションコードを、アプリケーションコードを元のオペコードに戻すように変換する逆変換プロセスにかける。このプロセスに注入された悪意のあるコードもまた、この変換を受け、このことが、知られていない、多分、無意味な命令セットを悪意のあるコードに実行させる効果を有する、またはCPU違反を生じさせる。構造化されていないオペコードから成るコードは、一般に、それほど長い間、実行されることなしに、オペレーティングシステムによって捉えられる何らかの種類の割り込みまたはトラップを生じさせ、このことが、プロセスを終了させる。この逆変換は、ハードウェアにおいて、またはソフトウェアにおいて行うことができる。例えば、プロセッサが、実行の直前にこの変換を実行するように変形することができる。或る単純な実装形態において、変換構成要素と逆変換構成要素は、システムがオペコードと排他的論理和演算して、容易に元に戻せるが、効果的な変換プロセスを作成する数値キーを共有することが可能である。このようにして、アプリケーションコードは良好に実行される一方で、悪意のあるコードは、顕著なエラーを生じさせる。ランダムな、または無意味なオペコードの他に悪意のあるコードが注入されているかどうかを検出する多くの可能な手段が存在する。例えば、無効なランダム化されたオペコードが見つかった場合、逆変換構成要素が、違反を生成することが可能である。また、この構成要素は、任意の所与のオペコードに関する引数を検証し、さらに無効な引数に出会った場合、違反を生じさせることも可能である。メモリの中に格納される、マシンオペコードの実際の値をランダム化することによって、オペコード難読化システムは、攻撃者が利用することができる予測可能なマシンの振舞いを防止する。副作用は、それほど一般的ではないものの、自己変形コードもまた影響を受けることである。ランダム化は、マシンの寿命中に少なくとも1回、行われるが、ハードウェア設計に依存して、起動ごとに、またはプロセスごとに行われることも可能である。理想的には、オペコードランダム化は、直交する結果セットをもたらし、したがって、衝突は全く生じない例えば、X∩X’=φ。2つのセットの間でもたらされる共通のオペコードのセットが小さいほど、逆変換が、悪意のあるコードをプリエンプティブに検出する可能性が高くなる。一部の実施形態において、オペコード難読化システムは、マシンオペコードをランダム化し、さらにルックアップテーブルを使用して、シフトされたオペコードを、CPUにネイティブのオペコードに変換する、このシステムは、プロセスごとにオペレーティングシステムを介してこの技術を適用することができる。例えば、このシステムは、パフォーマンスペナルティを被る可能性があり、したがって、システム実施者は、より脆弱なプロセスにこのシステムを適用するが、信頼されるプロセス、またはパフォーマンスがクリティカルなプロセスには、このシステムを適用しないことを選択する。このため、このオペコード難読化システムは、コンピューティングデバイス、および選択されたプロセスを、悪意のあるコードから保護し、さらにアプリケーションにより安全な実行環境をもたらす。一部の実施形態において、このオペコード難読化システムは、コンピュータハードウェアとオペレーティングシステムの両方の変形を活用して、本明細書で説明されるアプリケーションプロセスを実行する。選定された変形が、後段でさらに説明される。さらに、特定の実装形態の目標に適した保護のレベル例えば、特定のプロセスだけが保護されるか、またはマシン上で実行されているすべての実行可能ファイルが保護されるかに依存して、可能な実装形態の多くの可能な変形形態が存在する。第1の変形形態において、すべての実行可能コードが、オペコード難読化システムによって保護される。この事例において、メモリの中のすべての実行可能ページが保護され、さらに実行可能ページにロードされたすべてのコードが、オペコードを変更するように変換プロセスにかけられる。最新のCPUは、メモリの中のページに関して、特定のページを実行することができるかどうかの判定の指示を提供する例えば、x86プロセッサに関して使用されるNX非実行ビット。ハードウェアサポートが利用できない状況において、多くのオペレーティングシステムが、仮想メモリページを割り当て、さらに管理する類似したサポートをメモリ管理ユニットMMUにおいて提供するように変更されている。この変形形態は、すべてのコードが保護されるので、簡便さをもたらすが、一部のコンピューティングデバイスに関して許容できないパフォーマンストレードオフを被る可能性もある。第2の変形形態において、特別に印が付けられたプロセスだけが、オペコード難読化システムによって保護される。この事例において、特定のプロセスに、保護されるという印が付けられ、さらにそれらのオペコードを格納するのに使用されるページに、保護された実行という印が付けられ、あるいはCPUおよび/またはオペレーティングシステムおよびMMUによって解釈することができる別の指定が行われる。前述したとおり、オペコードをネイティブドメインから変更されたドメインに変換すること、および再び元に戻すように変換することに関連するいくらかの費用が存在する。特定のプロセスだけを保護することによって、実施者は、役立つ場合にはいつでも例えば、検証されていない入力が処理される場合にオペコード難読化システムの保護を活用することができるが、他のロケーションにおけるパフォーマンスペナルティを回避することができる。本明細書で説明される保護は、CPUキャッシュが存在しない場合にCPUにおいて、CPUキャッシュが存在する場合にCPUのキャッシュコントローラにおいて、CPUとは別にキャッシュが存在する場合にCPUまたはキャッシュコントローラにおいて、MMUにおいてといった具合に、様々なロケーションにおいて行うことが可能である。キャッシュコントローラがコードを保護する事例において、このコードがメモリにロードされた場合、オペレーティングシステムが、ネイティブのオペコードドメインと変更されたオペコードドメインとの間でオペコードマッピングを適用するようキャッシュコントローラに命令するルーチンを呼び出す。逆に、CPUにおけるキャッシングコードがメモリをロードする際、キャッシュコントローラが、変更されたドメインからネイティブドメインに戻す変換を実行する。このため、CPUキャッシュ内で、命令はネイティブドメイン内にある。正式ではない様態でロードされるコードは、第2の変換を受けるが、第1の変換は受けず、予測できない動作につながる。このソリューションは、CPUキャッシュ内の既存の分岐予測コードが容易に維持されることを可能にする。CPUがコードを保護する事例において、実行可能コードは、CPUL2キャッシュ内でさえ、変更されたドメインの中で保持され、変換は、L1において、またはプロセッサによる評価の直前に行われる。プロセッサが、実行可能コードをメモリにロードすることを担い、さらに、このため、他の制約実行可能コードをロードするのに十分な特定の特権レベルなどのを執行することが可能である。この変形形態は、実行可能コードが、短い期間だけしかネイティブドメインに入っていないという点で、より高いレベルのセキュリティをもたらすが、CPUの潜在的に高価なネットワーキング低下またはパフォーマンス低下を伴う。図1は、一実施形態におけるオペコード難読化システムの構成要素を示すブロック図である。システム100は、コードローディング構成要素110と、オペコード変換構成要素120と、コードデータストア130と、コード実行構成要素140と、逆変換構成要素150と、エラー検出構成要素160と、プロセス選択構成要素170とを含む。これらの構成要素のそれぞれは、本明細書でさらに詳細に説明される。コードローディング構成要素110は、ストレージロケーションから実行前ストレージエリアに実行可能コードをロードする。実行前ストレージエリアは、パーソナルコンピュータのメインメモリ、1つまたは複数のキャッシュレベルなどを含む。ソリッドステート永続ストレージを有するデバイスの場合、構成要素110は、そのソリッドステートストレージデバイスの中に実行可能コードの一部をあらかじめキャッシュすること、または格納することが可能である例えば、MICROSOFT登録商標WINDOWS登録商標レディブースト。コードローディング構成要素110が、オペレーティングシステムシェルまたはオペレーティングシステムローダから実行可能コードをロードする要求を受け取り、さらにその実行可能コードに関連する1つまたは複数のモジュールを識別する。一部の実施形態において、コードローディング構成要素110は、オペレーティングシステムのローダに組み込まれて、アプリケーションコードをロードするすべての要求をインターセプトすること、あるいは基本入出力システムBIOSに、または拡張ファームウェアインターフェイスEFIなどの他のファームウェア層に組み込まれることが可能である。オペコード変換構成要素120は、ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換する。このコード変換は、実行可能コードの命令ストリームの中の少なくともオペコード、および、可能性として、他のデータを変更して、実行可能コードの予測するのが困難な変更をもたらす。一部の実施形態において、システムは、コンピュータシステムの起動のたびに、または各プロセスが開始する際、乱数または暗号ソルトを選択し、さらにその値を使用して、オペコードを或る様態例えば、排他的論理和、または他の元に戻せる演算で転がす。コンピュータシステムが、オペレーティングシステムがインストールされる際に限って乱数を選択する場合でさえ、各コンピュータシステムが、オペコードを難読化するのに使用される潜在的に異なる数を有するという事実は、悪意のあるコードの作成者を頓挫させ、さらに害をもたらすコードをコンピュータシステムにインストールすることを困難にする。乱数発生器の強度、鍵のサイズ、およびシステムエントロピーが、同一の変更されたドメインを共有するマシンの実際の数を決定する。コードデータストア130は、ロードされ、変換された実行可能コードを、後の実行のために格納する。コードデータストア130には、1つまたは複数のメモリ内データ構造、ファイル、ファイルシステム、ハードドライブ、データベース、クラウドベースのストレージサービス、またはデータを格納するための他の設備が含まれる。今日のコンピュータシステムは、コードが実行されることになるコンピューティングデバイスにインストールされた後にジャストインタイムJITコンパイルを受ける、管理されたアプリケーションコードを含め、多くのタイプのアプリケーションコードを実行する。例えば、MICROSOFT登録商標.NETは、中間言語ILコードからコンパイルされており、さらにコンピュータシステムにロードされて、実行される準備ができているモジュールのグローバルアセンブリキャッシュGACをもたらす。一部の実施形態において、オペコード変換構成要素120は、この段階で、プログラムモジュールがJITコンパイルされるにつれてプログラムモジュールを難読化するように動作することが可能である。より旧来のネイティブアプリケーションコードは、ロードすることが要求されるたびにメモリの中で変換されてもよく、またはシステムが、そのネイティブアプリケーションコードの変換されたバージョンをキャッシュしてもよい。今日の一部のオペレーティングシステムは、実行をスピードアップするモジュールのプリフェッチされたメモリスナップショットを生成し例えば、MICROSOFT登録商標WINDOWS登録商標SuperFetch、さらにこれらのフィーチャは、本明細書で説明される変換を実行し、さらにキャッシュするように変更される。このことは、バイナリコードの変換されたバージョンがキャッシュの中で既に利用可能であるので、プロセス実行中に時間を節約する。コード実行構成要素140は、識別されたメモリ内プログラムコードを実行する命令を受け取る。コンポーネント140は、オペレーティングシステムのメモリマネージャの一部として、または実行可能ページを、実行可能ページの実行時にわずかに先立ってメモリからCPUキャッシュにロードするCPUコントローラもしくはキャッシュコントローラの内部で動作することが可能である。コード実行構成要素140は、コードデータストア130からの変換された実行可能コードにアクセスし、さらに変換を元に戻す逆変換構成要素150を呼び出すことが可能である。変換されたコードが、コードが変換された時点以来、バッファオーバーランによる悪意のあるコードの注入などによって、変更されている場合、逆変換構成要素150は、元のプログラムコードをネイティブドメインオペコードに変換し、さらに悪意のあるコードを、無意味なオペコード、またはエラーを生じさせるオペコードに変換する。逆変換構成要素150は、オペコード変換構成要素120の変換を元に戻して、難読化されたドメインの実行可能コードを、プロセッサが実行することができるネイティブドメインの実行可能コードに変換する。逆変換構成要素150は、CPU内で動作して、MMUにおいて、オペレーティングシステムの様々な構成要素においてなど、入ってくる命令ストリームを変換することが可能である。逆変換構成要素150は、変換プロセスが元に戻されるように元の変換によって使用された乱数または暗号ソルトを受け取ることが可能である。オペコードの排他的論理和スクランブルの事例において、逆変換は、単に同一の演算を再び実行し、さらに出力は、元のオペコードセットである。より高度な実装形態において、オペコード変換構成要素120と逆変換構成要素150は、公開鍵/秘密鍵ペア、または他の対をなす鍵セットを使用して、オペコードの変換および逆変換を行うことが可能である。エラー検出構成要素160は、実行ストリームの中で誤ったオペコードを検出する。それらのオペコードは、それらのオペコードが無効である、それらのオペコードが特定のコンテキストに合わない、それらのオペコードが、その命令がアクセスを有さないデータにアクセスする例えば、アクセス違反、それらのオペコードが割り込みまたはオーバーフローを生じさせるなどの理由で、誤っている可能性がある。逆変換プロセスは、アプリケーションが最初にロードされた後にそのアプリケーションの実行可能空間に入れられた悪意のあるコードが、ランダムなオペコードもしくは無意味なオペコードに変換されるようにする、または違反を生じさせるようにする。通常のプログラムオペコードの正確で、念入りに作られた性質のため、ランダムなオペコードは、何らかのタイプのエラーをすぐに生じさせ、または範囲外である、もしくは無効であるものとして容易に検出可能である。その時点で、エラー検出構成要素160は、そのエラーを検出し、さらにアプリケーションプロセスを終了させるなどの適切なアクションを行う。そのエラーを検出することは、誤ったコードをトラップするため、およびデータの損傷を回避するための通常のCPU機構およびオペレーティングシステム機構を介して行われる。プロセス選択構成要素170は、いずれのプロセスにオペコード変換構成要素120を適用して難読化されたオペコードを生成するかを選択する。一部の実施形態において、システム100は、すべてのプロセスにこの変換を適用することはせず、プロセス選択構成要素170が、所与のプロセスが変換を受けるかどうかを決定する。システムは、ユーザまたはオペレーティングシステムベンダから、オペコードを変換すべきプロセスを識別する構成情報を受け取ることが可能である。一部の実施形態において、オペレーティングシステムベンダが、或るプラットフォーム上で実行されることが許されるバイナリコードに署名し、さらに署名のない、または信頼されないバイナリコードを変換にかける一方で、信頼されるコードは、変換にかけられないことが可能である。別の例として、システム100が、ネットワークと対話するコードに対してだけ、またはネットワークと対話しないコードに対してだけ変換を実行することが可能である。以上、およびその他の変形形態は、適切なレベルのセキュリティおよびパフォーマンスを実現するようにシステム100と一緒に使用することができる。オペコード難読化システムが実装されるコンピューティングデバイスは、中央処理装置と、メモリと、入力デバイス例えば、キーボードおよびポインティングデバイスと、出力デバイス例えば、ディスプレイデバイスと、ストレージデバイス例えば、ディスクドライブまたは他の不揮発性記憶媒体とを含む。メモリおよびストレージデバイスは、このシステムを実施する、または可能にするコンピュータ実行可能命令例えば、ソフトウェアが符号化されるコンピュータ可読記憶媒体である。さらに、データ構造およびメッセージ構造は、通信リンク上の信号などの、データ伝送媒体を介して格納される、または伝送されることが可能である。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、ポイントツーポイントダイヤルアップ接続、セル電話ネットワークなどの様々な通信リンクが使用可能である。このシステムの実施形態は、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラマブル家庭用電子機器、デジタルカメラ、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、前述のシステムまたはデバイスのうちのいずれかを含む分散コンピューティング環境、セットトップボックス、システムオンチップSOCなどを含む様々な動作環境において実施することができる。コンピュータシステムは、セル電話機、携帯情報端末、スマートフォン、パーソナルコンピュータ、プログラマブル家庭用電子機器、デジタルカメラなどとすることができる。このシステムは、1つまたは複数のコンピュータもしくは他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的な脈絡で説明することができる。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、構成要素、データ構造などが含まれる。通常、これらのプログラムモジュールの機能は、様々な実施形態において所望されるとおりに組み合わされても、分散されてもよい。図2は、一実施形態における、アプリケーションコードが、実行に先立って保持されるようにストレージから難読化されたドメインにロードされるにつれ、オペコード難読化システムがアプリケーションコードを変換する処理を示す流れ図である。図2および図3に示されるプロセスは、通常、それらのプロセスの合間にいくらかの時間が経過して、連続的に行われる。この時間中、アプリケーションコードは、悪意のあるハッキングの試みによる介入にアプリケーションがアプリケーションコードが脆弱であるメモリの中に、通常、置かれている。図2に関連して説明される変換プロセスは、元のアプリケーションコードを正常に実行させ、さらに悪意のあるコードに、検出可能なエラーを生じさせる予期しない動作を実行させる正味効果を有することになる図3の逆変換のため、ハッキングの試みを無効にする。ブロック210で始まって、システムが、実行のためにプロセスにロードされるべき1つまたは複数の実行可能モジュールを指定するモジュール実行要求を受け取る。オペレーティングシステムは、通常、実行可能バイナリコードを含む実行可能モジュールに関して、ポータブル実行可能PEフォーマットなどのバイナリモジュールフォーマットを定義する。これらのモジュールは、他のモジュール例えば、PEイメージのインポートテーブルを静的に参照することが可能であり、さらに他のモジュールを動的にロードすることが可能である例えば、MICROSOFT登録商標WIN32登録商標プラットフォーム上でLoadLibrary/GetProcAddressを呼び出すことによって。このようにロードされたバイナリコードは、アプリケーションの実行中にこのプロセスの外でロードされたバイナリコードとの対比で、通常、無害である、またはコード署名などの他の機構によって保護されているものと信頼される。ブロック220に進むと、システムが、指定された実行可能モジュールの中の実行可能コードを識別する。ほとんどの事例において、モジュールのよく知られたフォーマットが、実行可能コードを含むそのモジュールの部分を示す。例えば、PEイメージが、しばしば、モジュール内の実行可能コードのエントリポイントを指定する.textセクションまたはヘッダを含む。あらかじめキャッシュされた、またはJITコンパイルされたコードの場合、コンピュータシステムは、実行可能領域を識別するデバッグシンボルまたは他のメタデータを含むことができる。ブロック230に進むと、システムが、識別された実行可能コードをロードする。オペレーティングシステムローダが、通常、静的にリンクされたモジュールを扱うこと、アドレス空間衝突を回避するバイナリ再配置、命令ストリームの中の絶対アドレスの取り決めなどを含め、実行可能コードをロードすることを扱う。オペコード難読化システムは、実行可能コードのオペコードをネイティブドメインから難読化されたドメインに変換するステップを挿入するようにローダをフックする、または変更する。簡単な例として、このシステムは、各オペコードに0×20を加えて、0×55関数のエントリにおけるx86スタックの一般的なセットアップであるPUSHEBPが0×75実行された場合、JNE命令であるになるようにすることが可能である。決定ブロック240に進むと、システムが、現在のプロセスがオペコード変換で保護されると決定した場合、システムは、ブロック260に進み、保護されないと決定した場合、システムは、ブロック250に進む。ブロック250に進むと、システムは、ロードされた、変換されていない実行可能コードを通常の実行のために格納する。システムは、メモリの中で、そのコードを、実行のために印が付けられた、前もって割り当てられたページに格納することが可能である。ブロック250の後、システムは、完了する。ブロック260に進むと、システムは、ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換する。一部の実施形態において、システムは、実行可能コードを逆アセンブルして各オペコードを識別し、さらに、その後、明確に定義され、元に戻せるが、それでも、悪意のあるコードが予測することが困難なプロセスを使用して、それらのオペコードをスクランブルする。悪意のあるコードは、自らを正しくスクランブルすることができないため、図3に関連して説明される逆スクランブルプロセスが、悪意のあるコードを、悪意のあるコードの当初の目的に関して無害にする。ブロック270に進むと、システムが、変換された実行可能コードを実行に備えて格納する。システムは、実行可能コードを、メインメモリの中に、高速メモリキャッシュの中に、または実行の準備のできたコードが格納される別のロケーションに格納することが可能である。コードを実行する時間が来ると、システムは、図3に関連して説明される変換プロセスを元に戻す。ブロック270の後、以上のステップが完了する。図3は、一実施形態における、オペコード難読化システムが、アプリケーションコードを実行時に、難読化されたドメインからネイティブドメインに逆変換する処理を示す流れ図である。ブロック310で始まり、システムが、アプリケーションコードの現在の実行ロケーションを識別する。この識別は、メモリからの実行可能ページが要求されているという通知を受け取ること、CPUの命令ポインタに従うこと、命令ストリームを前処理するようにCPU内で動作することなどを含む。システムは、悪意のあるコードが正当なアプリケーションコードに侵入することができる時間枠を小さくするようにオペコードが実行される時点に十分に近くなるまで、メモリの中に格納されたコードのオペコードを逆変換するのを待つ。ブロック320に進むと、システムが、識別された現在の実行ロケーションに基づいて実行されるべきコードの次のバッチを取り出す。このバッチは、メモリページ、関数、次のN個のオペコード、またはコードの他のサブセットを含む。例えば、システムは、オペレーティングシステムメモリマネージャ内で動作して、メモリの実行可能ページのアクセスを検出する、またはCPU内で動作して、実行のために命令ストリームを準備することが可能である。決定ブロック330に進むと、システムは、コードの次のバッチが変換されて難読化されたドメインに入っていると決定した場合、システムは、ブロック340に進み、変換されていないと決定した場合、システムは、ブロック350に進む。変換されていないコードは、システムがすべてのコードを変換するようにセットアップされているのでない限り、正常に実行することを許される。オペコード難読化システムは、オペレーティングシステムまたはアプリケーションが、いくらかのコードだけが本明細書で説明されるプロセスによってセキュリティ保護されるよう要求することを可能にし、さらにこのシステムは、図2に関連して説明される初期の変換を受けているものとしてコードに印が付けられているかどうかに基づき、プロセスを条件付きで元に戻す。ブロック340に進むと、システムは、コードの取り出されたバッチを難読化されたドメインから、プロセッサによって実行可能なネイティブドメインに逆変換する。例えば、ネイティブドメインが、インテルx86命令セットを含む一方で、難読化されたドメインは、x86命令セットのランダムな摂動を含むことができる。逆変換することは、それまでに適用された変換に逆操作を適用し、さらに正当なアプリケーションコードの場合、プロセッサによって実行される準備のできたバイナリコードを生成する。元の変換の時点で存在しなかった悪意のあるコードの場合、逆変換プロセスは、1つまたは複数の検出可能なエラーをすぐにもたらすものと予期される予測できないエラーを生じやすいバイナリコードを生成する。決定ブロック345に進むと、システムが、逆変換中に違反を検出した場合、システムは、ブロック370にジャンプしてプロセスを終了させ、検出しなかった場合、システムは、ブロック350に進む。ブロック350に進むと、システムは、逆変換されたコードを実行のためにプロセッサにサブミットする。このコードが通常のアプリケーションコードである場合、このコードは、プログラム作成者によって設計されたとおりに実行されて、何であれこのコードが意図されていた目的を実行する。しかし、このコードが、逆変換プロセスによってスクランブルされた悪意のあるプログラムコードを含む場合、このコードは、いくつかの命令に関して実行されてから、何らかのタイプのエラー例えば、アクセス違反、範囲エラー、オーバーフローなどをもたらすことが可能である。決定ブロック360に進むと、システムが、実行エラーを検出した場合、システムは、ブロック370に進み、検出しなかった場合、システムは、完了する。この実行エラーは、割り込み、アクセス違反、保護違反などの、プロセッサまたはオペレーティングシステムによってトラップされる1つまたは複数の異常を含むことができる。一部の実施形態において、システムは、ルックアップテーブルを使用して実行可能コードを逆変換する。システムは、無効なオペコードを変換する要求を、よく知られたエラー命令で置き換えることが可能である。ほとんどの命令セットにおいて、使用されないオペコード、廃止されたオペコード、将来の使用のために取って置かれるオペコードなどが存在する。システムは、そのようなコードを、例えば、割り込みに変換して、スクランブルされた悪意のあるコードを実行しようとする試みが、例外、または他の実行を停止させる結果をもたらすことをさらに確実にすることができる。ブロック370に進むと、システムは、アプリケーションコードの実行を停止させる。システムは、ユーザにエラーを表示し、デバッガをアタッチすることを提案し、または自動化されたエラーレポートをさらなる処理のために中央サービスにサブミットすることが可能である。いずれにしても、アプリケーションコードは、アプリケーションコードが侵害を受けた後にそれほど長く実行され続けることはなく、悪意のあるコードが害をなすことができないことを確実にする。ブロック370の後、これらのステップは、終了する。図4は、一実施形態における、オペコード難読化システムの動作中に実行可能コードを含むモジュールの3つの段階を示すブロック図である。第1の段階410は、このモジュールのディスク上に格納されたバージョンを示す。このモジュールは、このモジュールを実行するための1つまたは複数の関数440または他の実行可能コードを含む。オペコード難読化システムが、このモジュールをメモリにロードして第2の段階420をもたらす。この図の網掛けされた領域は、本明細書で説明される技術を使用して変換される、またはスクランブルされる領域を例示する。第2の段階420に示されるとおり、関数450が、このモジュールがロードされた時点で変換されている。後に、バッファオーバーランまたは他の攻撃ベクトルを介して、悪意のあるコード460が、このモジュールに自らを注入している。悪意のあるコード460は、このモジュールがロードされた時点で存在していなかったので、悪意のあるコード460は、本明細書で説明される技術を使用して変換されていない。第3の段階430が、このモジュールを、このモジュールの実行の直前の状態で例示する。このモジュールは、CPU内で実行される直前にCPUキャッシュ内、メモリキャッシュ内、または他のロケーションに保持される。システムは、このモジュールの実行可能コードに対する変換プロセスを元に戻して、関数470は、元の変換される前の状態に戻っているが、悪意のあるコード480は、スクランブルされているという効果を生じている。このモジュールが実行されるにつれ、関数470は、正常に機能するが、悪意のあるコード480は、1つまたは複数の誤りを含む意図しない結果をもたらす。このようにして、プロセスの実行は、オペコード難読化システムによって、より安全にされる。図5は、一実施形態における、オペレーションコード難読化システムによって与えられる保護、およびどこで保護が行われるかを示すブロック図である。この図は、メインメモリ510と、プリCPUキャッシュ520と、CPU5301つまたは複数の内部キャッシュ層を有することも可能であるとを含む。図示される実施形態において、このシステムは、コードのオペコードを変換してから、そのコードをメインメモリ510にロードし、さらにキャッシュコントローラまたは他のエンティティが、コードがメインメモリ510からキャッシュ520に移動する際に、それらのオペコードを逆変換する。このため、キャッシュ520およびCPU530の周囲に概念的な信頼される領域540が存在する。このシステムは、様々な実施形態において、信頼される領域540を異なる様態で配置するように実施可能であることに留意されたい。例えば、一部の実施形態において、信頼される領域540は、CPU530を含むが、キャッシュ520は含まないことが可能である。一部の実施形態において、オペコード難読化システムは、オペコードだけでなくデータも変換する。一部の命令セットは、他の命令セットと比べて、オペコードを識別することをより困難にする。例えば、複合命令セットアーキテクチャCISCは、しばしば、可変長のオペコードを含み、したがって、逆アセンブリなしに、或るコードがどこで止まり、別のコードがどこで始まるかを見分けるのは困難である。そのような事例において、システムは、ジャンプアドレス、オペランド値などの任意のデータを含め、命令ストリーム全体を変換することを選択することが可能である。データは、逆変換プロセスによって元に戻るように変換されるので、潜在的にさらなる時間がかかることを除いて、データも変換することに全く害はない。しかし、値をマッピングすることは、比較的高速の動作である。一部の実施形態において、オペコード難読化システムは、様々なレベルに逆変換段階を配置することができる。例えば、逆変換は、メインメモリ内で、MMU内で、L2キャッシュ内で、L1キャッシュ内で、またはCPU自体の中で行われることも可能である。一般に、変換が行われるのが、より後期で、よりCPUの近くであるほど、プロセスは、より強いセキュリティで保護される、しかし、より後期の段の変換には、高価である、変更されたCPUなどのハードウェア変更も伴う。同様に、順方向変換も、ディスク上で、ロード中に、メインメモリ内でなど、様々な段階で行うことが可能である。一般に、変換が行われてから、アプリケーションコードは、実行を待ってメモリの中に置かれる。以上のことから、オペコード難読化システムの特定の実施形態が、例示の目的で本明細書で説明されてきたが、本発明の趣旨および範囲を逸脱することなく、様々な変形が可能であることが認識されよう。したがって、本発明は、添付の特許請求の範囲による以外に限定されない。