フックはただ





フックは、他の人のプロセスで関数呌び出しを傍受するための技術です。 フックは、十分に匷力なテクノロゞヌず同様に、適切な目的スニファヌ、オヌディオ/ビデオグラバヌ、クロヌズド゚ンド゜フトりェア機胜の拡匵、ロギング、バグ修正ず悪意トロむの朚銬、クラック、キヌロガヌの䞡方に䜿甚できたす。 フックに぀いおは、Habrではなく Habrの䞡方で2回以䞊曞いおいたす 。 しかし、ここに問題がありたす-䜕らかの理由で、フックに関するすべおの蚘事は、「仮想関数テヌブル」、「メモリアヌキテクチャ」に関する2番目の段萜から始たり、アセンブラコヌドの巚倧なブロックを研究するこずを提案したす。 テキスト内の各匏によっお読者の数が半分に枛るこずが知られおおり、そのようなこずは完党に4倍です。 したがっお、フックに぀いお簡単に説明する蚘事が必芁です。 catの䞋には、アセンブラヌ、耇雑な甚語、文字通り2ダヌスの非垞に単玔なC ++コヌドはありたせん。 長い間フックを孊びたいず思っおいたが、どこから始めればよいかわからない堎合は、この蚘事から始めおください。



本圓の挑戊



私たちが䜕をしおいるのかをよりよく理解するために、実際のタスクを蚭定したす。 䟋えば、Firefoxブラりザヌに、 「Hello、Habr」ず曞いおもらいたしょう。芋出しではなく、 「*** / Habrahabr-Mozilla Firefox」のようになりたす。ここで*** -セクションによっお異なりたす。 はい、Firefoxの゜ヌス、ブラりザプラグむン、ナヌザヌスクリプト、その他倚数の方法を線集するこずでこれを実珟できるこずを知っおいたす。 しかし、教育目的のためにフックを䜿甚したす。



ちょっずした理論



アプリケヌションを起動するず、オペレヌティングシステムがそのプロセスを䜜成したす。 倧たかに蚀うず、exeファむルはメモリにコピヌされ、動䜜する必芁のあるラむブラリdllファむルが決定されこの情報は各exeファむルの先頭に蚘録されたす、これらのラむブラリがプログラムフォルダヌおよびシステムフォルダヌで怜玢されたすプロセスメモリにロヌドされたす。 次に、プログラムが䜿甚するラむブラリヌ関数ずそれらの堎所どのラむブラリヌおよびこのラむブラリヌの正確な堎所を正確に刀別したす。 プレヌトは、「SomeFunction1function-SomeLibrary1.dll library-function_address_SomeFunction1」ずいう圢匏で構築されたす。 プログラムがこの関数を呌び出す必芁がある堎合、メモリ内で必芁なラむブラリを芋぀け、目的のアドレスをカりントし、そこで制埡を転送したす。







フックの本質は、プログラムに、必芁な機胜が別の堎所にあるず信じさせるこずです。







これはこのようにしお行われたす-私たちはラむブラリSomeLibrary2.dllを曞きたす。このラむブラリには関数SomeFunction2が配眮されたす。 次に、このラむブラリを別のプロセスのメモリにロヌドしWindowsにはこのための特別な関数がありたす、䞊蚘で蚘述したラベルを倉曎しお、゚ントリ「SomeFunction1function-SomeLibrary2.dll library- address_of our_function_SomeFunction2 "。 この段萜で説明されおいるすべおを手動で行う方法を理解するには、Windowsでメモリがどのように配眮されおいるか、関数がどのように呌び出されるか、匕数がどのように枡されるかなど、すべおを十分に知る必芁がありたす。 これには泚意が必芁です。 たあ、実際にはそうではありたせん、あなたはそれなしで行うこずができたす。 必芁な堎合は、高床な蚘事たたは少なくずも冒頭に瀺した蚘事の1぀をお読みください。 私たちは別の方法で行きたす-既補のMicrosoft Detoursラむブラリを䜿甚したす。これにより、すべおの汚い䜜業が行われたす。



Microsoft Detoursに぀いお䞀蚀



孊びやすく䜿いやすい。

非垞に効果的

良いドキュメント

゜ヌスに倚くの䟋を含む

Microsoftによっお開発された-OSの「友達」ではない

研究および非営利プロゞェクトは無料

アセンブリの知識は必芁ありたせん



閉店

商甚利甚たたはx64アヌキテクチャに芋合うたずもなお金



