我有一個用於注入的DLL。這是通過CBT掛鉤注入的。現在,當通過CBT遇到期望的 進程時,我用我自己的方法繞過了WinAPI的ExtTextOutW。 ExtTextOutW的規格是:無法得到:: WideCharToMultiByte工作
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掛起注入的進程。爲什麼?
如果在棧上實現緩衝區,則會崩潰。此外,該字符串的大小不一(最大爲8192)。此外,該過程可以同時發送數百個ExtTextOutWs,因此堆棧可能會突然結束。 SendViaIPC不是問題。如果我用無意義的方式填充緩衝區並刪除WideCharToMultiByte,則一切正常(不會崩潰)。 – nhaa123 2009-09-04 10:05:24
@ nhaa123我看到與堆棧上的字符緩衝區相同的崩潰。 – Plow 2010-10-15 07:55:28