GetProcAddress странный обратный адрес

Кто-то объясняет, почему следующий код возвращает указатель внутри ntdll.dll?

GetProcAddress(LoadLibraryA("kernel32.dll"), "EncodePointer");
GetProcAddress(LoadLibraryA("kernel32.dll"), "DecodePointer");

PS: если вызывать функцию, указанную в таблице экспорта kernel32, генерируется точка останова.

2 ответа

Решение

Это простой случай пересылки экспорта, как описано в одной из превосходных статей журнала MSDN Мэтта Пьетрека " Углубленный взгляд на формат исполняемых файлов Win32", часть 2.

Вы можете убедиться в этом сами с помощью такого инструмента, как Dependency Walker или мусорная корзина.

dumpbin /exports kernel32.dll | grep codePointer

    205   CC          DecodePointer (forwarded to NTDLL.RtlDecodePointer)
    240   EF          EncodePointer (forwarded to NTDLL.RtlEncodePointer)

Это называется перенаправление / перенаправление DLL или псевдоним функции. Определение экспортной записи:

entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]

Итак, имя входа можно определить

EncodePointer=ntdll.RtlEncodePointer

Проверять:

C:\>findaddress ntdll.dll RtlEncodePointer
ntdll.dll : 7C900000
RtlEncodePointer@ntdll.dll: 7C9132D9

C:\>findaddress kernel32.dll EncodePointer
kernel32.dll : 7C800000
EncodePointer@kernel32.dll: 7C9132D9

(findaddress - мой личный инструмент для быстрого выполнения этой задачи)

Вы можете увидеть больше здесь: http://msdn.microsoft.com/en-us/library/hyx1zcd3(v=vs.80).aspx

PS: я думаю, что это хороший вопрос. Это не так, если вы хотите написать небольшую программу (даже вредоносную) для исследовательских целей!

Другие вопросы по тегам