Могу ли я найти смещение ресурса в файле EXE с C++?

Я пишу пользовательский модуль, который проверяет 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. Есть идеи как это исправить?

1 ответ

Как указывает @rodrigo, при загрузке PE-файла в память каждый из соответствующих разделов будет загружен в различные разделы памяти с заполнением между каждым разделом, а смещения разделов, а также размер самого модуля будут отличаться тем, что PE файл на диске. Здесь есть некоторая информация о том, как это работает.

На мой взгляд, есть два способа сделать то, что вы пытаетесь сделать. Вам нужно либо принять во внимание размер PE в памяти и основывать свои расчеты на этом - я считаю, что SizeOfImage член IMAGE_OPTIONAL_HEADER дает размер изображения, загруженного в память. Другой вариант - продолжать использовать размер PE-файла на диске, и в этом случае вы можете загрузить PE-файл в память как файл данных (вместо использования LoadLibrary) и работать в нем оттуда. В этом случае, если вам нужно извлечь смещение ресурсов и т. Д. Из файла, вам, вероятно, потребуется вручную проанализировать и просмотреть структуру файла PE - здесь есть отличная ссылка на эту структуру.

Другие вопросы по тегам