キーロガーについてはよくわかりません。しかし、キーストロークをシミュレートするプログラム(Windowsの場合)を作成し、スループットを記録してから、アクティブなキーロガーでテストを繰り返すことで、その存在を検出できると思いました。
キーロガーもキーストロークメッセージを聞いて何らかのアクションを実行する必要があるという考えです。パフォーマンスの低下を検出できると思います。これまでのところ、私のアプローチは惨めに失敗しました。
WIN32APIを使用してメッセージを送信するWindows7でこれを試しています。あまり実用的でなくても、これでうまくいくと思いました。このアプローチが失敗する運命にある明らかな理由があるかどうか、より多くの知識/経験を持っている人は誰でも教えてもらえますか?商用キーロガーのいくつかは「マシンの速度を落とさない」と主張していますが、私はそれが単なるマーケティングであると考えました。それでも、測定可能なパフォーマンスの違いは見られません。
システムのパフォーマンス低下を監視することでキーロガーを検出することは可能ですか?
キーボードフックコードがバックグラウンドでどのように機能するかはわかりませんが、最初に、Chen氏はこの種のことで PostMessage
を使用する際の問題についてブログに書きました。彼が言うように、キーボードキューに詰まった入力を送信したい場合は、 SendInput
を使用します。
たとえば、キー押下をキャプチャする1つの方法は、 SetWindowsHookEx
を使用し、LoadLibrary
を介してロードされたDLLの一部としてイベントハンドラーを作成することです。これにより、システムに入力したすべてのキーボード入力が受信されます。これは、たとえば、グローバルホットキーを実装する1つの方法です(システム全体の場合と同様)。
このメカニズムの問題は、フックがその入力を処理するのに長すぎるかかる場合、Windowsはそれを起動し、それ以上メッセージを渡さないことです。魅力的。実際には、OS 正当な理由もなくチャックがフックアウトする というWindows7のバグがあることが判明しました。
とにかく、OK、タスクに戻ります。 1つの説明として、キーロガーは実際にインストールされていないため、測定可能なパフォーマンスの違いを示していない可能性があります。これは確認する価値があります。
第二に、どのようにフックしても、マーケティングの話が何であれ、パフォーマンスのペナルティが発生します。ドライバーを使用している場合、Windowsは ドライバースタック 内の追加のデバイスを介して散らかっていて、SetWindowsHook
を使用している場合は、どの方法でカットしても追加の命令が実行されます。 、Windowsは追加のフックを列挙して呼び出しています。
うまくいかない可能性があるのは、測定プロセスです。これは、特にコンテキストスイッチ、IO遅延などの交絡因子を考慮する場合、非常に困難です。入力時間を測定する方法によっては、違いを見逃している可能性があります。
それよりも技術的になります-たとえば、 rtdsc
最近のマルチコアシステムではそれほどうまく機能しないので、それを使用している場合はそうではないかもしれません作業。適切な解決タイマーを取得するには、適切なAPI関数が必要です。
注意すべきもう1つのポイントは、デバッガーの存在です。 Visual Studioなどでアプリケーションをデバッグしたことがある場合は、DLLが読み込まれ、デバッグシンボルも読み込まれ、大幅な遅延が発生することをよく知っています。あなたはこれに気づいたと思いますが、繰り返す価値があります。
これが私がこれにアプローチする方法です:
WM_KEYPRESS
メッセージ-時間とキー押下。SendInput
メッセージの送信を開始するようにトリガーするボタンを用意します。言うまでもなく、これを仮想マシンではなく物理マシンにロードし、実行はできるだけ少なくします。
何か見えますか?正直なところ、わかりません。 一部の人は試しました これや他の指標を使用しているように見えますが、人間の知識の進歩であり、私の税金が貢献した可能性のある論文を読むことを許可される十分な特権がありません。できれば、それが何か良いかどうか私に知らせてください!
詳細を追加API呼び出しを行うたびにコンテキストスイッチが発生する可能性がありますが、必ずしも発生するとは限りません。たとえば、IO関連の関数を呼び出し、APIをブロックする必要がある場合、プロセスは一時停止され、スケジューリングアルゴリズムが実行されて、待機中のプロセスに時間が不足しているか、必要なIOメッセージがあるかどうかが判断されます。処理する。これによっては、あなたまたは別のプロセスが起こされて実行される可能性があります。その後、このプロセスが繰り返されます。
Ifプロセス間の切り替えにメリットがある場合、これは比較的高価であり(ここで測定する分単位で)、現在のレジスタ状態が保存され、プロセスがマップされ、別のプロセスがマップされます。 。これは、ユーザーの土地に戻るよりも明らかに費用がかかります。
もう1つの潜在的な落とし穴は、割り込みです。 Linux(Windowsについてはよくわかりません)では、割り込みは実行が許可されるとすべてをプリエンプトします。そのため、その間、カーネルが前回よりも多くの割り込みを処理したため、呼び出しに時間がかかる場合があります。
割り込みは常に(実際には、おそらく必要ではないはずですが)プロセスコンテキストを切り替える必要はありませんが、ハードウェアの動作に応じて、任意の時点で割り込みが多かれ少なかれ存在する可能性があります。それらの数が多いほど、呼び出しからその呼び出しの完了までのCPUサイクルが多くなります。