winspool.drv!WritePrinter
そのため、spoolsv.exe にリモートで注入されたアンマネージ C++ で正常にフックされるフック関数がにあります。
現在、フックは元の関数を置き換えるか、検出できない方法でスタックを破損しているようです。フック後、WritePrinter 呼び出しにより、フックの外でプリンターの動作がなくなります。
元の関数、いわゆる を呼び出す方法が少なくとも 1 つあることがわかりましたLhGetOldProc
。ただし、これを使用するとクラッシュする可能性があります。これが easyhook 関連のエラーなのか、単にキャスティングが悪いだけなのかはわかりません。
では、Easyhook アンマネージド バージョンで元の関数を正しく呼び出すにはどうすればよいでしょうか?
コールバックをフックするLhGetOldProc
:
UCHAR *uc = NULL;
LhGetOldProc(hhW, &uc);
typedef BOOL (*wp)(_In_ HANDLE, _In_ LPVOID, _In_ DWORD cbBuf, _Out_ LPDWORD);
wp my_wp = reinterpret_cast<wp>(reinterpret_cast<long>(uc)); // http://stackoverflow.com/questions/1096341/function-pointers-casting-in-c
BOOL res ;
if (my_wp == 0x0) {
return -1;
} else {
res = my_wp(hPrinter, pBuf, cbBuf, pcWritten); // crash
}
フックコード:
HMODULE hSpoolsv = LoadLibraryA("winspool.drv");
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO();
NTSTATUS NtStatus;
UNICODE_STRING* NameBuffer = NULL;
HANDLE hRemoteThread;
FORCE(LhInstallHook(GetProcAddress(hSpoolsv, "WritePrinter"), WritePrinterHookA, 0x0, hHook));
ULONG ACLEntries[1] = { (ULONG) - 1 };
FORCE(LhSetExclusiveACL(ACLEntries, 1, hHook));
hhW = hHook;
TIL: 2013 年、CodePlex (EasyHook ディスカッション リストがある場所) は、Microsoft アカウントで登録するときに、電子メールの第 3 レベル ドメインを受け入れません。フォームをバイパスするために Firebug を使用するつもりはありません。