(57)【要約】【課題】カーネルモードコンポーネントによってビルドされた非同期プロシージャコール（ＡＰＣ）に基づき、カーネルモードコンポーネントと関連付けられたユーザモードコンポーネントをローディングするための技術を提供する。【解決手段】ユーザモードプロセスをロードする間、ユーザモードプロセスにユーザモードコンポーネントをロードさせるためにＡＰＣが提供される。ＡＰＣはまた、ユーザモードプロセスの位置に隣接した位置でメモリを割り当て、命令を記憶する。ユーザモードコンポーネントは割当済のメモリへジャンプするために命令を修正し、ユーザモードプロセスの関数をアトミックにフックする。修正済の命令が実行されてジャンプした時、命令はユーザモードコンポーネントのローディングをリクエストする。ユーザモードコンポーネントはフックされた関数からデータを受け取り、カーネルモードコンポーネントにそのデータを提供する。【選択図】図１
2017033552.tif 000002
【特許請求の範囲】
【請求項１】
システムであって、
プロセッサと、
前記プロセッサに結合されたメモリと、
前記システムによってユーザモードプロセスのローディングの通知を受け取るため、前記ユーザモードプロセスのメインスレッドによって実行される非同期プロシージャコール（ＡＰＣ）をビルドするため、および前記ＡＰＣを、前記ユーザモードプロセスの前記メインスレッドの待ち行列に入れるために、前記プロセッサによって操作されるように構成されたカーネルモードコンポーネントと、
前記カーネルモードコンポーネントと関連付けられ、前記ユーザモードプロセスの関数をアトミックにフックするために前記プロセッサによって操作されるように構成されたユーザモードコンポーネントと、
を備えた前記システムであって、
前記ＡＰＣは、
前記ユーザモードプロセスに隣接した位置において前記メモリの一部を割り当てるため、および前記割り当てられた一部において前記ユーザモードコンポーネントのローディングをリクエストするための命令を格納するための命令を呼び出すカーネルルーチンと、
前記ユーザモードコンポーネントのローディングをリクエストするための命令を呼び出すユーザルーチンと、
を含み、
前記ユーザモードコンポーネントは、ロードされたときに前記ユーザルーチンに応じて、前記ユーザモードプロセスに隣接した前記位置へジャンプするように前記関数と関連付けられた単独の命令またはマシンサイズの命令のセットを修正することによって、前記関数をアトミックにフックし、
前記関数の前記単独の命令またはマシンサイズの命令のセットは、実行されたとき、前記ジャンプを行い、前記ユーザモードコンポーネントをローディングし、前記関数と関連付けられたデータを受け取り、および前記カーネルモードコンポーネントにそのデータを提供する
ことを特徴とするシステム。
【請求項２】
前記関数は、ユーザモードメモリ割り当て、ユーザモードにおけるスレッドコンテキスト設定、またはカーネルモードからフックされ得ない任意のシステムコールの一つと関連付けられたことを特徴とする請求項１に記載のシステム。
【請求項３】
前記関数は、３２−ｂｉｔデバイス上の前記ユーザモードプロセスの３２−ｂｉｔシステムライブラリコンポーネント、または６４−ｂｉｔデバイス上の前記ユーザモードプロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数であることを特徴とする請求項１に記載のシステム。
【請求項４】
コンピュータによって実施される方法であって、
フックされるプロセスの関数を識別するステップと、
メモリにおいて前記プロセスに隣接した位置に命令を記憶するステップと、
メモリにおいて前記プロセスに隣接した前記位置へジャンプするため、前記命令の実行を引き起こすために、前記関数と関連付けられた単独の命令または命令のセットを修正することを含む、前記関数をアトミックにフックするステップと、
を備え、
前記命令は、実行されたとき、前記関数と関連付けられたデータを受け取るためにコンポーネントのローディングをリクエストすることを特徴とする方法。
【請求項５】
前記プロセスのローディングの通知を受け取るステップと、
前記通知に応じて、前記識別するステップ、前記記憶するステップ、および前記アトミックなフックをするステップを行うステップと、
をさらに備えることを特徴とする請求項４に記載のコンピュータによって実施される方法。
【請求項６】
前記識別するステップおよび前記記憶するステップは、カーネルモードコンポーネントによって行われ、前記アトミックなフックをするステップは、前記コンポーネントによって行われ、前記コンポーネントは前記カーネルモードコンポーネントと関連付けられたユーザモードコンポーネントであることを特徴とする請求項４に記載のコンピュータによって実施される方法。
【請求項７】
前記コンポーネントは、前記カーネルモードコンポーネントに前記データを提供することを特徴とする請求項６に記載のコンピュータによって実施される方法。
【請求項８】
アンローディングすると、前記コンポーネントによって元の命令にリストアするステップをさらに備えることを特徴とする請求項７に記載のコンピュータによって実施される方法。
【請求項９】
前記カーネルモードコンポーネントは、非同期プロシージャコール（ＡＰＣ）をビルドし、前記ＡＰＣは、
前記位置において前記メモリの一部を割り当てるための命令を呼び出し、前記記憶するステップを行うための命令を呼び出すカーネルルーチンと、
前記アトミックなフックをするステップを行うために前記コンポーネントのローディングをリクエストするための命令を呼び出すユーザルーチンと、
を含むことを特徴とする請求項６に記載のコンピュータによって実施される方法。
【請求項１０】
前記単独の命令または前記命令のセットは、８バイトであり、前記アトミックなフックをするステップを行うためにプロセッサのアトミックな比較およびスワップメカニズムを使用することを可能にされることを特徴とする請求項４に記載のコンピュータによって実施される方法。
【請求項１１】
前記位置は、オフセットを指定するために使用される前記８バイトの量に基づいて決定された範囲内であることを特徴とする請求項１０に記載のコンピュータによって実施される方法。
【請求項１２】
前記位置と関連付けられた前記命令は、前記コンポーネントのローディングをリクエストするサンクであることを特徴とする請求項４に記載の方法。
【請求項１３】
前記関数は、３２−ｂｉｔデバイス上の前記プロセスの３２−ｂｉｔシステムライブラリコンポーネント、または６４−ｂｉｔデバイス上の前記プロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数であることを特徴とする請求項４に記載のコンピュータによって実施される方法。
【請求項１４】
カーネルモードコンポーネントの複数のプログラミング命令を有しており、記憶した非一時的なコンピュータ可読媒体であって、コンピューティングデバイスによって実行されたとき、
ユーザモードプロセスをロードするために、前記カーネルモードコンポーネントによってリクエストの通知を受け取るステップと、
ローディングの間、前記ユーザモードプロセスによって実行される非同期プロシージャコール（ＡＰＣ）を、前記カーネルモードコンポーネントによってビルドするステップと、
前記ＡＰＣが、ユーザモードコンポーネントをローディングするための命令を呼び出すステップと、
前記ユーザモードプロセスの関数をフックするために前記ユーザモードコンポーネントを使用可能にするステップと、
前記カーネルモードコンポーネントによって、前記ＡＰＣを前記ユーザモードプロセスに提供するステップと、
を備える操作を前記コンピューティングデバイスに行わせる、非一時的なコンピュータ可読媒体。
【請求項１５】
前記受け取るステップは、前記コンピューティングデバイスのオペレーティングシステムカーネルのコールバックインタフェースから前記通知を受け取るステップを備えることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【請求項１６】
前記提供するステップのタイミングは、前記ユーザモードプロセスの前記ローディングにおいて指定された段階に設定されることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【請求項１７】
前記ユーザモードコンポーネントは、既知のライブラリコンポーネントのリストに含まれ、前記ＡＰＣのユーザルーチンを通じて呼び出されることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【請求項１８】
前記操作は、前記ユーザモードコンポーネントから、前記フックされた関数と関連付けられたデータを、前記カーネルモードコンポーネントによって受け取るステップをさらに備えることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【請求項１９】
前記ビルドするステップ、および前記提供するステップは、前記ユーザモードプロセスの複数の関数に対して繰り返されることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【請求項２０】
前記関数は、３２−ｂｉｔデバイス上の前記ユーザモードプロセスの３２−ｂｉｔシステムライブラリコンポーネント、または６４−ｂｉｔデバイス上の前記ユーザモードプロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数であることを特徴とする請求項１４に記載の非一時的なコンピュータ可読媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本願は、ユーザモードコンポーネントインジェクションとアトミックなフックに関する。
【背景技術】
【０００２】
日常生活のさらに大きい部分を占めるインターネット利用に伴い、システムリソース、データおよび個人情報を盗み、または破壊するセキュリティエクスプロイトは、増加しつつある問題である。政府および企業は、これらのセキュリティエクスプロイトに関連する侵入および窃盗を防止することにかなりの資源を投じている。セキュリティエクスプロイトは、コンピュータウィルス、ワーム、トロイの木馬、スパイウェア、キーストロークロガー、アドウェアおよびルートキット等の多数の形態で現れる。これらのエクスプロイトは、スピアフィッシュ電子メール、クリック可能リンク、文書、実行可能ファイルまたはアーカイブ等の、いくつかのメカニズムにおいて、またはいくつかのメカニズムを通じてもたらされる。セキュリティエクスプロイトによって突きつけられる脅威のいくつかは、サイバーテロリズムまたは産業スパイ活動と言われるほど深刻である。
【０００３】
そのような脅威に対処することを支援するために、アンチウイルスソフトウェアのベンダーはしばしば、監視対象デバイスのオペレーティングシステムにフックを登録するか、または監視対象デバイスのプロセスにより実行されるシステムライブラリコンポーネント（例えば、ＷｉｎｄｏｗｓオペレーティングシステムにおけるＮＴＤＬＬコンポーネント、またはＵＮＩＸシステム上のｇｌｉｂｃコンポーネント）をフックすることになる。しかしながら、アンチウイルスソフトウェアのベンダーは、典型的にユーザモードで操作し、それらのプロセスがロードされるまで、プロセスにより実行されるコンポーネントをフックできない。この遅延は、セキュリティエクスプロイトにそれら自身をそのようなプロセスの中に入り込ませる機会を提供し、アンチウイルスソフトウェアによる検出に対して堅牢にする。さらに、例えば３２−ｂｉｔオペレーティングシステムから６４−ｂｉｔオペレーティングシステムへの進歩等のオペレーティングシステムにおける進歩は、例えばシステムカーネルモードコンポーネントの６４−ｂｉｔ版等のいくつかのコンポーネントの関数をフックすることのアンチウイルスソフトウェアの能力を妨害する場合がある。
【０００４】
プロセスをフックすることはまた、困難を含むこともできる。プロセスをフックしているコンポーネントは、レースコンディションに対処しなければならない場合があり、そのようなプロセスにおいて関数を安全にフックするためにスレッドサスペンション技術を使用することを要求される場合がある。
【図面の簡単な説明】
【０００５】
詳細な説明は、添付図面を参照して示される。図において、参照番号の一番左の数字は、その参照番号が最初に現れる図を識別する。異なる図における同一の参照番号の使用は、同様または同一の項目または特徴を示す。
【図１】複数の実行可能なコンポーネント、およびメモリにおけるコンポーネントの記憶位置の概観を例示する図である。複数の実行可能なコンポーネントはカーネルモードコンポーネント、ユーザモードコンポーネント、およびユーザモードプロセスを含み、カーネルモードコンポーネントは、ユーザモードプロセスにユーザモードコンポーネントをロードさせ、ユーザモードプロセスにおいて特定のコンポーネントに隣接したメモリを割り当てるように構成されており、隣接したメモリは、ユーザモードコンポーネントがユーザモードプロセスをアトミックにフックすることを可能にする。
【図２】ユーザモードプロセスをフックするためのユーザモードコンポーネントをインジェクトすることができるカーネルモードコンポーネントを伴って構成されたコンピューティングデバイスのコンポーネントレベルビューを例示する図である。
【図３】非同期プロシージャコール（ＡＰＣ）を通じてユーザモードコンポーネントをインジェクトするカーネルモードコンポーネントの例示的プロセスを例示する図である。ユーザモードコンポーネントはユーザモードプロセスの関数をアトミックにフックする。
【図４】ユーザモードプロセスの関数と関連付けられたデータを、その関数のアトミックなフックを通じて受け取り、およびフックされたデータをカーネルモードコンポーネントに提供するユーザモードコンポーネントの例示的プロセスを示す図である。
【図５】ユーザモードプロセスの関数をアトミックにフックするための例示的プロセスを示す図である。
【図６】ＡＰＣを通じてユーザモードコンポーネントをインジェクトするカーネルモードコンポーネントの例示的プロセスを示す図である。
【発明を実施するための形態】
【０００６】
この開示は、部分的に、ユーザモードプロセスのコンポーネントをアトミックにフックし、そのフックと関連付けられたデータをカーネルモードコンポーネントに提供するユーザモードコンポーネントをインジェクトするカーネルモードコンポーネントのための技術を説明する。ユーザモードコンポーネントによってアトミックにフックされたコンポーネントは、ユーザモードプロセスによってインスタンス化された、例えばＷｉｎｄｏｗｓオペレーティングシステム上のＮＴＤＬＬコンポーネントのような６４−ｂｉｔローダ／初期化ライブラリ等のシステムライブラリコンポーネントとすることができる。インジェクションは、非同期プロシージャコール（ＡＰＣ）をビルドして、ユーザモードプロセス実行を引き起こすために、ＡＰＣをオペレーティングシステムのディスパッチャに提供しているカーネルモードコンポーネントを含むことができる。実行されたとき、ＡＰＣのユーザルーチンは、ユーザモードコンポーネントをロードするユーザモードプロセスのローダをリクエストするユーザモードローダライブラリコンポーネントの命令を呼び出す。ユーザモードコンポーネントは、単独の命令を備えているバイトのサブセットを補うように指定されたメモリにおいて位置へジャンプするために、コンポーネントの関数において、単独のマシン語サイズの命令またはマシン語を作り上げる命令のセット（例えば、６４−ｂｉｔマシン上の８バイト命令）を修正することによって、ユーザモードプロセスのコンポーネントをアトミックにフックすることができる。位置においてメモリは、ＡＰＣのカーネルルーチンによって割り当てられることができ、それはまた、位置において命令（例えば、サンク）を記憶することもできる。修正された命令が位置へジャンプすると、位置における命令は順にユーザモードコンポーネントへジャンプし、そしてそれはフックと関連付けられたデータ（例えば、関数の引数）を受け取り、そのデータをカーネルモードコンポーネントに提供する。このように、ユーザモードコンポーネントインジェクションおよびアトミックなフックは、カーネルモードコンポーネントがユーザモードプロセスのコンポーネントをフックすることを効果的に可能にする。そのようなフックをすることは、カーネルモードコンポーネントが、ユーザモードメモリ割り当てについての情報、ユーザモードにおいてスレッドコンテキストを設定するアクタ、またはカーネルモード範囲内から直接にフックされ得ない任意のシステムコールを得ることを可能にすることができる。
【０００７】
ここに使用されるように、“ＡＰＣ”はＡＰＣ群、Ｕｎｉｘ  ＯＳで使用される信号、またはカーネルモードにおいてビルドされた任意の関数ポインタもしくはポインタ群に言及することができ、およびユーザモードプロセスまたは実行のためのスレッドに提供され得る。
【０００８】
例示的環境
図１は、複数の実行可能なコンポーネント、およびメモリにおけるコンポーネントの記憶位置の概観を例示する。複数の実行可能なコンポーネントはカーネルモードコンポーネント、ユーザモードコンポーネント、およびユーザモードプロセスを含み、カーネルモードコンポーネントは、ユーザモードプロセスにユーザモードコンポーネントをロードさせ、ユーザモードプロセスにおいて特定のコンポーネントに隣接したメモリを割り当てるように構成されており、隣接したメモリは、ユーザモードコンポーネントがユーザモードプロセスをアトミックにフックすることを可能にする。例示されたように、例えばオペレーティングシステム（ＯＳ）カーネル１０４およびカーネルモードコンポーネント１０６等の複数のコンポーネントは、コンピューティングデバイスのカーネルモード１０２において動作することができる。例えばプロセス１１０およびユーザモードコンポーネント１１２等の複数のコンポーネントはまた、コンピューティングデバイスのユーザモード１０８において動作することもできる。コンピューティングデバイスのメモリ１１４はまた、例えばプロセス１１０のプロセスコンポーネント１１６等の、１つまたは複数のそのようなコンポーネントを記憶することもできる。プロセスコンポーネント１１６は、例えば単独の命令１１８等の、異なる命令とともに１つまたは複数の関数を含むことができる。また、メモリ１１４においてプロセスコンポーネント１１６に隣接し、割り当てられたメモリ１２０の一部はサンク１２２を記憶することができる。
【０００９】
図１でさらに例示されるように、ＯＳカーネル１０４は、１２４で、プロセス１１０のためのロードリクエストを受け取ることができる。カーネルモードコンポーネント１０６は次いで、１２６で、ＯＳカーネル１０４からロードリクエストの通知を受け取り、ＡＰＣをビルドし、１２８で、ＡＰＣを実行のためのプロセス１１０のメインスレッドの待ち行列に入れる。実行されたとき、ＡＰＣはメモリ１２０を割り当てる命令を呼び出し、メモリ１２０にサンク１２２を記憶し、１３０で、ユーザモードコンポーネント１１２をロードする。ユーザモードコンポーネント１１２は次いで、１３２で、単独の命令または命令のセットをアトミックにフックし、命令１１８を置換している。その単独の命令１１８が修正の後で次に実行されるとき、１３４で、それは割り当てられたメモリへジャンプし、サンク１２２の実行を引き起こしている。サンク１２２は次いで、ユーザモードコンポーネント１１２へジャンプするか、または、１３６で、ユーザモードコンポーネント１１２のローディングをリクエストし、そしてそれはフックされた単独の命令１１８と関連付けられた関数からデータを受け取る。ユーザコンポーネント１１２は次いで、１３８で、カーネルモードコンポーネント１０６にフックされたデータを提供する。
【００１０】
様々な実施形態において、コンピューティングデバイスは、ＯＳカーネル１０４、カーネルモードコンポーネント１０６、プロセス１１０、ユーザモードコンポーネント１１２、およびメモリ１１４を含むことができる。そのようなコンピューティングデバイスは、サーバもしくはサーバファーム、分散された複数のサーバファーム、メインフレーム、ワークステーション、パーソナルコンピュータ（ＰＣ）、ラップトップコンピュータ、タブレットコンピュータ、携帯情報端末（ＰＤＡ）、携帯電話、メディアセンタ、組込みシステムまたは他の任意の種類のデバイスもしくはデバイス群とすることができる。複数のコンピューティングデバイス上で実施されるとき、ＯＳカーネル１０４、カーネルモードコンポーネント１０６、プロセス１１０、ユーザモードコンポーネント１１２、およびメモリ１１４は複数のコンピューティングデバイスの間で分散されてもよい。いくつかの実施例において、コンピューティングデバイスは、１つまたは複数のコンピューティングデバイス上で実施された１つまたは複数の仮想マシンを表す。ＯＳカーネル１０４、カーネルモードコンポーネント１０６、プロセス１１０、ユーザモードコンポーネント１１２、およびメモリ１１４を含むコンピューティングデバイスの例は、図２で例示され、その図に関して以下に記述される。
【００１１】
ＯＳカーネル１０４は、例えばＷｉｎｄｏｗｓ（登録商標）  ＯＳ、Ｕｎｉｘ  ＯＳ、または他の任意の種類のＯＳ等の、任意の種類のＯＳのカーネルとすることができる。そのようなＯＳは６４−ｂｉｔ  ＯＳまたはより大きくすることができ、３２−ｂｉｔプロセスと、例えばＷｉｎｄｏｗｓオペレーティングシステム上の６４−ｂｉｔ  ＮＴＤＬＬコンポーネント等の６４−ｂｉｔライブラリローダコンポーネントを伴う６４−ｂｉｔプロセスのいずれもサポートすることができる。ＯＳカーネル１０４は、例えばプロセス１１０等の、ローディングおよびアンローディングコンポーネントのためのロードおよびアンロード関数を有することができる。ＯＳカーネル１０４はまた、例えば既知のライブラリコンポーネント(例えば、既知のダイナミックリンクライブラリ（ＤＬＬ）)のリスト等の、いくつかのコンピューティングデバイスリストを含む。
【００１２】
カーネルモードコンポーネント１０６は、カーネルレベルセキュリティエージェントのコンポーネントとすることができ、そしてそれはコンピューティングデバイス上の活動を監視および記録することができ、活動を分析することができ、警報とイベントを生成し、それらの警報とイベントをリモートセキュリティサービスに提供することができる。カーネルレベルセキュリティエージェントは、リモートセキュリティサービスによってインストールされ、構成可能とすることができ、動作中、カーネルモードコンポーネント１０６とカーネルレベルセキュリティエージェントの他のコンポーネントの再構成を受け取り、適用している。カーネルモードコンポーネント１０６は、カーネルレベルセキュリティエージェントのアーキテクチャ内でアクタコンポーネントとすることができ、カーネルレベルセキュリティエージェントのアーキテクチャのイベントソースを介してプロセス１１０をロードするリクエストの通知を受け取ることができ、そしてそれはＯＳカーネル１０４のコールバックインタフェースに登録することができる。カーネルレベルセキュリティエージェントの例は、“Ｋｅｒｎｅｌ−Ｌｅｖｅｌ  Ｓｅｃｕｒｉｔｙ  Ａｇｅｎｔ”と題され、２０１２年６月８日に出願された米国特許出願第１３／４９２，６７２号により詳細に記述されており、そしてそれは２０１５年５月２６日に特許番号が発行されている。さらにここで記述されるように、カーネルモードコンポーネント１０６はプロセス１１０をロードするリクエストの通知を受け取り、ＡＰＣをビルドし、ＡＰＣをプロセス１１０のメインスレッドの待ち行列に入れ、ユーザモードコンポーネント１１２からフックされたデータを受け取る。
【００１３】
いくつかの実施例において、プロセス１１０は、例えばアプリケーションまたはユーザモードプラットフォームコンポーネント等の、コンピューティングデバイスのユーザモードプロセスの任意の種類とすることができる。プロセス１１０は、例えばメモリ割り当てまたはスレッドコンテキストの設定等の、様々なシステムコールを含む、様々な操作を行うことができる。プロセス１１０はまた、システムコールを実行する目的のために１つまたは複数のシステムライブラリコンポーネントをインスタンス化することもできる。例えば、プロセス１１０が６４−ｂｉｔプロセスである場合、プロセス１１０は、Ｗｉｎｄｏｗｓオペレーティングシステム上の６４−ｂｉｔ  ＮＴＤＬＬをインスタンス化することができる。プロセスが３２−ｂｉｔプロセスである場合、プロセス１１０は、３２−ｂｉｔシステムコールライブラリと６４−ｂｉｔシステムコールライブラリの両方をインスタンス化することができる。プロセスコンポーネント１１６は、例えばＷｉｎｄｏｗｓオペレーティングシステム上の６４−ｂｉｔ  ＮＴＤＬＬ等の、例えばシステムライブラリコンポーネント等の例とすることができる。プロセスコンポーネント１１６は、例えばユーザモードメモリ割り当てを実行するための関数等の、１つまたは複数の関数を有することができる。これらの関数は、例えば単独の命令１１８またはマシン語（例えば、８バイト命令）を作り上げる命令のセット等の命令から構成され得る。プロセス１１０はまた、ローディングの間、保留中のＡＰＣ配送をリクエストするよう、およびオペレーティングシステムにそれらのＡＰＣを実行させるように構成され得る。
【００１４】
様々な実施例において、ユーザモードコンポーネント１１２は、カーネルモードコンポーネント１０６と関連付けられた任意の種類のコンポーネントとすることができる。例えば、ユーザモードコンポーネント１１２は、例えばＤＬＬ等のライブラリコンポーネントとすることができ、例えばプロセス１１０等のユーザモードプロセスのローダによるローディングのために構成され得る。ユーザモードコンポーネント１１２は、メモリ１１４のどこにでも記憶され得る。ユーザモードコンポーネント１１２はまた、名前と関連付けられることができ、カーネルモードコンポーネント１０６は、そのユーザモードコンポーネント１１２の名前を、ＯＳカーネル１０４によって維持されたライブラリコンポーネント（例えば、Ｗｉｎｄｏｗｓ上の既知のＤＬＬ）のリストに加えることができる。ここにさらに言及されるように、ユーザモードコンポーネント１１２はプロセスコンポーネント１１６の関数をアトミックにフックし、フックされたデータを受け取り、フックされたデータをカーネルモードコンポーネント１０６に提供し、単独の命令１１８をそれの修正前の（マシン語を備える１つまたは複数の命令の）状態にリストアすることができる。
【００１５】
割り当てられたメモリ１２０を含むメモリ１１４は、メモリデバイスの任意の種類のメモリとすることができる。メモリはかなり大きなアドレス空間（例えば、１２８テラバイト）を有することができる。メモリ１１４の例は、図２で例示され、その図に関して以下に詳細に記述される。
【００１６】
いくつかの実施例において、サンク１２２は、ユーザモードコンポーネント１１２へリダイレクトし、ユーザモードコンポーネント１１２を呼び出し、またはユーザモードコンポーネント１１２のローディングをリクエストする命令の任意のセットとすることができる。
【００１７】
様々な実施例において、ＯＳカーネル１０４は、１２４で、コンピューティングデバイスのプロセスまたはコンポーネントからプロセス１１０をロードするロードリクエストを受け取ることができる。１２４で、ロードリクエストを受け取ると、ＯＳカーネル１０４はプロセス１１０をロードし始め、ＯＳカーネル１０４のコールバックインタフェースを介して、そのコールバックインタフェースに登録された任意のプロセスまたはコンポーネントに通知を提供することができる。上記のように、カーネルモードコンポーネント１０６は、１２６で、ユーザモードプロセスのローディングのためのロードリクエストの通知を受け取るために、ＯＳカーネル１０４のコールバックインタフェースに登録され得る。このように、カーネルモードコンポーネント１０６は、１２６で、ローディングプロセス１１０のためのロードリクエストの通知を受け取ることができる。
【００１８】
１２６で、通知を受け取ると、カーネルモードコンポーネント１０６は、プロセス１１０のメインスレッドにおいて実行するためにＡＰＣをビルドすることができる。このＡＰＣは関数およびプロセスコンポーネント１１６をフックすることができる。選択された関数およびプロセスコンポーネント１１６は、カーネルモードコンポーネント１０６の設定によって指定され、または、例えば機械学習技術によって決定され得る。関数ごとに、アトミックにフックされるようになる単独の命令またはマシン語サイズの命令のセットは、識別され得る。また、そのような命令の識別は、カーネルモードコンポーネント１０６の設定を介して、または機械学習技術を介して遂行され得る。カーネルモードコンポーネント１０６は次いで、メモリ１１４においてこれらの関数の位置を識別する。
【００１９】
例えばプロセスコンポーネント１１６等の、所定のプロセスコンポーネントでメインスレッドのためのＡＰＣをビルドすることにおいて、カーネルモードコンポーネント１０６は、ＡＰＣのカーネルルーチンを指定することができる。カーネルルーチンはメモリ１２０を割り当てるためのカーネルモードコンポーネント１０６の命令を呼び出すことができる。割り当てられたメモリ１２０は、決定された所定の関数の記憶位置からの範囲内（例えば、２ギガバイト範囲内）とすることができ、その範囲はオフセットを指定することにおいて利用される所定の関数の単独の命令１１８のバイト数によって決定される。カーネルルーチンはさらに、割り当てられたメモリ１２０において、例えばサンク１２２等の命令を記憶するカーネルモードコンポーネント１０６の命令を呼び出すことができる。
【００２０】
ＡＰＣのカーネルルーチンを指定することに加えて、カーネルモードコンポーネント１０６はユーザルーチンを指定することができる。プロセス１１０内部のＯＳカーネルＡＰＣディスパッチャによって実行されるとき、ユーザルーチンはユーザモードコンポーネント１１２のローディングをリクエストするためのユーザモードシステムライブラリローダの命令を呼び出すことができる。
【００２１】
いくつかの実施例において、ＡＰＣをビルドすることの後、カーネルモードコンポーネント１０６は、１２８で、ＯＳカーネル１０４を介して、ＡＰＣをプロセス１１０のメインスレッドの待ち行列に入れることができる。ローディングの間、プロセス１１０においてユーザモードローダライブラリコンポーネントは、いくらか保留中のＡＰＣがあるかどうか、ＯＳカーネル１０４に尋ねることができ、カーネルモードコンポーネント１０６によってビルドされたＡＰＣを受け取ることができる。ＡＰＣを受け取ると、ＯＳカーネル１０４は、プロセス１１０内部のＡＰＣのカーネルルーチンおよびユーザルーチンを実行することができる。様々な実施例において、カーネルモードコンポーネント１０６は、ＡＰＣが提供される時、またはＡＰＣのカーネルルーチンおよびユーザルーチンを実行する方法を制御することによって、カーネルモードコンポーネント１０６の設定により指定された異なるセキュリティ方針を遂行することができる。いくつかの実施例において、ＡＰＣはプロセス１１０のローディングにおいて異なる時間で提供され得る。
【００２２】
ＡＰＣを受け取ると、ユーザモードプロセス１１０のメインスレッドは、最初にカーネルルーチンを実行し、次いでユーザルーチンを実行するＡＰＣを実行することができる。言及されたように、カーネルルーチンはカーネルモードコンポーネント１０６の命令を呼び出し、それはメモリ１２０を割り当て、サンク１２２をその割り当てられたメモリに記憶する。ユーザルーチンはユーザモードローダコンポーネントの命令を呼び出し、そしてそれはユーザモードプロセス１１０のローダがユーザモードコンポーネント１１２をロードするようにリクエストする。そのロードリクエストを受け取ると、ユーザモードプロセス１１０のローダはユーザモードコンポーネント１１２をロードする。様々な実施例において、ユーザルーチンはそれの名前によってユーザモードコンポーネント１１２を簡単に識別することができ、識別に遭遇すると、ユーザモードコンポーネント１１２が既知のＤＬＬのリストに含まれる既知のＤＬＬであるかどうかを判定するためにチェックが行われる。カーネルモードコンポーネント１０６は、既知のＤＬＬのリストにユーザモードコンポーネント１１２が予め加えられたことになるため、答えは肯定的となり、ユーザモードローダコンポーネントはユーザモードコンポーネント１１２をロードすることができる。ユーザモードプロセス１１０においてスレッドは、受け取られたＡＰＣごとにＡＰＣ実行を繰り返すことができる。
【００２３】
様々な実施例において、ロードされたとき、ユーザモードコンポーネント１１２は、１３２で、１つまたは複数の関数のそれぞれのためのマシン語１１８を作り上げる単独の命令または命令のセットを修正することによって、プロセスコンポーネント１１６の１つまたは複数の関数をアトミックにフックする。単独または複数の命令１１８は合計で正確に８バイトになることができ、修正は８バイトの全てをジャンプコマンドおよびオフセットと置換することで構成することができる。例えば、命令１１８においてオフセットのために４バイトが使用される場合、ジャンプはその命令１１８の位置の２ギガバイト以内の記憶位置とすることができる。置換されたバイトは、ユーザモードコンポーネント１１２によって、復元を可能にするために記憶され得る。命令１１８ごとのオフセットは、カーネルモードコンポーネント１０６によって決定されることができ、その命令１１８と関連付けられた割り当てられたメモリ１２０と対応付けることができる。命令１１８を修正するために、ユーザモードコンポーネント１１２は、コンピューティングデバイスのプロセッサのアトミックな比較およびスワップメカニズムを利用して、命令１１８とカーネルモードコンポーネントによって識別された命令とをマッチさせて検証し、および命令の同時修正を防止することができる。
【００２４】
いくつかの実施例において、ユーザモードプロセス１１０のローディングに続いて、ユーザモードプロセス１１０を実行することができる。実行している間、ユーザモードプロセス１１０は、プロセスコンポーネント１１６の修正された命令１１８を呼び出すことができる。１３４で、修正された命令は、指定されたオフセットに基づく割り当てられたメモリ１２０へのジャンプを行う。割り当てられたメモリ１２０へジャンプすると、割り当てられたメモリ１２０に記憶されたサンク１２２が実行される。
【００２５】
ユーザモードコンポーネント１１２は、サンク１２２によって呼び出され、またはサンク１２２のリクエストでロードされると、１３６で、フックされた関数と関連付けられたデータを受け取る。データを受け取ると、ユーザモードコンポーネント１１２は、１３８で、更なる処理のためにカーネルモードコンポーネント１０６にデータを提供することができる。
【００２６】
様々な実施例において、ユーザモードコンポーネント１１２は、ユーザモードコンポーネント１１２をアンローディングしているときに、命令１１８をそれの元の状態にリストアすることができる。
【００２７】
例示的システム
図２は、ユーザモードプロセスをフックするためのユーザモードコンポーネントをインジェクトすることができるカーネルモードコンポーネントを伴って構成されたコンピューティングデバイスのコンポーネントレベルビューを例示する。例示されたように、コンピューティングデバイス２００は、ＯＳカーネル２０４、カーネルモードコンポーネント２０６、アトミックなフック２１０を受け取るために関数を伴うユーザモードプロセス２０８、サンク２１２、およびユーザモードコンポーネント２１４を記憶しているメモリ２０２から成る。また、コンピューティングデバイス２００は、プロセッサ２１６、取り外し可能な記憶装置２１８と取り外し不可能な記憶装置２２０、入力デバイス２２２、出力デバイス２２４、および他のコンピューティングデバイス２２８との通信のための通信接続２２６を含む。
【００２８】
様々な実施形態において、メモリ２０２は揮発性（例えば、ＲＡＭ等）、不揮発性（例えば、ＲＯＭ、フラッシュメモリ、等）またはそれらのいくつかの組み合わせである。ＯＳカーネル２０４は、例えば図１に関して詳細に上述されたＯＳカーネル１０４等のＯＳの任意の種類のカーネルとすることができる。カーネルモードコンポーネント２０６は、図１に関して詳細に上述されたカーネルモードコンポーネント１０６の例とすることができる。ユーザモードプロセス２０８は、図１に関して詳細に上述されたプロセス１１０の例とすることができる。アトミックなフック２１０は、図１に関して詳細に上述された、ユーザモードコンポーネント１１２によって、１３２でアトミックにフックされたようにマシン語１１８を作り上げる単独の命令または命令のセットの例とすることができる。サンク２１２は、図１に関して詳細に上述されたサンク１２２の例とすることができる。ユーザモードコンポーネント２１４は、図１に関して詳細に上述されたユーザモードコンポーネント１１２の例とすることができる。
【００２９】
いくつかの実施形態において、プロセッサ２１６は中央演算処理装置（ＣＰＵ）、グラフィックスプロセッシングユニット（ＧＰＵ）、またはＣＰＵとＧＰＵの両方、または他のプロセッシングユニットもしくは当技術分野で既知のコンポーネントである。
【００３０】
コンピューティングデバイス２００はまた、例えば、磁気ディスク、光学ディスク、またはテープ等の追加のデータ記憶装置（取り外し可能な、および／または取り外し不可能な）を含む。そのような追加の記憶装置は、取り外し可能な記憶装置２１８および取り外し不可能な記憶装置２２０によって、図２で例示される。非一時的なコンピュータ可読媒体は、例えばコンピュータ可読命令、データ構造、プログラムモジュール、または他のデータ等の情報の記憶装置のための技術により実現される、揮発性の、および不揮発性の、取り外し可能な、および取り外し不可能な有形の、物理的な媒体を含むことができる。システムメモリ２０２、取り外し可能な記憶装置２１８および取り外し不可能な記憶装置２２０は全て、非一時的なコンピュータ可読媒体の例である。非一時的なコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、フラッシュメモリまたは他の記憶技術、ＣＤ−ＲＯＭ、ディジタル多目的ディスク（ＤＶＤ）、または他の光学記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置、または他の磁気記憶デバイス、または他の任意の有形の、望まれる情報を記憶するために使用されることができ、コンピューティングデバイス２００によってアクセスされ得る物理的な媒体を含むが、これに限定されるものではない。そのような任意の非一時的なコンピュータ可読媒体は、コンピューティングデバイス２００の一部とすることができる。
【００３１】
コンピューティングデバイス２００はまた、例えばキーボード、マウス、タッチセンサー式のディスプレイ、音声入力デバイス、等の入力デバイス２２２、および例えばディスプレイ、スピーカ、プリンタ、等の出力デバイス２２４を有する。これらのデバイスは当技術分野においてよく知られており、ここで詳細に検討される必要はない。
【００３２】
コンピューティングデバイス２００はまた、コンピューティングデバイス２００が他のコンピューティングデバイス２２８と通信することを許可する通信接続２２６を含む。
【００３３】
例示的プロセス
図３−６は、例示的プロセス３００、４００、５００および６００を示す。これらのプロセスはロジカルフローグラフとして例示され、それの各動作はハードウェア、ソフトウェア、またはそれらの組み合わせにより実現され得る動作の順序を表す。ソフトウェアのコンテキストにおいて、動作は１つまたは複数のコンピュータ可読記憶媒体に記憶されたコンピュータで実行可能な命令を表し、１つまたは複数のプロセッサによって実行されたとき、列挙された動作を行う。通常、コンピュータで実行可能な命令は、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造、および特定の関数を行うか、または特定の抽象的なデータタイプを実施するようなものを含む。動作が記述された順は、制限として解釈されることは意図しておらず、記述された動作はいくつでも、任意の順で、および／または並列にプロセスを実施するために組み合わされ得る。
【００３４】
図３は、非同期プロシージャコール（ＡＰＣ）を通じてユーザモードコンポーネントをインジェクトするカーネルモードコンポーネントの例示的プロセスである。ユーザモードコンポーネントはユーザモードプロセスの関数をアトミックにフックしていることを例示する。プロセス３００は、３０２において、カーネルモードコンポーネントによって、ユーザモードプロセスのローディングの通知を受け取ることを含む。カーネルモードコンポーネントは、カーネルモードコンポーネントを実施しているコンピューティングデバイスのオペレーティングシステムカーネルのコールバックインタフェースから通知を受け取ることができる。
【００３５】
３０４において、カーネルモードコンポーネントは、ユーザモードプロセスをローディングしている間に、ユーザモードプロセスのメインスレッドによって実行されるためにＡＰＣをビルドすることができる。ＡＰＣはカーネルルーチンおよびユーザルーチンを含むことができる。カーネルルーチンは、メモリにおいてユーザモードプロセスに隣接した位置で、一部のメモリを割り当てるため、およびユーザモードコンポーネントのローディングをリクエストするための命令を割り当てられた部分に記憶するためのカーネルモードコンポーネントの命令を呼び出すことができる。そのような記憶された命令はサンクとすることができる。ユーザルーチンは、ユーザモードコンポーネントのローディングをリクエストするためのユーザモードローダライブラリコンポーネントの命令を呼び出すことができる。
【００３６】
３０６において、カーネルモードコンポーネントは、ＡＰＣを実行のためのユーザモードプロセスのメインスレッドの待ち行列に入れることができる。ＡＰＣは、ユーザモードプロセスがローディングの一部として、ユーザモードプロセスを実行することのためのいくらかのＡＰＣがあるかどうかチェックするとき、提供され得る。この提供のタイミングは、ユーザモードプロセスのローディングにおいて指定された段階に設定され得る。
【００３７】
３０８において、ユーザモードプロセスのメインスレッドはＡＰＣを実行する。３１０において、ＡＰＣを実行することは、メモリにおいてユーザモードプロセスに隣接したメモリを割り当てるためのＡＰＣのカーネルルーチンを呼び出すことを最初に含む。３１２において、ＡＰＣを実行することは、割り当てられた記憶位置において命令を記憶するＡＰＣのカーネルルーチンを呼び出すことを二番目に含む。３１４において、ＡＰＣを実行することは、ユーザモードコンポーネントのローディングをリクエストするためのＡＰＣのユーザルーチンを三番目に含む。ユーザモードコンポーネントは、既知のライブラリコンポーネント（例えば、既知のＤＬＬ）のリストに含まれることができる。
【００３８】
３１６において、ユーザモードコンポーネントは次いで、例えばプロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数等の、ユーザモードプロセスの関数をアトミックにフックする。関数は、ユーザモードメモリ割り当て、ユーザモードにおけるスレッドコンテキスト設定、またはカーネルモードからフックされ得ない任意のシステムコールの一つに関連付けられることができる。３１８において、アトミックなフックをすることは、オフセットと対応付けるメモリ位置へのジャンプを指定するための関数の単独の命令またはマシン語サイズの命令のセットを修正することであって、メモリ位置は割り当てられているメモリ位置であることを含む。命令はいくつかの実施例において、例えば、設定または機械学習に基づくカーネルモードコンポーネントによって識別され得る。命令は合計で８バイトとすることができ、プロセッサのアトミックな比較およびスワップメカニズムを使用することによって修正され得る。また、いくつかの実施例において、３１０で割り当てられたメモリの位置は、オフセットを指定するために使用される８バイトの量に基づいて決定された範囲内とすることができる。
【００３９】
図４は、ユーザモードプロセスの関数と関連付けられたデータを、その関数のアトミックなフックを通じて受け取り、およびフックされたデータをカーネルモードコンポーネントに提供するユーザモードコンポーネントの例示的プロセスを示す。プロセス４００は、４０２において、関数の修正された命令を実行しているユーザモードプロセス、アトミックなフックとして役目を果たしている修正された命令を含む。関数は、ユーザモードプロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数とすることができる。
【００４０】
４０４において、実行されたとき、修正された命令は、ユーザモードプロセスに隣接してメモリにおいて位置に記憶された命令へジャンプする。上記のように、そのような命令はサンクとすることができる。サンクは、ユーザモードプロセスのローダにユーザモードコンポーネントをロードするようにリクエストすることができる。
【００４１】
４０６において、記憶位置に記憶された命令は、ユーザモードコンポーネントのローディングをリクエストするか、またはロードされたユーザモードコンポーネントのインスタンスへジャンプする。
【００４２】
４０８において、ユーザモードコンポーネントは、フックされた関数と関連付けられたデータを受け取る。
【００４３】
４１０において、ユーザモードコンポーネントは、ユーザモードコンポーネントと関連付けられたカーネルモードコンポーネントに受信データを提供する。
【００４４】
４１２において、アンローディングするとき、ユーザモードコンポーネントは修正された命令をそれの元の状態にリストアする。
【００４５】
図５は、ユーザモードプロセスの関数をアトミックにフックするための例示的プロセスを示す。プロセス５００は、５０２において、フックされるプロセスの関数をコンピューティングデバイスによって識別することを含む。関数は、プロセスの６４−ｂｉｔシステムライブラリコンポーネントの関数とすることができる。
【００４６】
５０４において、コンピューティングデバイスは、メモリにおいてプロセスに隣接した位置に命令を記憶する。
【００４７】
５０６において、コンピューティングデバイスは、メモリにおいてプロセスに隣接した位置へジャンプして、命令の実行を引き起こすように、５０８で関数と関連付けられたマシンサイズの語の範囲内の単独の命令または命令のセットを修正することを含めて、関数をアトミックにフックする。命令の実行は、カーネルモードコンポーネントへ送信するために関数と関連付けられたデータを得る。
【００４８】
図６は、ＡＰＣを通じてユーザモードコンポーネントをインジェクトするカーネルモードコンポーネントの例示的プロセスを示す。プロセス６００は、６０２において、ユーザモードプロセスをロードするためにリクエストの通知をカーネルモードコンポーネントによって受け取るステップを含む。
【００４９】
６０４において、カーネルモードコンポーネントは、ローディングの間にユーザモードプロセスによって実行されるためにＡＰＣをビルドし、ＡＰＣは、６０６において、ユーザモードコンポーネントをローディングするための命令への関数ポインタ、およびユーザモードコンポーネントがユーザモードプロセスにおいて関数または関数群をフックすることを可能にすることを含む。関数または関数群は、プロセスの６４−ｂｉｔシステムライブラリコンポーネントの一部とすることができる。
【００５０】
６０８において、カーネルモードコンポーネントは、ユーザモードプロセスにＡＰＣを提供する。
【００５１】
結論
発明の主題は構造的特徴および／または方法的行為に特有の文言で説明されているが、添付された特許請求の範囲に定義された発明の主題は、説明された特定の特徴または行為に必ずしも限定されないことを理解すべきである。むしろ、特定の特徴および行為は、特許請求の範囲を実施する例示的形態として開示される。
【図１】
2017033552.tif 000003
【図２】
2017033552.tif 000004
【図３】
2017033552.tif 000005
【図４】
2017033552.tif 000006
【図５】
2017033552.tif 000007
【図６】
2017033552.tif 000008
【外国語明細書】
2017033552000001.pdf