Итак, я пытался прочитать DLL-файл, все было хорошо, пока я не дошел до дополнительных каталогов данных заголовка, в частности его первого члена, таблицы экспорта.
Моя проблема в том, что я не могу двигаться смещение моего считывателя, потому что виртуальный адресный элемент основан на памяти VA, а мой читатель основан на смещении файла. Может помочь визуальный пример:
Как видите, загруженный виртуальный адрес, который этот просмотрщик PE читает по адресу таблицы экспорта из каталога данных (необязательный заголовок), является значение 0x00002630 (теперь будем называть его hex1).
Однако, когда я нажимаю на таблицу экспорта, чтобы увидеть фактическое содержимое, программа выполняет преобразование этого адреса из памяти в смещение файла, перенаправляя меня по этому адресу в результате:
Адрес, который он перенаправляет мне, является 0x00001a30 (давайте теперь будем называть его hex2).
Я провел несколько тестов самостоятельно, например, разделив hex1 на 8, потому что я думал, что это может быть переход от выравнивания памяти, равного 4096, и выравнивания файла, равного 512, но он не дал мне тот же результат, что и hex2. Я также сделал несколько странных вещей, чтобы попытаться получить эту формулу, но это дало мне еще более странные результаты.
Итак, мой вопрос был бы, как я могу получить / рассчитать смещение этого файла (hex2), если я только знать смещение памяти в каталоге данных (hex1)?