インジェクション用のDLLがあります。これは、CBT フックを介して注入されます。これで、CBT 経由で目的のプロセスに遭遇したときに、WinAPI の ExtTextOutW を自分のプロセスで迂回しました。ExtTextOutW の仕様は次のとおりです。
BOOL ExtTextOutW(HDC hdc,
INT x,
INT y,
UINT flags,
const RECT* lprect,
LPCWSTR str,
UINT count,
const INT* lpDx)
回り道した ExtTextOutW で、次のコードを使用して str (LPCWSTR) をマルチバイトに変換しようとしています。
BOOL Mine_ExtTextOutW(HDC hdc,
INT x,
INT y,
UINT flags,
const RECT* lprect,
LPCWSTR str,
UINT count,
const INT* lpDx)
{
BOOL rv = Real_ExtTextOutW(hdc, x, y, flags, lprect, str, count, lpDx);
HANDLE h = ::WindowFromDC(hdc);
if (!h || !str)
return ev;
CHAR *buffer = (CHAR *)::LocalAlloc(count + 1);
int l = ::WideCharToMultiByte(CP_APC, 0, str, count, buffer, count, NULL, NULL);
if (l > -1) {
buffer[l] = '\0';
g_pClient->SendViaIPC(buffer);
}
::LocalFree(buffer);
return rv;
}
残念ながら、これは機能しません。WideCharToMultiByte は、挿入されたプロセスをハングさせます。なんで?