2013-02-20 36 views
0

我正在寫一個自定義模塊來檢查EXE文件的一致性(這不是這個問題的一部分)。爲此,我需要知道EXE文件中某個資源的偏移量來計算EXE文件的大小身體,我需要檢查。我可以使用C++在EXE文件中找到資源的偏移量嗎?

我想出了下面的代碼,以獲得一個在strExeFilePath文件IDR_HTML_DLG資源的偏移:

int ncbOffsetInBytes = 0; 
HMODULE hModule = LoadLibrary(strExeFilePath); 
if(hModule) 
{ 
    HRSRC hRes = ::FindResource(hModule, MAKEINTRESOURCE(IDR_HTML_DLG), RT_HTML); 
    if(hRes) 
    { 
     long szLength = ::SizeofResource(hModule, hRes); 
     HGLOBAL hGlobal = ::LoadResource(hModule, hRes); 
     if(szLength && hGlobal) 
     { 
      BYTE* pData = (BYTE*)LockResource(hGlobal); 
      DWORD dwLast = (DWORD)(pData + szLength); 
      DWORD dwFirst = (DWORD)hModule; 

      ncbOffsetInBytes = dwLast - dwFirst; 
     } 
    } 

    ::FreeLibrary(hModule); 
    hModule = NULL; 
} 

但結果在ncbOffsetInBytes原來比EXE文件本身更大。任何想法如何糾正它?

+3

我認爲問題在於模塊沒有映射到單個塊的內存中,而是分成幾個部分:'.text',這裏的'.data',那裏的'.rcrc'。 ..而EXE的某些部分甚至可能根本就沒有加載! – rodrigo 2013-02-20 11:21:43

+0

如果您可以發佈一段簡單地在DLL中定義資源的代碼,我可以看看我能否幫助解決它? – 2013-02-20 11:31:03

+0

謝謝。我看到@羅德里戈點。你可能是對的,我在這裏沒有正確的軌道... – c00000fd 2013-02-20 11:34:05

回答

2

@rodrigo指出,當一個PE文件被加載到內存中時,每個相關部分將被加載到不同的內存部分中,每個部分之間填充,部分的偏移以及部分的大小模塊本身將不同於磁盤上的PE文件。有一些關於如何工作的信息here

正如我所看到的,有兩種方法可以做你想做的事情。你或者需要考慮內存中PE的大小,並根據你的計算 - 我相信SizeOfImage成員IMAGE_OPTIONAL_HEADER會將圖像大小載入內存。另一種選擇是繼續使用磁盤上PE文件的大小,在這種情況下,您可以將PE文件作爲數據文件加載到內存中(而不是使用LoadLibrary)並從那裏開始工作。在這種情況下,如果您需要從文件中檢索資源等的偏移量,您可能需要手動解析和抓取PE文件結構 - 對於此結構here有一個很好的參考。

+0

謝謝。好點子。我需要嘗試所有的...... – c00000fd 2013-02-20 12:06:33

+0

@ c00000fd:或者你可以讀這個[很好的答案](http://stackoverflow.com/questions/12396665/c-library-to-read-exe-version-from- LINUX/12486703#12486703)。它與'RT_VERSION'有關,但你的代碼可能非常相似。 – rodrigo 2013-02-20 14:56:05

相關問題