Доброго времени суток.
Столкнулся с желанием написать 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 загрузчиком?