2012-02-29 3 views
0

Я пытаюсь получить адрес GetProcAddress с GetProcAddress (да, вызывая его сам по себе). Когда я делаю это из пустого проекта exe, я получаю действительный адрес (между выделенным адресом kernel32).getprocaddress, действующая отличная от dll и exe

Когда я звоню его из библиотеки DLL, я получаю неверный адрес (не в пределах выделенного kernel32)

В чем разница? Я работаю на Windows 7 с 64 бит.

Проект составлен как 32 бит. Вот код, который я использую:

typedef FARPROC (WINAPI * GetProcAddressType) (HMODULE, LPCSTR);

Ядро HMODULE32Hmodule = LoadLibraryW (L "c: \ windows \ system32 \ kernel32.dll");

GetProcAddressType abc = (GetProcAddressType) GetProcAddress (kernel32Hmodule, "GetProcAddress");

Я также попытался получить адрес следующим образом: void * a = GetProcAddress; , но он возвращает тот же неверный адрес при работе с dll ...

Пожалуйста, помогите.

ответ

0

ok Я нашел проблему. когда я загрузил dll с rundll32, он действовал странно ... когда я сам создавал загрузчик (loadlibrary, чем getprocaddress), он работал нормально. rundll32 является причиной проблем

0

Exe обычно загружаются по их предпочтительным адресам, DLL часто перемещаются (не загружаются по их предпочтительным адресам), когда они выбирают ASLR и когда требуется перемещение (например, их предпочтительный адрес уже сделан). Это может объяснить дельту, которую вы испытали между поведением.

+0

Kernel32.dll не перемещается. Смещения ASLR не изменяются до перезагрузки. –

+0

Правильный Ханс, я забыл это, спасибо! Вот почему я написал «мог бы объяснить ...» :-) – mox

+0

ok, я нашел проблему. Когда я загрузил dll с rundll32, он действовал странно ... когда я сам создавал загрузчик (loadlibrary, чем getprocaddress), он работал нормально. rundll32 является причиной проблем –

Смежные вопросы