4

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 を使用するつもりはありません。

4

1 に答える 1

4

関数ポインターの呼び出し規則が間違っているため、スタックが破損します。

デフォルトの呼び出し規約は __cdecl で、呼び出し元がスタックを消去することを期待しています。

typedef BOOL (* wp)(_In_   HANDLE ....);

等しい:

typedef BOOL (__cdecl* wp)(_In_   HANDLE ...);

ただし、winapi 関数は、呼び出し先がスタックを消去することを期待する __stdcall 呼び出し規約を使用します。__stdcall 関数を typedef する必要があります。

typedef BOOL (__stdcall* wp)(_In_   HANDLE ....);
于 2013-09-06T14:10:43.563 に答える