(57)【要約】アプリケーションがメモリの中に格納されている間、オペレーティングシステムまたはアプリケーションコードによって使用されるオペコードの値を変えるオペコード難読化システムが、本明細書で説明される。このシステムは、アプリケーションコードがロードされるにつれ、アプリケーションコードを変換プロセスにかけて、そのコードが、変更された命令セットとともにメモリの中に置かれるようにする。新たな、潜在的に悪意のあるコードがこのプロセスに注入された場合、そのコードの命令セットは、変換されたアプリケーションコードの命令セットと合致しない。アプリケーションコードを実行する時間が近づくと、このシステムは、アプリケーションコードを、アプリケーションコードを元のオペコードに戻すように変換する逆変換プロセスにかける。このプロセスに注入された悪意のあるコードもまた、逆変換を受け、このことが、悪意のあるコードが無効、または誤っていると検出可能にする効果を生じる。
2014503901.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションコードが、実行に先立って保持のために、ストレージから難読化されたドメインにロードされる時に、前記アプリケーションコードを変換するためのコンピュータ実装方法であって、
実行のためにプロセスにロードすべき１つまたは複数の実行可能モジュールを指定するモジュール実行要求を受け取るステップと、
前記指定された実行可能モジュールの中の実行可能コードを識別するステップと、
当該識別された実行可能コードをロードするステップと、
前記プロセスがオペコード変換で保護されると決定すると、前記ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換するステップと、
前記変換された実行可能コードを実行に備えて格納するステップとを備え、当該記載の複数のステップが、少なくとも１つのプロセッサによって実行されることを特徴とする方法。
【請求項２】
前記モジュール実行要求を受け取るステップは、実行可能バイナリコードを含む格納実行可能モジュールを識別するステップを備えることを特徴とする請求項１に記載の方法。
【請求項３】
前記モジュール実行要求を受け取るステップは、メインモジュールによって参照される１つまたは複数の静的にリンクされたモジュールを識別し、さらに前記静的にリンクされたモジュールをロードするステップを備えることを特徴とする請求項１に記載の方法。
【請求項４】
実行可能コードを識別するステップは、モジュールフォーマットに基づいてモジュールの中の実行可能コードのロケーションを特定するステップを備えることを特徴とする請求項１に記載の方法。
【請求項５】
実行可能コードを識別するステップは、実行可能領域を識別するデバッグシンボルまたは他のメタデータをロードするステップを備えることを特徴とする請求項１に記載の方法。
【請求項６】
前記実行可能コードをロードするステップは、前記実行可能コードの前記オペコードをネイティブドメインから難読化されたドメインに変換するステップを挿入するようにオペレーティングシステムローダプロセスをフックするか、または変更するステップを備えることを特徴とする請求項１に記載の方法。
【請求項７】
前記プロセスがオペコード変換で保護されないと決定すると、前記ロードされた、変換されていない実行可能コードを正常な実行のために格納するステップをさらに備えることを特徴とする請求項１に記載の方法。
【請求項８】
前記実行可能コードを変換するステップは、各オペコードを、ルックアップテーブルの中で識別された新たなオペコードで置き換えるステップを備えることを特徴とする請求項１に記載の方法。
【請求項９】
実行可能コードを変換するステップは、各オペコードを識別し、さらに前記識別されたオペコードを、悪意のあるコードが予測するのが困難である、明確に定義された、元に戻せるプロセスを使用してスクランブルするステップを備えることを特徴とする請求項１に記載の方法。
【請求項１０】
前記変換された実行可能コードを格納するステップは、前記実行可能コードをメインメモリの中に格納し、さらに前記コードの来たるべき実行を検出すると、前記変換プロセスを元に戻して、前記モジュールコードをモジュールコードの元の形態に変換し、さらに悪意のあるコードを無効な形態に変換するステップを備えることを特徴とする請求項１に記載の方法。
【請求項１１】
オペコードランダム化によりアプリケーションプロセスセキュリティをもたらすためのコンピュータシステムであって、
以下の構成要素、すなわち、
実行可能コードをストレージロケーションから実行前ストレージエリアにロードするコードローディング構成要素、
前記ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換するオペコード変換構成要素、
ロードされ、さらに変換された実行可能コードを後の実行のために格納するコードデータストア、
識別されたメモリ内プログラムコードを実行する命令を受け取るコード実行構成要素、
前記オペコード変換構成要素の前記変換を元に戻して、難読化されたドメインの実行可能コードを、プロセッサが実行することができるネイティブドメインの実行可能コードに変換する逆変換構成要素、および
実行ストリームの中で誤りのあるオペコードを検出し、さらに悪意のあるコード、または変更されたコードが正しく実行されることを防止するエラー検出構成要素
の内部で実施されるソフトウェア命令を実行するように構成されたプロセッサおよびメモリを備えることを特徴とするコンピュータシステム。
【請求項１２】
前記コードローディング構成要素の実行前ストレージエリアは、パーソナルコンピュータのメインメモリを含み、さらに前記構成要素は、オペレーティングシステムシェルまたはオペレーティングシステムローダから実行可能コードをロードする要求を受け取り、さらに前記実行可能コードに関連する１つまたは複数のモジュールを識別することを特徴とする請求項１１に記載のシステム。
【請求項１３】
前記オペコード変換構成要素は、前記実行可能コードの命令ストリームの中の少なくともオペコードを変更して、前記実行可能コードの予測するのが困難な変更をもたらし、さらにコンピュータシステムのファームウェア層のローディング中に動作することを特徴とする請求項１１に記載のシステム。
【請求項１４】
前記コード実行構成要素は、前記コードデータストアから変換された実行可能コードにアクセスし、さらに前記逆変換構成要素を呼び出して前記変換を元に戻し、前記変換されたコードが、コードが変換された時点以来、変更されている場合、前記逆変換構成要素は、元のプログラムコードをネイティブドメインのオペコードに変換し、さらに悪意のあるコードを、エラーを生じさせるオペコードに変換することを特徴とする請求項１１に記載のシステム。
【請求項１５】
いずれのプロセスに前記オペコード変換構成要素を適用して難読化されたオペコードを生成するかを選択するプロセス選択構成要素をさらに備えるシステムであって、
すべてのプロセスには前記変換を適用せず、さらに前記プロセス選択構成要素は、所与のプロセスが変換を受けるかどうかを決定することを特徴とする請求項１１に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はオペコードランダム化によるセキュリティに関する。
【背景技術】
【０００２】
ほとんどのコンピュータシステムは、基本的な低レベルの動作を実行する１つまたは複数のオペコードを受け取る中央処理装置（ＣＰＵ）を備えることによって機能する。一例が、データを動かすための命令（例えば、ｍｏｖ、ｐｕｓｈ、ｐｏｐ）、数値に対する数値演算（例えば、ａｄｄ、ａｄｃ、ｓｕｂ、ｓｂｂ、ｄｉｖ、ｆｄｉｖ、ｉｍｕｌ）、論理演算（例えば、ａｎｄ、ｏｒ、ｘｏｒ）、異なる実行パスへの分岐（例えば、ｊｍｐ、ｊｎｅ、ｊｚ、ｒｅｔ）、割り込み（例えば、ｉｎｔ）などをもたらす、一般的なＩｎｔｅｌ  ｘ８６アーキテクチャである。コンパイラが、ソフトウェア開発者によってプログラミング言語で書かれた人間可読のソースコードを、実行可能ファイルをもたらすコンパイル、リンク、およびアセンブリのプロセスを介してバイナリオペコードに変換する。実行可能ファイルを実行するユーザからの命令を受け取ると、オペレーティングシステムは、バイナリオペコードをプロセッサに供給し、プロセッサが、その実行可能ファイルによって表されるプログラムの命令を実行する。
【０００３】
最新のプログラム悪用には、一般に、アプリケーション作成者によって当初、意図されていた以外の命令をＣＰＵに実行させることを含む。このことは、アプリケーションのプロセスの中にオペコードの形態で新たなバイナリコードを注入することを含む。しばしば、このことは、バッファの長さを超えること（すなわち、バッファオーバーラン）によって引き起こされる。このことは、或る機能のリターンアドレスに上書きするという効果を有し、その結果、その機能が終了すると、制御フローを、バッファ内に注入された悪意のあるコードに分岐させる。これらの攻撃は、アプリケーションプログラムのレイアウトが予測可能な性質ゆえに、たいてい、広範にわたって機能する。或るプログラムが、そのプログラムが実行されるたびにデータを同一の場所に入れ、さらにデータを同一の様態で処理する場合、攻撃者は、同一の攻撃ベクトルを多くのコンピュータシステム上で確実に機能させることができる。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
これらの攻撃はすべて、システムの振舞いを攻撃者が理解し、さらに予期することができることを前提としている。攻撃者が理解する必要がある最も基本的な振舞いは、マシン命令コードセット（すなわち、オペコード）、ならびに所望される振舞いを得るためにいずれの命令を実行すべきかである。多くのタイプのコンピューティングデバイスがなぜ、パーソナルコンピュータほど頻繁にハッキングされてこなかったかに寄与している大きな要因が、単に、それらのコンピューティングデバイスが、異なる命令セットを使用していることにある。例えば、多くのモバイル電話機は、非ｘ８６命令セットを用いるＡＲＭプロセッサまたは他のプロセッサを使用する。悪意のあるコードの実行を防止することにかかわるほとんどのソリューションは、開発中の防止、悪意のあるコードのソフトウェア検出（例えば、アンチウイルススキャン）、またはプロセスの状態を管理する他の手段（例えば、ヒープレイアウトをランダム化するメモリマネージャ、および他の変更）に依拠する。これらの方法はいくらかの成功を収めているが、悪意のあるコードの実行は、大きな問題であり続けている。
【課題を解決するための手段】
【０００５】
アプリケーションがメモリの中に格納されている間、オペレーティングシステムまたはアプリケーションコードによって使用されるオペコードの値を変えるオペコード難読化システムが、本明細書で説明される。アプリケーションがメモリの中に格納されており、実行に先立つ期間は、悪意のあるコードが注入される最も一般的な時間である。このシステムは、アプリケーションコードがロードされるにつれ、アプリケーションコードを変換プロセスにかけて、そのコードが、ランダムな命令セットとともにメモリの中に置かれるようにする。新たな、潜在的に悪意のあるコードがこのプロセスに注入された場合、そのコードの命令セットは、変換されたアプリケーションコードの命令セットと合致しない。アプリケーションコードを実行する時間が近づくと、このシステムは、アプリケーションコードを、アプリケーションコードを元のオペコードに戻すように変換する逆変換プロセスにかける。このプロセスに注入された悪意のあるコードもまた、逆変換を受け、このことが、無効なオペコードを検出する、または知られていない、多分、無意味な命令セットを悪意のあるコードに実行させて、多分、ＣＰＵ違反を生じさせる効果を有する。構造化されていないオペコードから成るコードは、一般に、それほど長い間、実行されることなしに、オペレーティングシステムによって捉えられる何らかの種類の割り込みまたはトラップを生じさせ、このことが、プロセスを終了させる。このため、アプリケーションコードは良好に実行される一方で、悪意のあるコードは、顕著なエラーを生じさせる。
【０００６】
この概要は、詳細な説明において後段でさらに説明される選定された概念を、簡略化された形態で概説するように与えられる。この概念は、主張される主題の重要な特徴、または不可欠な特徴を特定することを意図しておらず、主張される主題の範囲を限定するのに使用されることも意図していない。
【図面の簡単な説明】
【０００７】
【図１】一実施形態におけるオペコード難読化システムの構成要素を示すブロック図である。
【図２】一実施形態における、アプリケーションコードが、実行に先立って保持されるようにストレージから難読化されたドメインにロードされるにつれ、オペコード難読化システムがアプリケーションコードを変換する処理を示す流れ図である。
【図３】一実施形態における、オペコード難読化システムが、アプリケーションコードを実行時に、難読化されたドメインからネイティブドメインに逆変換する処理を示す流れ図である。
【図４】一実施形態における、オペコード難読化システムの動作中に実行可能コードを含むモジュールの３つの段階を示すブロック図である。
【図５】一実施形態における、オペコード難読化システムによって与えられる保護、およびどこで保護が行われるかを示すブロック図である。
【発明を実施するための形態】
【０００８】
アプリケーションがメモリの中に格納されている間、オペレーティングシステムまたはアプリケーションコードによって使用されるオペコードの値を変えるオペコード難読化システムが、本明細書で説明される。アプリケーションがメモリの中に格納されており、実行に先立つ期間は、悪意のあるコードがそのメモリに注入される最も一般的な時間である。このオペコード難読化システムは、アプリケーションコードがロードされるにつれ、アプリケーションコードを変換プロセスにかけて、そのコードが、ランダムな、または擬似ランダムな命令セットとともにメモリの中に置かれるようにする。新たな、潜在的に悪意のあるコードがこのプロセスに注入された場合、そのコードの命令セットは、変換されたアプリケーションコードの命令セットと合致しない。アプリケーションコードを実行する時間が近づくと、このオペコード難読化システムは、アプリケーションコードを、アプリケーションコードを元のオペコードに戻すように変換する逆変換プロセスにかける。
【０００９】
このプロセスに注入された悪意のあるコードもまた、この変換を受け、このことが、知られていない、多分、無意味な命令セットを悪意のあるコードに実行させる効果を有する、またはＣＰＵ違反を生じさせる。構造化されていないオペコードから成るコードは、一般に、それほど長い間、実行されることなしに、オペレーティングシステムによって捉えられる何らかの種類の割り込みまたはトラップを生じさせ、このことが、プロセスを終了させる。この逆変換は、ハードウェアにおいて、またはソフトウェアにおいて行うことができる。例えば、プロセッサが、実行の直前にこの変換を実行するように変形することができる。或る単純な実装形態において、変換構成要素と逆変換構成要素は、システムがオペコードと排他的論理和演算して、容易に元に戻せるが、効果的な変換プロセスを作成する数値キーを共有することが可能である。このようにして、アプリケーションコードは良好に実行される一方で、悪意のあるコードは、顕著なエラーを生じさせる。ランダムな、または無意味なオペコードの他に悪意のあるコードが注入されているかどうかを検出する多くの可能な手段が存在する。例えば、無効なランダム化されたオペコードが見つかった場合、逆変換構成要素が、違反を生成することが可能である。また、この構成要素は、任意の所与のオペコードに関する引数を検証し、さらに無効な引数に出会った場合、違反を生じさせることも可能である。
【００１０】
メモリの中に格納される、マシンオペコードの実際の値をランダム化することによって、オペコード難読化システムは、攻撃者が利用することができる予測可能なマシンの振舞いを防止する。副作用は、それほど一般的ではないものの、自己変形コードもまた影響を受けることである。ランダム化は、マシンの寿命中に少なくとも１回、行われるが、ハードウェア設計に依存して、起動ごとに、またはプロセスごとに行われることも可能である。理想的には、オペコードランダム化は、直交する結果セットをもたらし、したがって、衝突は全く生じない（例えば、Ｘ∩Ｘ’＝φ）。２つのセットの間でもたらされる共通のオペコードのセットが小さいほど、逆変換が、悪意のあるコードをプリエンプティブに検出する可能性が高くなる。一部の実施形態において、オペコード難読化システムは、マシンオペコードをランダム化し、さらにルックアップテーブルを使用して、シフトされたオペコードを、ＣＰＵにネイティブのオペコードに変換する、このシステムは、プロセスごとにオペレーティングシステムを介してこの技術を適用することができる。例えば、このシステムは、パフォーマンスペナルティを被る可能性があり、したがって、システム実施者は、より脆弱なプロセスにこのシステムを適用するが、信頼されるプロセス、またはパフォーマンスがクリティカルなプロセスには、このシステムを適用しないことを選択する。このため、このオペコード難読化システムは、コンピューティングデバイス、および選択されたプロセスを、悪意のあるコードから保護し、さらにアプリケーションにより安全な実行環境をもたらす。
【００１１】
一部の実施形態において、このオペコード難読化システムは、コンピュータハードウェアとオペレーティングシステムの両方の変形を活用して、本明細書で説明されるアプリケーションプロセスを実行する。選定された変形が、後段でさらに説明される。さらに、特定の実装形態の目標に適した保護のレベル（例えば、特定のプロセスだけが保護されるか、またはマシン上で実行されているすべての実行可能ファイルが保護されるか）に依存して、可能な実装形態の多くの可能な変形形態が存在する。
【００１２】
第１の変形形態において、すべての実行可能コードが、オペコード難読化システムによって保護される。この事例において、メモリの中のすべての実行可能ページが保護され、さらに実行可能ページにロードされたすべてのコードが、オペコードを変更するように変換プロセスにかけられる。最新のＣＰＵは、メモリの中のページに関して、特定のページを実行することができるかどうかの判定の指示を提供する（例えば、ｘ８６プロセッサに関して使用されるＮＸ「非実行」ビット）。ハードウェアサポートが利用できない状況において、多くのオペレーティングシステムが、仮想メモリページを割り当て、さらに管理する類似したサポートをメモリ管理ユニット（ＭＭＵ）において提供するように変更されている。この変形形態は、すべてのコードが保護されるので、簡便さをもたらすが、一部のコンピューティングデバイスに関して許容できないパフォーマンストレードオフを被る可能性もある。
【００１３】
第２の変形形態において、特別に印が付けられたプロセスだけが、オペコード難読化システムによって保護される。この事例において、特定のプロセスに、保護されるという印が付けられ、さらにそれらのオペコードを格納するのに使用されるページに、「保護された実行」という印が付けられ、あるいはＣＰＵおよび／またはオペレーティングシステムおよびＭＭＵによって解釈することができる別の指定が行われる。前述したとおり、オペコードをネイティブドメインから変更されたドメインに変換すること、および再び元に戻すように変換することに関連するいくらかの費用が存在する。特定のプロセスだけを保護することによって、実施者は、役立つ場合にはいつでも（例えば、検証されていない入力が処理される場合に）オペコード難読化システムの保護を活用することができるが、他のロケーションにおけるパフォーマンスペナルティを回避することができる。
【００１４】
本明細書で説明される保護は、ＣＰＵキャッシュが存在しない場合にＣＰＵにおいて、ＣＰＵキャッシュが存在する場合にＣＰＵのキャッシュコントローラにおいて、ＣＰＵとは別にキャッシュが存在する場合にＣＰＵまたはキャッシュコントローラにおいて、ＭＭＵにおいてといった具合に、様々なロケーションにおいて行うことが可能である。キャッシュコントローラがコードを保護する事例において、このコードがメモリにロードされた場合、オペレーティングシステムが、ネイティブのオペコードドメインと変更されたオペコードドメインとの間でオペコードマッピングを適用するようキャッシュコントローラに命令するルーチンを呼び出す。逆に、ＣＰＵにおけるキャッシングコードがメモリをロードする際、キャッシュコントローラが、変更されたドメインからネイティブドメインに戻す変換を実行する。このため、ＣＰＵキャッシュ内で、命令はネイティブドメイン内にある。正式ではない様態でロードされるコードは、第２の変換を受けるが、第１の変換は受けず、予測できない動作につながる。このソリューションは、ＣＰＵキャッシュ内の既存の分岐予測コードが容易に維持されることを可能にする。
【００１５】
ＣＰＵがコードを保護する事例において、実行可能コードは、ＣＰＵ  Ｌ２キャッシュ内でさえ、変更されたドメインの中で保持され、変換は、Ｌ１において、またはプロセッサによる評価の直前に行われる。プロセッサが、実行可能コードをメモリにロードすることを担い、さらに、このため、他の制約（実行可能コードをロードするのに十分な特定の特権レベルなどの）を執行することが可能である。この変形形態は、実行可能コードが、短い期間だけしかネイティブドメインに入っていないという点で、より高いレベルのセキュリティをもたらすが、ＣＰＵの潜在的に高価なネットワーキング低下またはパフォーマンス低下を伴う。
【００１６】
図１は、一実施形態におけるオペコード難読化システムの構成要素を示すブロック図である。システム１００は、コードローディング構成要素１１０と、オペコード変換構成要素１２０と、コードデータストア１３０と、コード実行構成要素１４０と、逆変換構成要素１５０と、エラー検出構成要素１６０と、プロセス選択構成要素１７０とを含む。これらの構成要素のそれぞれは、本明細書でさらに詳細に説明される。
【００１７】
コードローディング構成要素１１０は、ストレージロケーションから実行前ストレージエリアに実行可能コードをロードする。実行前ストレージエリアは、パーソナルコンピュータのメインメモリ、１つまたは複数のキャッシュレベルなどを含む。ソリッドステート永続ストレージを有するデバイスの場合、構成要素１１０は、そのソリッドステートストレージデバイスの中に実行可能コードの一部をあらかじめキャッシュすること、または格納することが可能である（例えば、ＭＩＣＲＯＳＯＦＴ（登録商標）ＷＩＮＤＯＷＳ（登録商標）レディブースト）。コードローディング構成要素１１０が、オペレーティングシステムシェルまたはオペレーティングシステムローダから実行可能コードをロードする要求を受け取り、さらにその実行可能コードに関連する１つまたは複数のモジュールを識別する。一部の実施形態において、コードローディング構成要素１１０は、オペレーティングシステムのローダに組み込まれて、アプリケーションコードをロードするすべての要求をインターセプトすること、あるいは基本入出力システム（ＢＩＯＳ）に、または拡張ファームウェアインターフェイス（ＥＦＩ）などの他のファームウェア層に組み込まれることが可能である。
【００１８】
オペコード変換構成要素１２０は、ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換する。このコード変換は、実行可能コードの命令ストリームの中の少なくともオペコード、および、可能性として、他のデータを変更して、実行可能コードの予測するのが困難な変更をもたらす。一部の実施形態において、システムは、コンピュータシステムの起動のたびに、または各プロセスが開始する際、乱数または暗号ソルトを選択し、さらにその値を使用して、オペコードを或る様態（例えば、排他的論理和、または他の元に戻せる演算）で転がす。コンピュータシステムが、オペレーティングシステムがインストールされる際に限って乱数を選択する場合でさえ、各コンピュータシステムが、オペコードを難読化するのに使用される潜在的に異なる数を有するという事実は、悪意のあるコードの作成者を頓挫させ、さらに害をもたらすコードをコンピュータシステムにインストールすることを困難にする。乱数発生器の強度、鍵のサイズ、およびシステムエントロピーが、同一の変更されたドメインを共有するマシンの実際の数を決定する。
【００１９】
コードデータストア１３０は、ロードされ、変換された実行可能コードを、後の実行のために格納する。コードデータストア１３０には、１つまたは複数のメモリ内データ構造、ファイル、ファイルシステム、ハードドライブ、データベース、クラウドベースのストレージサービス、またはデータを格納するための他の設備が含まれる。今日のコンピュータシステムは、コードが実行されることになるコンピューティングデバイスにインストールされた後にジャストインタイム（ＪＩＴ）コンパイルを受ける、管理されたアプリケーションコードを含め、多くのタイプのアプリケーションコードを実行する。例えば、ＭＩＣＲＯＳＯＦＴ（登録商標）．ＮＥＴは、中間言語（ＩＬ）コードからコンパイルされており、さらにコンピュータシステムにロードされて、実行される準備ができているモジュールのグローバルアセンブリキャッシュ（ＧＡＣ）をもたらす。一部の実施形態において、オペコード変換構成要素１２０は、この段階で、プログラムモジュールがＪＩＴコンパイルされるにつれてプログラムモジュールを難読化するように動作することが可能である。より旧来のネイティブアプリケーションコードは、ロードすることが要求されるたびにメモリの中で変換されてもよく、またはシステムが、そのネイティブアプリケーションコードの変換されたバージョンをキャッシュしてもよい。今日の一部のオペレーティングシステムは、実行をスピードアップするモジュールのプリフェッチされたメモリスナップショットを生成し（例えば、ＭＩＣＲＯＳＯＦＴ（登録商標）ＷＩＮＤＯＷＳ（登録商標）ＳｕｐｅｒＦｅｔｃｈ）、さらにこれらのフィーチャは、本明細書で説明される変換を実行し、さらにキャッシュするように変更される。このことは、バイナリコードの変換されたバージョンがキャッシュの中で既に利用可能であるので、プロセス実行中に時間を節約する。
【００２０】
コード実行構成要素１４０は、識別されたメモリ内プログラムコードを実行する命令を受け取る。コンポーネント１４０は、オペレーティングシステムのメモリマネージャの一部として、または実行可能ページを、実行可能ページの実行時にわずかに先立ってメモリからＣＰＵキャッシュにロードするＣＰＵコントローラもしくはキャッシュコントローラの内部で動作することが可能である。コード実行構成要素１４０は、コードデータストア１３０からの変換された実行可能コードにアクセスし、さらに変換を元に戻す逆変換構成要素１５０を呼び出すことが可能である。変換されたコードが、コードが変換された時点以来、バッファオーバーランによる悪意のあるコードの注入などによって、変更されている場合、逆変換構成要素１５０は、元のプログラムコードをネイティブドメインオペコードに変換し、さらに悪意のあるコードを、無意味なオペコード、またはエラーを生じさせるオペコードに変換する。
【００２１】
逆変換構成要素１５０は、オペコード変換構成要素１２０の変換を元に戻して、難読化されたドメインの実行可能コードを、プロセッサが実行することができるネイティブドメインの実行可能コードに変換する。逆変換構成要素１５０は、ＣＰＵ内で動作して、ＭＭＵにおいて、オペレーティングシステムの様々な構成要素においてなど、入ってくる命令ストリームを変換することが可能である。逆変換構成要素１５０は、変換プロセスが元に戻されるように元の変換によって使用された乱数または暗号ソルトを受け取ることが可能である。オペコードの排他的論理和スクランブルの事例において、逆変換は、単に同一の演算を再び実行し、さらに出力は、元のオペコードセットである。より高度な実装形態において、オペコード変換構成要素１２０と逆変換構成要素１５０は、公開鍵／秘密鍵ペア、または他の対をなす鍵セットを使用して、オペコードの変換および逆変換を行うことが可能である。
【００２２】
エラー検出構成要素１６０は、実行ストリームの中で誤ったオペコードを検出する。それらのオペコードは、それらのオペコードが無効である、それらのオペコードが特定のコンテキストに合わない、それらのオペコードが、その命令がアクセスを有さないデータにアクセスする（例えば、アクセス違反）、それらのオペコードが割り込みまたはオーバーフローを生じさせるなどの理由で、誤っている可能性がある。逆変換プロセスは、アプリケーションが最初にロードされた後にそのアプリケーションの実行可能空間に入れられた悪意のあるコードが、ランダムなオペコードもしくは無意味なオペコードに変換されるようにする、または違反を生じさせるようにする。通常のプログラムオペコードの正確で、念入りに作られた性質のため、ランダムなオペコードは、何らかのタイプのエラーをすぐに生じさせ、または範囲外である、もしくは無効であるものとして容易に検出可能である。その時点で、エラー検出構成要素１６０は、そのエラーを検出し、さらにアプリケーションプロセスを終了させるなどの適切なアクションを行う。そのエラーを検出することは、誤ったコードをトラップするため、およびデータの損傷を回避するための通常のＣＰＵ機構およびオペレーティングシステム機構を介して行われる。
【００２３】
プロセス選択構成要素１７０は、いずれのプロセスにオペコード変換構成要素１２０を適用して難読化されたオペコードを生成するかを選択する。一部の実施形態において、システム１００は、すべてのプロセスにこの変換を適用することはせず、プロセス選択構成要素１７０が、所与のプロセスが変換を受けるかどうかを決定する。システムは、ユーザまたはオペレーティングシステムベンダから、オペコードを変換すべきプロセスを識別する構成情報を受け取ることが可能である。一部の実施形態において、オペレーティングシステムベンダが、或るプラットフォーム上で実行されることが許されるバイナリコードに署名し、さらに署名のない、または信頼されないバイナリコードを変換にかける一方で、信頼されるコードは、変換にかけられないことが可能である。別の例として、システム１００が、ネットワークと対話するコードに対してだけ、またはネットワークと対話しないコードに対してだけ変換を実行することが可能である。以上、およびその他の変形形態は、適切なレベルのセキュリティおよびパフォーマンスを実現するようにシステム１００と一緒に使用することができる。
【００２４】
オペコード難読化システムが実装されるコンピューティングデバイスは、中央処理装置と、メモリと、入力デバイス（例えば、キーボードおよびポインティングデバイス）と、出力デバイス（例えば、ディスプレイデバイス）と、ストレージデバイス（例えば、ディスクドライブまたは他の不揮発性記憶媒体）とを含む。メモリおよびストレージデバイスは、このシステムを実施する、または可能にするコンピュータ実行可能命令（例えば、ソフトウェア）が符号化されるコンピュータ可読記憶媒体である。さらに、データ構造およびメッセージ構造は、通信リンク上の信号などの、データ伝送媒体を介して格納される、または伝送されることが可能である。インターネット、ローカルエリアネットワーク、ワイドエリアネットワーク、ポイントツーポイントダイヤルアップ接続、セル電話ネットワークなどの様々な通信リンクが使用可能である。
【００２５】
このシステムの実施形態は、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラマブル家庭用電子機器、デジタルカメラ、ネットワークＰＣ、ミニコンピュータ、メインフレームコンピュータ、前述のシステムまたはデバイスのうちのいずれかを含む分散コンピューティング環境、セットトップボックス、システムオンチップ（ＳＯＣ）などを含む様々な動作環境において実施することができる。コンピュータシステムは、セル電話機、携帯情報端末、スマートフォン、パーソナルコンピュータ、プログラマブル家庭用電子機器、デジタルカメラなどとすることができる。
【００２６】
このシステムは、１つまたは複数のコンピュータもしくは他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的な脈絡で説明することができる。一般に、プログラムモジュールには、特定のタスクを実行する、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、構成要素、データ構造などが含まれる。通常、これらのプログラムモジュールの機能は、様々な実施形態において所望されるとおりに組み合わされても、分散されてもよい。
【００２７】
図２は、一実施形態における、アプリケーションコードが、実行に先立って保持されるようにストレージから難読化されたドメインにロードされるにつれ、オペコード難読化システムがアプリケーションコードを変換する処理を示す流れ図である。図２および図３に示されるプロセスは、通常、それらのプロセスの合間にいくらかの時間が経過して、連続的に行われる。この時間中、アプリケーションコードは、悪意のあるハッキングの試みによる介入にアプリケーションがアプリケーションコードが脆弱であるメモリの中に、通常、置かれている。図２に関連して説明される変換プロセスは、元のアプリケーションコードを正常に実行させ、さらに悪意のあるコードに、検出可能なエラーを生じさせる予期しない動作を実行させる正味効果を有することになる図３の逆変換のため、ハッキングの試みを無効にする。
【００２８】
ブロック２１０で始まって、システムが、実行のためにプロセスにロードされるべき１つまたは複数の実行可能モジュールを指定するモジュール実行要求を受け取る。オペレーティングシステムは、通常、実行可能バイナリコードを含む実行可能モジュールに関して、ポータブル実行可能（ＰＥ）フォーマットなどのバイナリモジュールフォーマットを定義する。これらのモジュールは、他のモジュール（例えば、ＰＥイメージのインポートテーブル）を静的に参照することが可能であり、さらに他のモジュールを動的にロードすることが可能である（例えば、ＭＩＣＲＯＳＯＦＴ（登録商標）ＷＩＮ３２（登録商標）プラットフォーム上でＬｏａｄＬｉｂｒａｒｙ／ＧｅｔＰｒｏｃＡｄｄｒｅｓｓを呼び出すことによって）。このようにロードされたバイナリコードは、アプリケーションの実行中にこのプロセスの外でロードされたバイナリコードとの対比で、通常、無害である、またはコード署名などの他の機構によって保護されているものと信頼される。
【００２９】
ブロック２２０に進むと、システムが、指定された実行可能モジュールの中の実行可能コードを識別する。ほとんどの事例において、モジュールのよく知られたフォーマットが、実行可能コードを含むそのモジュールの部分を示す。例えば、ＰＥイメージが、しばしば、モジュール内の実行可能コードのエントリポイントを指定する「．ｔｅｘｔ」セクションまたはヘッダを含む。あらかじめキャッシュされた、またはＪＩＴコンパイルされたコードの場合、コンピュータシステムは、実行可能領域を識別するデバッグシンボルまたは他のメタデータを含むことができる。
【００３０】
ブロック２３０に進むと、システムが、識別された実行可能コードをロードする。オペレーティングシステムローダが、通常、静的にリンクされたモジュールを扱うこと、アドレス空間衝突を回避するバイナリ再配置、命令ストリームの中の絶対アドレスの取り決めなどを含め、実行可能コードをロードすることを扱う。オペコード難読化システムは、実行可能コードのオペコードをネイティブドメインから難読化されたドメインに変換するステップを挿入するようにローダをフックする、または変更する。簡単な例として、このシステムは、各オペコードに０×２０を加えて、０×５５（関数のエントリにおけるｘ８６スタックの一般的なセットアップであるＰＵＳＨ  ＥＢＰ）が０×７５（実行された場合、ＪＮＥ命令である）になるようにすることが可能である。
【００３１】
決定ブロック２４０に進むと、システムが、現在のプロセスがオペコード変換で保護されると決定した場合、システムは、ブロック２６０に進み、保護されないと決定した場合、システムは、ブロック２５０に進む。ブロック２５０に進むと、システムは、ロードされた、変換されていない実行可能コードを通常の実行のために格納する。システムは、メモリの中で、そのコードを、実行のために印が付けられた、前もって割り当てられたページに格納することが可能である。ブロック２５０の後、システムは、完了する。ブロック２６０に進むと、システムは、ロードされた実行可能コードをネイティブドメインから難読化されたドメインに変換する。一部の実施形態において、システムは、実行可能コードを逆アセンブルして各オペコードを識別し、さらに、その後、明確に定義され、元に戻せるが、それでも、悪意のあるコードが予測することが困難なプロセスを使用して、それらのオペコードをスクランブルする。悪意のあるコードは、自らを正しくスクランブルすることができないため、図３に関連して説明される逆スクランブルプロセスが、悪意のあるコードを、悪意のあるコードの当初の目的に関して無害にする。
【００３２】
ブロック２７０に進むと、システムが、変換された実行可能コードを実行に備えて格納する。システムは、実行可能コードを、メインメモリの中に、高速メモリキャッシュの中に、または実行の準備のできたコードが格納される別のロケーションに格納することが可能である。コードを実行する時間が来ると、システムは、図３に関連して説明される変換プロセスを元に戻す。ブロック２７０の後、以上のステップが完了する。
【００３３】
図３は、一実施形態における、オペコード難読化システムが、アプリケーションコードを実行時に、難読化されたドメインからネイティブドメインに逆変換する処理を示す流れ図である。ブロック３１０で始まり、システムが、アプリケーションコードの現在の実行ロケーションを識別する。この識別は、メモリからの実行可能ページが要求されているという通知を受け取ること、ＣＰＵの命令ポインタに従うこと、命令ストリームを前処理するようにＣＰＵ内で動作することなどを含む。システムは、悪意のあるコードが正当なアプリケーションコードに侵入することができる時間枠を小さくするようにオペコードが実行される時点に十分に近くなるまで、メモリの中に格納されたコードのオペコードを逆変換するのを待つ。
【００３４】
ブロック３２０に進むと、システムが、識別された現在の実行ロケーションに基づいて実行されるべきコードの次のバッチを取り出す。このバッチは、メモリページ、関数、次のＮ個のオペコード、またはコードの他のサブセットを含む。例えば、システムは、オペレーティングシステムメモリマネージャ内で動作して、メモリの実行可能ページのアクセスを検出する、またはＣＰＵ内で動作して、実行のために命令ストリームを準備することが可能である。
【００３５】
決定ブロック３３０に進むと、システムは、コードの次のバッチが変換されて難読化されたドメインに入っていると決定した場合、システムは、ブロック３４０に進み、変換されていないと決定した場合、システムは、ブロック３５０に進む。変換されていないコードは、システムがすべてのコードを変換するようにセットアップされているのでない限り、正常に実行することを許される。オペコード難読化システムは、オペレーティングシステムまたはアプリケーションが、いくらかのコードだけが本明細書で説明されるプロセスによってセキュリティ保護されるよう要求することを可能にし、さらにこのシステムは、図２に関連して説明される初期の変換を受けているものとしてコードに印が付けられているかどうかに基づき、プロセスを条件付きで元に戻す。
【００３６】
ブロック３４０に進むと、システムは、コードの取り出されたバッチを難読化されたドメインから、プロセッサによって実行可能なネイティブドメインに逆変換する。例えば、ネイティブドメインが、インテルｘ８６命令セットを含む一方で、難読化されたドメインは、ｘ８６命令セットのランダムな摂動を含むことができる。逆変換することは、それまでに適用された変換に逆操作を適用し、さらに正当なアプリケーションコードの場合、プロセッサによって実行される準備のできたバイナリコードを生成する。元の変換の時点で存在しなかった悪意のあるコードの場合、逆変換プロセスは、１つまたは複数の検出可能なエラーをすぐにもたらすものと予期される予測できないエラーを生じやすいバイナリコードを生成する。決定ブロック３４５に進むと、システムが、逆変換中に違反を検出した場合、システムは、ブロック３７０にジャンプしてプロセスを終了させ、検出しなかった場合、システムは、ブロック３５０に進む。
【００３７】
ブロック３５０に進むと、システムは、逆変換されたコードを実行のためにプロセッサにサブミットする。このコードが通常のアプリケーションコードである場合、このコードは、プログラム作成者によって設計されたとおりに実行されて、何であれこのコードが意図されていた目的を実行する。しかし、このコードが、逆変換プロセスによってスクランブルされた悪意のあるプログラムコードを含む場合、このコードは、いくつかの命令に関して実行されてから、何らかのタイプのエラー（例えば、アクセス違反、範囲エラー、オーバーフローなど）をもたらすことが可能である。
【００３８】
決定ブロック３６０に進むと、システムが、実行エラーを検出した場合、システムは、ブロック３７０に進み、検出しなかった場合、システムは、完了する。この実行エラーは、割り込み、アクセス違反、保護違反などの、プロセッサまたはオペレーティングシステムによってトラップされる１つまたは複数の異常を含むことができる。一部の実施形態において、システムは、ルックアップテーブルを使用して実行可能コードを逆変換する。システムは、無効なオペコードを変換する要求を、よく知られたエラー命令で置き換えることが可能である。ほとんどの命令セットにおいて、使用されないオペコード、廃止されたオペコード、将来の使用のために取って置かれるオペコードなどが存在する。システムは、そのようなコードを、例えば、割り込みに変換して、スクランブルされた悪意のあるコードを実行しようとする試みが、例外、または他の実行を停止させる結果をもたらすことをさらに確実にすることができる。
【００３９】
ブロック３７０に進むと、システムは、アプリケーションコードの実行を停止させる。システムは、ユーザにエラーを表示し、デバッガをアタッチすることを提案し、または自動化されたエラーレポートをさらなる処理のために中央サービスにサブミットすることが可能である。いずれにしても、アプリケーションコードは、アプリケーションコードが侵害を受けた後にそれほど長く実行され続けることはなく、悪意のあるコードが害をなすことができないことを確実にする。ブロック３７０の後、これらのステップは、終了する。
【００４０】
図４は、一実施形態における、オペコード難読化システムの動作中に実行可能コードを含むモジュールの３つの段階を示すブロック図である。第１の段階４１０は、このモジュールのディスク上に格納されたバージョンを示す。このモジュールは、このモジュールを実行するための１つまたは複数の関数４４０または他の実行可能コードを含む。オペコード難読化システムが、このモジュールをメモリにロードして第２の段階４２０をもたらす。この図の網掛けされた領域は、本明細書で説明される技術を使用して変換される、またはスクランブルされる領域を例示する。第２の段階４２０に示されるとおり、関数４５０が、このモジュールがロードされた時点で変換されている。後に、バッファオーバーランまたは他の攻撃ベクトルを介して、悪意のあるコード４６０が、このモジュールに自らを注入している。悪意のあるコード４６０は、このモジュールがロードされた時点で存在していなかったので、悪意のあるコード４６０は、本明細書で説明される技術を使用して変換されていない。第３の段階４３０が、このモジュールを、このモジュールの実行の直前の状態で例示する。このモジュールは、ＣＰＵ内で実行される直前にＣＰＵキャッシュ内、メモリキャッシュ内、または他のロケーションに保持される。システムは、このモジュールの実行可能コードに対する変換プロセスを元に戻して、関数４７０は、元の変換される前の状態に戻っているが、悪意のあるコード４８０は、スクランブルされているという効果を生じている。このモジュールが実行されるにつれ、関数４７０は、正常に機能するが、悪意のあるコード４８０は、１つまたは複数の誤りを含む意図しない結果をもたらす。このようにして、プロセスの実行は、オペコード難読化システムによって、より安全にされる。
【００４１】
図５は、一実施形態における、オペレーションコード難読化システムによって与えられる保護、およびどこで保護が行われるかを示すブロック図である。この図は、メインメモリ５１０と、プリＣＰＵキャッシュ５２０と、ＣＰＵ５３０（１つまたは複数の内部キャッシュ層を有することも可能である）とを含む。図示される実施形態において、このシステムは、コードのオペコードを変換してから、そのコードをメインメモリ５１０にロードし、さらにキャッシュコントローラまたは他のエンティティが、コードがメインメモリ５１０からキャッシュ５２０に移動する際に、それらのオペコードを逆変換する。このため、キャッシュ５２０およびＣＰＵ５３０の周囲に概念的な信頼される領域５４０が存在する。このシステムは、様々な実施形態において、信頼される領域５４０を異なる様態で配置するように実施可能であることに留意されたい。例えば、一部の実施形態において、信頼される領域５４０は、ＣＰＵ５３０を含むが、キャッシュ５２０は含まないことが可能である。
【００４２】
一部の実施形態において、オペコード難読化システムは、オペコードだけでなくデータも変換する。一部の命令セットは、他の命令セットと比べて、オペコードを識別することをより困難にする。例えば、複合命令セットアーキテクチャ（ＣＩＳＣ）は、しばしば、可変長のオペコードを含み、したがって、逆アセンブリなしに、或るコードがどこで止まり、別のコードがどこで始まるかを見分けるのは困難である。そのような事例において、システムは、ジャンプアドレス、オペランド値などの任意のデータを含め、命令ストリーム全体を変換することを選択することが可能である。データは、逆変換プロセスによって元に戻るように変換されるので、潜在的にさらなる時間がかかることを除いて、データも変換することに全く害はない。しかし、値をマッピングすることは、比較的高速の動作である。
【００４３】
一部の実施形態において、オペコード難読化システムは、様々なレベルに逆変換段階を配置することができる。例えば、逆変換は、メインメモリ内で、ＭＭＵ内で、Ｌ２キャッシュ内で、Ｌ１キャッシュ内で、またはＣＰＵ自体の中で行われることも可能である。一般に、変換が行われるのが、より後期で、よりＣＰＵの近くであるほど、プロセスは、より強いセキュリティで保護される、しかし、より後期の段の変換には、高価である、変更されたＣＰＵなどのハードウェア変更も伴う。同様に、順方向変換も、ディスク上で、ロード中に、メインメモリ内でなど、様々な段階で行うことが可能である。一般に、変換が行われてから、アプリケーションコードは、実行を待ってメモリの中に置かれる。
【００４４】
以上のことから、オペコード難読化システムの特定の実施形態が、例示の目的で本明細書で説明されてきたが、本発明の趣旨および範囲を逸脱することなく、様々な変形が可能であることが認識されよう。したがって、本発明は、添付の特許請求の範囲による以外に限定されない。
【図１】
2014503901.tif 000003
【図２】
2014503901.tif 000004
【図３】
2014503901.tif 000005
【図４】
2014503901.tif 000006
【図５】
2014503901.tif 000007
【国際調査報告】
2014503901.tif 000008
2014503901.tif 000009