2009-09-04 86 views
0

我有一個用於注入的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掛起注入的進程。爲什麼?

回答

2

你的代碼看起來有點奇怪,它是否編譯?

LocalAlloc應該有兩個參數,你的意思是CP_ACP。反正不是我想:

  • 向調用WideCharToMultiByte大小正確,以防萬一你改變你的代碼頁中的未來。
  • 檢查> 0(失敗是0,而不是-1表示)
  • 使用std字符串,只是爲了確保你沒有任何內存泄漏,異常等

因此,像這樣:

int nMultiByteSize = ::WideCharToMultiByte(CP_ACP, NULL, str, count, NULL, 0, NULL, NULL); 
if (nMultiByteSize > 0) 
{ 
    std:string strMulti; 
    strMulti.resize(nMultiByteSize); 

    if (::WideCharToMultiByte(CP_ACP, NULL, str, count, &strMulti[0], (int)strMulti.size(), NULL, NULL) > 0) 
    { 
     g_pClient->SendViaIPC(strMulti.c_str()); 
    } 
} 
0

我不知道它爲什麼掛在你的過程中,它看起來應該對我正確工作。你確定這是造成它的WC2MB電話嗎?一些可能性:

  1. 你爲什麼使用LocalAlloc?在堆棧上使用緩衝區是不夠的嗎?
  2. 也許它是懸掛的「SendViaIPC」?
  3. 你正在轉換的字符串有多大?也許緩衝區的大小不足?

WC2MB的回報值是多少?如果不成功,該函數返回0。

LocalAlloc的返回值是什麼?也許分配返回null表示分配內存失敗?然後,您將爲緩衝區傳遞NULL,但計數大於0的數字可能會導致崩潰。

+0

如果在棧上實現緩衝區,則會崩潰。此外,該字符串的大小不一(最大爲8192)。此外,該過程可以同時發送數百個ExtTextOutWs,因此堆棧可能會突然結束。 SendViaIPC不是問題。如果我用無意義的方式填充緩衝區並刪除WideCharToMultiByte,則一切正常(不會崩潰)。 – nhaa123 2009-09-04 10:05:24

+0

@ nhaa123我看到與堆棧上的字符緩衝區相同的崩潰。 – Plow 2010-10-15 07:55:28