Порядок поиска DLL при загрузке PE лоадером
От: mossad_re  
Дата: 17.02.17 10:17
Оценка:
Доброго времени суток.
Столкнулся с желанием написать dll с теме же самыми функциями что и user32.dll но не переписывая функцианал а в виде заглушек, перенаправляющие на настоящее USER32.dll.
Ранее я читал что загрузчик PE файла при загрузке укзанных в таблице импорта DLL сначала ищет соответствующую DLL в той-же директории что и сам исполняемый файл.
Я написал простенькую DLL и EXE (сконфигурировав проект DLL так что кроме kernel32.dll в таблице импорта результирующих файлов ничего не имеет).

DLL(USER32.dll):
#include <Windows.h>

#define EXP __declspec(dllexport)
int typedef WINAPI MessageBoxAZ( HWND,LPCSTR ,LPCSTR ,UINT);
MessageBoxAZ *MessageBoxAZ_;
extern "C"
{
    BOOL WINAPI _DllMainCRTStartup(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 
    {
        return TRUE;
    }
    EXP int WINAPI MessageBoxA( HWND hWnd,  LPCSTR lpText,  LPCSTR lpCaption,  UINT uType)
    {
        MessageBoxAZ_ = (MessageBoxAZ*)GetProcAddress(LoadLibraryA("User32.dll"), "MessageBoxA");
        return MessageBoxAZ_(0, "Local", 0, 0);
    }
}


EXE:
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
    MessageBoxA(0, "", 0, 0);
    return 0;
}


Разместив свой USER32.dll в папке с EXE я увидел что по прежнему загружается C:\Windows\Sysytem32\User32.dll а не мой.
Тогда я перебил в таблице импорта EXE(HEX редактором) USER32.dll на USER33.dll и переименовал совою DLL соответственно.
Всё стало хорошо — грузилась именно моя DLL.

Подскажите в чём особенность загрузки именно системных DLL PE загрузчиком?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.