2016-01-06 39 views
0

我試圖用openprocess從這個exe中獲得基地址,但是當我運行代碼時我一直崩潰,而且我沒有看到它的任何錯誤。從一個exe中獲取基址C++

HMODULE GetModule(HANDLE han) 
{ 
    HMODULE hMods[1024]; 
    int i; 
    DWORD cbNeeded; 
    char szProcessName[MAX_PATH] = "Minesweeper.exe"; 
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded); 
    for (i = 0; i < (cbNeeded/sizeof(HMODULE)); i++) 
    { 
     TCHAR szModName[MAX_PATH]; 
     GetModuleFileNameEx(han, hMods[i], szProcessName, sizeof(szModName)); 
     //printf(TEXT("\t%s (0x%08X)\n"), szModName, hMods[i]); 
     if (szModName == szProcessName) 
     { 
      cout << "FOUND" << endl; 
     } 
    } 
    return 0; 
} 
+0

這個問題應該可能有一些特定於Windows的標記,但我不知道哪些應用。 – 5gon12eder

+0

'GetModuleFileNameEx'的最後一個參數是以字符而不是字節來衡量的,所以你不應該使用'sizeof'。在Unicode構建中,這可能會導致崩潰。 –

+0

即時通訊使用多字節項目,我也做了printf,我註釋了,我有一些地址,但我打印後,他們都崩潰了。 –

回答

0

有幾個問題與您的代碼:

  • 您使用TCHAR,但不使用TCHAR一致。
  • 您正在使用==而不是正確的字符串比較函數。
  • 致電GetModuleFileNameEx使用錯誤的數組。

這裏是你的代碼的清理版本,修正(未測試,但大多數如果不是全部的代碼所涉及的問題):

HMODULE GetModule(HANDLE han) 
{ 
    HMODULE hMods[1024]; 
    int i; 
    DWORD cbNeeded; 
    TCHAR szProcessName[MAX_PATH] = _T("Minesweeper.exe"); 
    EnumProcessModules(han, hMods, sizeof(hMods), &cbNeeded); 
    for (i = 0; i < (cbNeeded/sizeof(HMODULE)); i++) 
    { 
     TCHAR szModName[MAX_PATH]; 
     GetModuleFileNameEx(han, hMods[i], szModName, sizeof(szModName)/sizeof(TCHAR)); 
     if (_tcscmp(szModName,szProcessName) == 0) 
     { 
      cout << "FOUND" << endl; 
     } 
    } 
    return 0; 
} 

注意,_T()宏用於表示字符串文字。由於Microsoft有兩種字符集構建類型,並且您使用的是TCHAR,所以您應該讓其餘字符串兼容TCHAR。直接使用char,並且依賴字符集構建類型來避免編譯器或運行時錯誤,這不是編寫代碼的方式。

另外,撥打GetModuleFileNameExsizeof必須除以sizeof(TCHAR)纔是正確的。

另外,爲了解決字符串比較,使用了_tcscmp函數。無論字符集的構建類型如何,該函數都是正確的。

+0

仍然使用此功能崩潰 –

+0

對我運行良好,沒有崩潰。然而,'GetModuleFileNameEx()'的輸出是一個完全限定的路徑和文件名,所以你必須使用類似於'PathFindFileName(szModName)'的東西來截斷它,然後把它與'szProcessName'比較。 –

+0

@JhonBrian你需要使用調試器告訴我們哪一行崩潰。這對幫助您正確編寫功能和/或確定您遇到的問題已經有了很大的幫助。鑑於此,我寫的是你需要做的明顯更正,因爲你原來的帖子顯然是錯誤的。 – PaulMcKenzie