несовпадение смещений между DLL, загруженной в память и на жесткий диск

0

Таким образом, в основном то, что я пытаюсь сделать, это изменить некоторые строки в DLL (время выполнения), чтобы сделать это, я открыл DLL, используя "hxd", и нашел строки, которые я позже буду менять, скопировал смещения из начало DLL для каждой строки и ее сохранение.

Во время выполнения я использовал LoadLibrary() и извлекал информацию о деталях модуля, используя GetModuleInformation(). это найти абсолютную начальную точку DLL в памяти. Я вычислил реальный адрес строк, используя 'lpBaseOfDll', полученный GetModuleInformation(), и смещения, найденные ранее. Поскольку я не смог выполнить эту задачу успешно, я решил изучить эти адреса во время выполнения и понял, что есть смещения в 6000 байтов из того, что я ожидал увидеть, я прочитал, что при загрузке DLL окна выделяют дополнительные 4 Кбит для пейджинг и т.д., но я не уверен, действительно ли это так.

Спасибо за вашу помощь!

Теги:
dll

1 ответ

1

Может быть ASLR, если он включен для вашего приложения, но я не уверен, что он влияет на ваши строки также или только на стек, кучу, TIB и так далее.

Но, поскольку вы, кажется, всегда получаете ту же самую разницу в смещении, мне приходит в голову следующее: выравнивание секций во время загрузки.

Когда ваша программа/библиотека загружается и копируется в память, все секции будут выровнены с определенной границей - они "расширятся", если вы это сделаете. Таким образом, скопированный файл в памяти эффективно становится больше, чем тот, который вы сохранили на вашем жестком диске. См. Рисунок 1 в этой статье:

http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

Поскольку это не просто общее выравнивание файлов для всей программы/библиотеки, но коррекция выравнивания по каждому участку, вы получите разные смещения в каждом разделе. Ваши строки хранятся в одном разделе, и поскольку предыдущие разделы расширялись, как описано, вы получаете разницу в 6000 раз.

Формат PE знает о каждом разделе raw-address (RA) и виртуальном адресе (VA [или RVA для относительного виртуального адреса]). RA - это смещение в вашем файле (для которого ваш ручной расчет работает нормально), но VA - это тот, который важен во время выполнения. Также как примечание стороны: само выравнивание раздела хранится в "Необязательном заголовке" изображения (см. Http://msdn.microsoft.com/en-us/library/windows/desktop/ms680339%28v=vs.85 % 29.aspx).

Поэтому я предлагаю вам узнать, в каком разделе хранятся ваши строки, и либо вычислить смещение раздела (VA во время выполнения) самостоятельно, либо проанализировать PE-заголовок и напрямую просмотреть VA этого раздела. Затем вы можете рассчитать абсолютное смещение вашей строки в памяти (раздел base VA + строковое смещение относительно базы VA).

Но это все просто предположение, вам нужно будет убедиться, что вы полностью уверены.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню