フックは簡単です(パート3)

画像



どういうわけか、私はHabréにフック用のライブラリに関するいくつかの記事を書きました。 1 つ目はDetoursに基づく一般的な原則と実装に関するもので、 2つ目は安価な(ただし機能的ではない)madCodeHookライブラリに関するものでした。 今日は、別のオプション、 ネクトラデビアレライブラリについてお話します。 「もう1つはフック用のまったく同じライブラリですか?」-あなたは尋ねます。 「同じ、しかし同じではない」と答えます。 Deviareには、DetoursとmadCodeHookの両方と区別する機能がいくつかあり、場合によってはさらに便利になります。



ライブラリは、デュアルライセンス-GPL \商用で配布されます。
オープンソースプロジェクトの場合、彼女はGitHubに住んでおり、サポートとクローズド製品にライブラリコードを埋め込む権利を必要とする人のために、公式ウェブサイトへようこそ。誰にも金を払わずに彼のオープンソースプロジェクトを今すぐに。 回り道とmadCodeHookでは利用できない奇跡。 このプロジェクトは長い間閉鎖されていたと言わざるを得ませんが、ネクトラはそれをどういうわけか人々に近づける必要があると判断しました。



ライブラリに基づいて強力なSpyStudio製品が作成されました
フック用のコードを作成する前に、このユーティリティを実行して、何ができるかを確認できます。 もちろん、多くのことがDetoursとmadCodeHookに基づいて行われていますが、ライブラリの作成者自身による同様のソフトウェアは何とかありません。



著者は、ブログでフックを使用する実例の束を投げました。
ここには、SQLインジェクションを防ぐためのSQL Serverのフック、 DirectXを介して描画されたゲームからのビデオ録画チートブラウザーでのプレーヤーの速度の変更があります 。 読むと、フックを使用できる理由がすぐに明らかになります。



クラシックC ++に加えて、どこからでもフックを設定できるCOMコンポーネントが提供されています(C#、Python、VB、Delphiなど)。
はい、ポインターの配列へのポインターが何であるかを理解することなく、最終的にフックの使用を開始できます。



フックは、COMオブジェクトのネイティブ関数またはメソッドだけでなく、.NETメソッドにも掛けることができます。
.NETではメタ情報とリフレクションがかなり優れているように見えるので、この機能はそれほど致命的ではないようです。つまり、必要な人が自分でそれを実行できたということです。 しかし、そう、パイのチェリーとして-どうして。



図書館は、すべての「子供時代」の病気を長く生き延びてきました
現在、Fortune 500の企業で使用されており、VmWareとのパートナーシップにより、たとえば 、インストールされたアプリケーションのポータブルバージョンを作成できます。



ここでは数キロメートルのコードをペイントしません(GitHubの例を使用して、オープンソースライブラリでこれを行うのはばかげています)。 まあ、純粋にそう、概要。



ライブラリを他の誰かのプロセスに挿入する:

#include "NktHookLib.h" NktHookLibHelpers::InjectDllByPidW(dwPid, L"myDll.dll");
      
      







関数へのフックの設定:

 #include "NktHookLib.h" typedef int (WINAPI *lpfnMessageBoxW)(__in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType); static int WINAPI Hooked_MessageBoxW(__in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType); static struct { SIZE_T nHookId; lpfnMessageBoxW fnMessageBoxW; } sMessageBoxW_Hook = { 0, NULL }; int WinMainCRTStartup() { CNktHookLib cHookMgr; HINSTANCE hUser32Dll; LPVOID fnOrigMessageBoxW; DWORD dwOsErr; hUser32Dll = NktHookLibHelpers::GetModuleBaseAddress(L"user32.dll"); if (hUser32Dll == NULL) { ::MessageBoxW(0, L"Error: Cannot get handle of user32.dll", L"HookTest", MB_OK|MB_ICONERROR); return 0; } fnOrigMessageBoxW = NktHookLibHelpers::GetProcedureAddress(hUser32Dll, "MessageBoxW"); if (fnOrigMessageBoxW == NULL) { ::MessageBoxW(0, L"Error: Cannot get address of MessageBoxW", L"HookTest", MB_OK|MB_ICONERROR); return 0; } dwOsErr = cHookMgr.Hook(&(sMessageBoxW_Hook.nHookId), (LPVOID*)&(sMessageBoxW_Hook.fnMessageBoxW), fnOrigMessageBoxW, Hooked_MessageBoxW, NKTHOOKLIB_DisallowReentrancy); ::MessageBoxW(0, L"This should be hooked", L"HookTest", MB_OK); dwOsErr = cHookMgr.Unhook(sMessageBoxW_Hook.nHookId); ::MessageBoxW(0, L"This should NOT be hooked", L"HookTest", MB_OK); return 0; } static int WINAPI Hooked_MessageBoxW(__in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType) { return ::MessageBoxW(hWnd, lpText, L"HOOKED!!!", uType); }
      
      







しかし、どういうわけか、メモ帳はPythonから起動され、CreateFileW関数をフックします。



 import win32com.client import ctypes, sys from EventHandlers import NktSpyMgrEvents from AuxFunctions import * if sys.version_info.major < 3: warnings.warn("Need Python 3.0 for this program to run", RuntimeWarning) sys.exit(0) win32com.client.pythoncom.CoInitialize() spyManager = win32com.client.DispatchWithEvents("DeviareCOM.NktSpyMgr", NktSpyMgrEvents) result = spyManager.Initialize() if not result == 0: print ("ERROR: Could not initialize the SpyManager. Error code: %d" % (result)) sys.exit(0) notepad = StartNotepadAndHook(spyManager) MessageBox = ctypes.windll.user32.MessageBoxW MessageBox(None, "Press OK to end the demo.", "Deviare Python Demo", 0) notepad.Terminate(0)
      
      







ライブラリで頑張ってください!



All Articles