C ++ Как управлять Image Base API LoadLibrary - PullRequest
5 голосов
/ 11 сентября 2011

После перебазирования основной программы очень высоко в своей собственной базе изображений.

Как я могу гарантировать, что загружаемая dll загрузится в 0x400000

dllImageBase = LoadLibrary("test.dll");
printf("imagebase = 0x%x", dllImageBase);

Вместо этого я всегда получаю 0x4600000x400000

Мне нужно, чтобы моя первая dll-инструкция начиналась с 0x401000, раньше она начиналась с 0x600000 перед перебазированием

Команда для линкера для перебазирования -

#pragma comment( linker, "/BASE:8000000") 

Итак 0x400000на самом деле сейчас свободен, но по умолчанию он не используется ... так что я могу контролировать его там, где он должен быть перемещен.Может, какой-нибудь WIN32API?

Ответы [ 2 ]

5 голосов
/ 11 сентября 2011

Вам нужно будет отключить рандомизацию макета адресного пространства, чтобы загрузить DLL туда, куда вы хотите.Функция, разработанная, чтобы остановить вас от того, что вы пытаетесь сделать./ DYNAMICBASE опция компоновщика.Загрузка в 0x400000 работала, когда я попробовал это.

2 голосов
/ 11 сентября 2011

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

Если у вас есть файл карты, вы знаете, каково смещение данной функции.Поэтому вы можете использовать GetProcAddress, чтобы определить базовый адрес DLL.Это гораздо более безопасный способ работы, даже если это означает, что обновление вашей DLL нарушает код загрузки DLL.

...