2015-09-03 5 views
15

Я прав, думая, что нет смысла восстанавливать наши DLL во время нашей сборки, если мы используем ASLR, так как dlls снова будут пересозданы, когда ядро ​​их загрузит?Указывает ли ASLR на перезагрузку DLL?

Я обеспокоен тем, что наше приложение часто используется на машинах служб терминалов. Таким образом, если перезагрузка происходит во время загрузки, мы можем в конечном итоге переупаковать dll для каждого процесса, в который они загружены (будет один процесс за сеанс). И это приведет к увеличению использования памяти и поискового вызова, чем мы хотим заплатить. Мне нужно беспокоиться?

Я нашел следующее сообщение в блоге, в котором говорится, что перезагрузка происходит только один раз, и она является системной: Matt Evans - Enabling ASLR for memory savings?. Я не видел никаких других ссылок об этом, поэтому просто хотел быть уверенным, что если я использую ASLR и не переустанавливаю во время нашей сборки, я не буду вызывать проблемы с памятью в окне служб терминалов?

+0

Еще одна ссылка на резервное копирование бит «один раз и в системе»: Windows Internals, шестое издание, часть 2, с.249 говорит об этом напрямую. –

+0

И вы пытались прикреплять отладчики к нескольким процессам (в разных сеансах) в окне «Службы терминалов»? Это должно показать, какой адрес вашей библиотеки DLL. –

+0

https://blogs.msdn.microsoft.com/oldnewthing/20170118-00/ –

ответ

1

Так что, основываясь на моем чтении, у вас не должно быть проблем. ASLR заставляет dll загружаться в полуакустический адрес памяти и не должен просто начинать перезагрузку для каждого процесса. Если вы хотите проверить использование памяти dll в памяти, есть бесплатный инструмент MassiveRebase, который позволяет динамически загружать две библиотеки dll и просматривать информацию об их использовании в памяти. Он был разработан для просмотра изменений, которые могут быть сохранены в памяти. Инструмент и многое другое можно найти здесь: http://www.tmurgent.com/appv/index.php/en/resources/tools/137-massive-rebase

Надеюсь, это поможет.

-3

Rebasing по-прежнему полезно. Когда операционная система загружается, она применяет фиксированное случайное значение к базе DLL.

В результате загружается DLL, типичная для одной загрузки, но отличается между машинами и ботинками.

Это означает, что данная DLL в процессе обработки процессов может быть разделена между процессами, так как все ее данные кода совместно используются с одним и тем же значением.

Когда DLL перемещается, потому что это адресное пространство занято, оно должно изменять исправления, и меньше DLL является общим, что увеличивает загрузку системы.

Если ваша DLL не используется совместно, это не влияет на ресурсы.

Стоимость исправления DLL была дешевле, если она была загружена в нужное место, не уверен, что это верно для ASLR, но все же может сохранить время загрузки ресурса.

+0

Когда вы говорите, что «rebasing все еще полезно», вы имеете в виду, что полезно вручную переустанавливать мои dll перед отправкой? Если да, то почему? Или, вы имеете в виду, что это все еще полезно, но мне не нужно это делать самому, потому что ASLR всегда делает перезагрузку во время выполнения, независимо от каких-либо ручных операций, которые я делаю или не делаю перед отправкой? –

+0

Aslr не перемещает DLL random; y. Без aslr, если вы столкнетесь, вы получите их с aslr. Полагаю, что это замедлит загрузку и увеличит использование системной памяти (меньше разделяемой памяти) – mksteve

+2

https://blogs.msdn.microsoft.com/oldnewthing/20170118-00/?p=95205 –