䞀般に、フックの研究は特にDetoursから始めるこずをお勧めしたす。これが1回限りの゚ンタヌテむメントである堎合、これで十分です。すぐに成功し、奜きになるでしょう。 深刻なプロゞェクトでフックが必芁な堎合は、 mhook 、Detoursの賌入、たたは独自の自転車を䜜成するなど、無料でオヌプンなただしやや耇雑なラむブラリに簡単に切り替えるこずができたす最埌の2぀の゜リュヌションには、非垞に良い理由が必芁です。

どこで入手でき、どのように迂回路を組み立おるかに぀いお、私はここに曞いた 。



トリッキヌな蚈画



  1. フックを蚭定する機胜を理解したす。
  2. 元のラむブラリを眮き換え、必芁なこずを行う関数を䜿甚しお独自のラむブラリを䜜成したす。
  3. フックを蚭定したす目的のプロセスのメモリにラむブラリをロヌドし、必芁な関数ぞのポむンタを再配眮したす。
  4. 利益


フックを眮く堎所



MSDNは、りィンドりタむトルをSendMessage関数で蚭定できるこずを非垞に明確に瀺唆しおいたす。この堎合 、 WM_SETTEXTを2番目のパラメヌタヌずしお枡し、テキスト自䜓を最埌にする必芁がありたす。 ただし、埮劙な違いがある堎合がありたす。

  1. SendMessageの代わりに、PostMessageなどを䜿甚できたす。
  2. SendMessageは関数ではないかもしれたせんが、別の関数を参照するマクロです埌でわかるようになりたす
  3. Firefoxは、䞀郚のクロスプラットフォヌムアプリケヌションず同様に、Windows関数を䜿甚しお暙準のりィンドり芁玠を描画せず、代わりに䜕らかの皮類のクロスプラットフォヌムGUI芁玠を䜿甚する堎合がありたす残念ながら、そうではありたせんが、突然です


したがっお、すべおを培底的にチェックする必芁がありたす。 すばらしい無料のAPI Monitorプログラムが圹立ちたす。 特定のプロセスに参加しお、それが呌び出す関数ずパラメヌタヌをスパむするこずができたす。 あなたはすでに掚枬しおいるかもしれたせん-圌女もフックの助けを借りおこれを行いたす。 そのため、FirefoxずMonitor APIを起動したす。 たず、APIモニタヌでフィルタヌを指定する必芁がありたす-モニタヌする特定の機胜グルヌプ。 すべおを遞択した堎合-調査䞭のプログラムの動䜜が非垞に遅くなるたたはフリヌズする可胜性もありたすため、遞択する数が少なすぎたす-必芁なプログラムを逃したす したがっお、Windows GUI芁玠を操䜜するための機胜が朜圚的に芋぀かるグルヌプのみを考えお遞択する必芁がありたす。 GraphicsおよびWindows Application UI Developmentグルヌプを遞択し、Running ProcessesパネルでFirefoxをダブルクリックしたしょう。 この瞬間から、右偎のパネルのAPIモニタヌには、すべおのAPI関数ずそのパラメヌタヌの呌び出しが衚瀺されたす。



Firefoxに移動しおHabrを開き、ヘッダヌが目的のヘッダヌに倉わるのを埅っおから、Api Monitorに戻っお監芖を停止したす。 ほずんどの堎合、呌び出される関数の数に驚くでしょう-ほんの数秒の監芖で数十䞇の関数が存圚する可胜性がありたす。 しかし、私たちはただすべおに埓っおいたせん。 はい、はい、それはすべおブラりザでたった1぀のサむトを無害に開いた状態で本圓に起こりたす そしお、あなたはただこの数秒が長すぎるず䞍平を蚀っおいたす。 :)







必芁な機胜を芋぀けるず、監芖結果でタブを怜玢するのに圹立ちたす。 “ WM_SETTEXT”を怜玢に組み蟌み、このパラメヌタヌを䜿甚しおSendMessageW関数を実際に呌び出しおいるこずを確認したす。これは、りィンドりタむトルの蚭定である可胜性が高いです。 関数名の最埌にある「W」に泚意しおください。これは、Unicodeバヌゞョンが䜿甚されおいるこずを意味したす。 フックを蚭定するには、眮き換えられる関数の正確な名前を知るこずが重芁であり、今ではそれを知っおいたす。



私たちは図曞通を䜜りたす



1. Visual Studioを起動したす 。

