0

EXEファイルの整合性をチェックするカスタムモジュールを作成しています(これはこの質問の一部ではありません)。そのために、EXEファイル本体のサイズを計算するためにEXEファイル内の特定のリソースのオフセットを知る必要があります。確認する必要があります。

ファイルIDR_HTML_DLG内のリソースのオフセットを取得するために、次のコードを思いつきました。strExeFilePath

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ファイル自体よりも大きくなります。それを修正する方法はありますか?

4

1 に答える 1

2

@rodrigoが指摘しているように、PEファイルがメモリにロードされると、関連する各セクションが異なるメモリセクションにロードされ、各セクション間のパディング、セクションのオフセット、およびモジュール自体のサイズがディスク上の PE ファイルとは異なります。これがどのように機能するかについての情報がここにあります。

私が見ているように、あなたがやろうとしていることを行うには2つの方法があります..メモリ内のPEのサイズを考慮し、それに基づいて計算する必要があります-のSizeOfImageメンバーがIMAGE_OPTIONAL_HEADER画像サイズを与えると思いますメモリにロードされます。もう 1 つのオプションは、ディスク上の PE ファイルのサイズを引き続き使用することです。この場合、PE ファイルを (を使用するのではなくLoadLibrary) データ ファイルとしてメモリにロードし、そこから作業することができます。この場合、リソースなどのオフセットをファイルから取得する必要がある場合は、おそらく手動で PE ファイル構造を解析してクロールする必要があります。この構造に関する優れたリファレンスがここにあります

于 2013-02-20T11:52:14.593 に答える