2017-02-09 4 views
4

私はAPIフック、インライン、EATフックを検出しようとしています。APIフックを検出するにはどうすればよいですか?

今のところ、EATフックを検出する方法については何も見つかりませんでした。

私がこれまで持っているもののインラインリング3フックについて:

FARPROC Address = GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitProcess"); 
if (*(BYTE*)Address == 0xE9 || *(BYTE*)Address == 0x90 || *(BYTE*)Address == 0xC3) 
{ 
printf("Api hooked\n"); 
} 

問題は、JMP/NOP/RETをチェックし、機能のプロローグを変更/フックするために使用することができますいくつかのオペコードがあるということです私はPUSH RET、MOV、RETNなどのフックタイプをたくさん見てきました。

APIでこれらのフック(迂回路)や修正を検出する方法が分かっているのでしょうか。 EATフックを検出する方法もあります。

ありがとうございます。

+7

誰かがプログラムをフックした場合、フック検出器をフックできます。 –

+1

エクスポートアドレステーブルがフックされているかどうかを確認する明白な方法は、テーブル内のいずれかのアドレスが、EATが属するDLLの外のどこかを指しているかどうかを確認することです。しかし、いくつかの標準DLLはいくつかの関数をEATを介して他のDLLに転送すると考えています。だから、この場合は処理する必要があります。 –

答えて

1

GetProcAddressもフックすることができます。また、パッチを当てるべき正確なAPIを知ることができないので、インポートされたすべての関数をチェックする必要がありますが、これはかなり面倒です。侵入者はあなたのプロセスのアドレス空間に注入し、APIメソッドをフックするのに十分な特権を持っているので、保護メカニズムを完全に取り除くことを防ぐ方法はほとんどありません。通常、最新のソフトウェア保護システムには、カーネルモードドライバが含まれており、プログラムメモリをスキャンし、dll注入やリモートメモリの変更を防ぎます。また、コード暗号化/難読化システム(Themidaなど)や完全にエイリアンなプロセッサ命令セットを使用した内部仮想実行マシンを使用することもかなり一般的です。

+1

あなたはもちろんですが、ディスクから手動でKernel32.dllをロードし、ファイルが署名されていることを保証し、GetProcAddressのような重要な機能の命令プレリュードなどを比較するなど、かなり効果的な対策を見てきました。 GPAがフックされている場合、検出を避けるためにデータを比較する前に動的にフックを解除する必要があります。その後、ディスク対メモリなどの関数命令チェックサムを比較することができます。しかし、それは猫とマウスのゲームであり、偽の証明方法ではありません。 –

0

私はあなたがメモリ内の現在のdllでディスクからkernel32.dllを比較する必要があります、またIATを無視し、再配置を修正するか、別のハッシュを取得する必要がありますと信じています。

もっと簡単な解決方法が必要な場合は、kernel32.dllの名前を変更し、名前を変更したDLLからAPI呼び出しを行います。

0

現在のプロセスのIATアドレスをフックし、すぐにバイトを保存する必要があります。

この後に元のバイトを持っている、あなたは後から新しいものにバイト再びそれらをコピーしようと、古い(元)を比較することmemcmp()を使用することができますので、それらが異なる場合は、あなたのIATアドレスを持っています別のプロセスによって引っ掛けられた。

関連する問題