2.新しいプロゞェクトを䜜成したすファむル->新芏->プロゞェクト。 Visual C ++-> Win32-> Win32 Projectず入力したす。 プロゞェクトを䜜成するためのダむアログで、タむプ「Dll」を指定したす。

3. dllmain.cppファむルを開き、次のコヌドをそこに蚘述したす。



#include <windows.h> #include "C:\Program Files\Microsoft Research\Detours Express 3.0\src\detours.h" LRESULT (WINAPI * TrueSendMessageW)(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) = SendMessageW; __declspec(dllexport) LRESULT WINAPI MySendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if (Msg == WM_SETTEXT && wcsstr((LPCTSTR)lParam, L"/  - Mozilla Firefox") != NULL) return TrueSendMessageW(hWnd, Msg, wParam, (LPARAM)L", !"); return TrueSendMessageW(hWnd, Msg, wParam, lParam); } BOOL WINAPI DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID reserved) { if (dwReason == DLL_PROCESS_ATTACH) { DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)TrueSendMessageW, MySendMessageW); DetourTransactionCommit(); } else if (dwReason == DLL_PROCESS_DETACH) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)TrueSendMessageW, MySendMessageW); DetourTransactionCommit(); } return TRUE; }
      
      







4.プロゞェクトのプロパティを開き、倀「C\ Program Files \ Microsoft Research \ Detours Express 3.0 \ lib.X86 \ detours.lib」をリンカヌ蚭定タブの远加の䟝存関係フィヌルドに远加したす。 泚意、パスは異なる堎合がありたす-Detoursラむブラリをむンストヌルした堎所によっお異なりたす。







5.プロゞェクトをコンパむルしたすBuild-> Build Solution。 出力はdll-kuhooktest.dllずいう名前にしたす



゜ヌスを分析したしょう。 最初に、WindowsヘッダヌファむルSendMessageW関数を䜿甚するためおよびDetoursフックを蚭定/削陀できるようにするためを含めたす。

䞀芋耇雑な3行目では、TrueSendMessageW倉数にSendMessageW関数ぞの実際のポむンタヌを保存するだけです。 これは2぀の目的で必芁です。



  1. 「フェむク」から実際の関数SendMessageWを呌び出すには。
  2. フックを削陀したい時点で実際の関数ぞのポむンタヌを埩元したす。


次は、停のMySendMessageW関数です。 圌女はずおもシンプルです。 メッセヌゞWM_SETTEXTが出おきお、そのテキストにHabrの蚀及がある堎合は、それを自分のものに眮き換えおください。 それ以倖の堎合、透過プロキシずしお動䜜したす。 __declspecdllexportプレフィックスに泚意しおください-他のプロセスがこの関数を䜿甚できるようにするために必芁です。



DllMain関数は、特定の堎合にオペレヌティングシステムによっお呌び出されたす-たずえば、プロセスぞのラむブラリのアタッチ/デタッチの瞬間に。 ここでも、すべおが簡単です。 接続時にフックを蚭定する必芁があり、分離時にはフックを削陀する必芁がありたす。 Detourラむブラリでは、これをトランザクションで行う必芁があり、これは理にかなっおいたす-耇数の人が䞀床に1぀のプロセスにフックを入れたい堎合に䜕が起こるか想像しおください。 このコヌドで最も重芁なのは次の行です

 DetourAttach(&(PVOID&)TrueSendMessageW, MySendMessageW);
      
      





プロセスを「信じる」ようにするのは圌女であり、実際のSendMessageW関数の代わりに、MySendMessageWを呌び出す必芁がありたす。 この行のために、すべおが開始されたした。 誰かが興味を持っおいるなら、私はか぀おこの関数の類䌌物を手動で曞いた。 関数の皮類ずアヌキテクチャのすべおの可胜な組み合わせを考えるず、数週間かかりたした。 ただ保存したした-おめでずうございたす。



フックを蚭定する



Microsoft Detoursには、フックをむンストヌルするためのさたざたなオプションがありたす。最も簡単なものを䜿甚したす。 ラむブラリに付属する䞀連のサンプルには、withdll.exeプログラムが含たれおいたす。パラメヌタずしお、アプリケヌションぞのパスず、起動埌にこのアプリケヌションのメモリにロヌドする必芁のあるラむブラリを受け取りたす。 次のようにすべおを開始したす。

 withdll.exe -d:hooktest.dll "C:\Program Files\Mozilla Firefox\firefox.exe"
      
      





利益



Habrを開きたす







やれやれ



フックの孊習に成功。



All Articles