Могу ли я найти смещение ресурса в файле 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 - здесь есть отличная ссылка на эту структуру.