Perguntas sobre carregamento de DLL em um espaço de endereço do processo
Bem, li vários artigos de Matt Pietrek sobre arquivos Portable Executable (PE), como:
Uma análise aprofundada do formato de arquivo executável portátil do Win32,Parte 1 eParte 2Artigo do MSJ sobre vinculadoresArtigo do MSJ no formato COFFAlém disso, li algumas outras fontes sobre o assunto. Sou eu que negligencio algumas partes ou as perguntas não são respondidas lá.
Então, aqui estão as perguntas:
Sabe-se que, ao carregar um EXE, o Windows Loader lê a lista de DLLs importadas da IAT (Importa Address Table) e as carrega no espaço de endereço do processo.
O espaço de endereço do processo é um espaço virtual. A DLL já pode ter sido carregada em algum espaço físico. Isso acontece para DLLs comoKERNEL32.dll
ouUSER32.dll
. Qual é a relação entre o endereço físico e o virtual? O carregador apenas aloca páginas e copia a DLL ou faz referências?
Se uma DLL não estiver carregada, o Loader carrega toda a DLL ou apenas as funções necessárias? Por exemplo, se você usou a funçãofoo()
debar.dll
, o carregador carrega todo obar.dll
no espaço de endereço do processo? Ou apenas carrega ofoo
código no espaço de endereço do processo?
Suponha que seu arquivo EXE use a funçãoMessageBox()
deUSER32.DLL
, que reside em%WINDIR%\system32\user32.dll
. Você pode desenvolver um personalizadoUSER32.DLL
, coloque-o no mesmo diretório que o arquivo EXE e espere que o seu arquivo personalizadoMessageBox
é chamado pelo seu aplicativo em vez do padrão do sistemaMessageBox
?