Я пытался сделать это около двух дней, но безуспешно. Я перечитал много уроков по формату файлов PE безрезультатно.
Я отображаю 32-битный исполняемый файл в память через CreateFileMapping, который работает отлично. Затем моя программа просматривает заголовки разделов и проверяет характеристики на соответствие характеристикам по умолчанию (чтобы убедиться, что раздел является исполняемым и имеет код). Если это правда, программа возвращает указатель (PIMAGE_SECTION_HEADER) на этот заголовок раздела (пока программа работает отлично).
Теперь, когда у меня есть указатель, есть две конкретные записи в структуре, которые сбили меня с толку, и это PointerToRawData и VirtualAddress, когда я присматриваю записи;
VirtualSize = 4096, PointerToRawData = 1536.
Из того, что я прочитал в документации PE, это то, что PointerToRawData является предполагаемым смещением (RVA ???) к первому байту данных в разделе на диске (я прав?), И является кратным значения выравнивания (512 ). Вопрос в том, что я должен установить это значение, чтобы получить указатель, который я могу использовать для доступа к данным раздела. Для файла с отображением в память лучше использовать (значение VirtualAddress + значение imagebase), чтобы найти первый байт раздела?
Еще одна проблема — VirtualSize против SizeOfRawData. Это смутило меня, потому что в этой статье — http://msdn.microsoft.com/en-us/library/ms809762.aspx, он говорит: «Поле SizeOfRawData (кажется немного неправильным) позже в структуре содержит округленное значение», но мой VirtualSize больше моего значения SizeOfRawData, что привело к путанице в отношении того, какой из них мне следует использовать.
Цель этой программы — найти исполняемый раздел (раздел .text), выполнить побитовую операцию над всеми битами в разделе и завершить операцию перед следующим разделом.
Я не хочу, чтобы это выглядело так, как будто я ожидаю кормления с ложечки, я просто хочу пояснений.
Спасибо за ваше время / помощь, это ценится.
У меня не оказалось под рукой спецификации или какого-либо PE-кода для справки (я пишу это на своем iPad со своего дивана;), но ключевой момент, который нужно понять, состоит в том, что есть два режимы рассмотреть: все разговоры о RVA актуальны только тогда, когда PE отображается в памяти и выравнивание происходит выравнивание страницы. Когда вы читаете файл с диска, смещения — это смещения файла, и каждый раздел использует выравнивание файла.
Надеюсь, это поможет.
Других решений пока нет …