
Injetar DLLs no processo do explorer usando ícones
Esta é uma técnica de injeção de DLL no Windows Explorer que utiliza a caixa de diálogo de alteração de ícone no Windows.
Ela pode enganar os usuários para que carreguem uma DLL maliciosa no processo do explorer:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
Além disso, pode ser usada para injetar uma DLL de outro processo no explorer:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
Além de conter código, DLLs também são usadas para armazenar recursos como ícones. Na demonstração, você pode ver que os ícones padrão estão armazenados em shell32.dll:

Na verdade, nas versões modernas do Windows, eles estão armazenados em shell32.dll.mui, mas ainda são exibidos como shell32.dll
Para que o processo do explorer consiga exibir todos os ícones armazenados na DLL na caixa de diálogo, ele precisa carregar a DLL na memória para que ela possa ser analisada.
Além disso, DLLs no Windows têm a capacidade de definir uma função opcional DllMain, que é chamada quando a DLL é carregada ou descarregada usando as funções LoadLibrary e FreeLibrary.
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
Isso significa que, se uma DLL com uma função DllMain for carregada pelo explorer, o código definido na função DllMain será executado na memória do explorer.
E é exatamente isso que está sendo feito aqui. Além disso, a DLL está sendo disfarçada como um ícone:
O "ícone" é, na verdade, um simples arquivo DLL com extensão .ico que abre o aplicativo da calculadora com um recurso de ícone adicionado usando o Resource Hacker. (O ícone também pode ser adicionado no Visual Studio)
Existem algumas anomalias em relação à aparência do ícone na visualização de pastas. Testei isso em duas versões diferentes do Windows 10 (a mais recente e uma mais antiga) e no Windows 11.
Em ambas as versões do Windows 10, o ícone armazenado dentro da DLL não era exibido quando a extensão era alterada para .ico

Na versão mais recente do Windows 10, no entanto, funcionou até que eu tentasse abrir o "ícone" dentro do aplicativo de fotos. Desde então, não consegui recriar isso.

No Windows 11, a DLL disfarçada era exibida como um ícone normal na visualização do Explorer. Quando aberta no aplicativo de fotos, no entanto, um erro é exibido.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
Além de enganar um usuário para carregar a DLL manualmente, um atacante também tem a opção de usar esta técnica para injetar um arquivo DLL no processo do explorer programaticamente:
Primeiramente, uma pasta é criada no diretório temporário, e as propriedades da pasta são abertas usando SHObjectProperties. Para obter o identificador da janela independentemente do idioma do sistema, EnumWindows é usado com uma função de retorno de chamada que verifica o nome distinto da pasta em cada janela aberta.

Através da página de propriedades, a caixa de diálogo de alteração de ícone é invocada, cujo identificador também é obtido com EnumWindows. Por fim, o caminho do ícone é alterado para uma DLL (que possui extensão .ico neste caso), o que faz com que o explorer carregue a DLL após o botão OK ser pressionado.
Esta é uma forma muito furtiva de injetar uma DLL no processo do Explorer porque não utiliza a API usual de injeção de DLL. Ela produz dois popups curtos, que, no entanto, não são muito perturbadores. Portanto, pode ser usada como uma técnica de evasão de AV por um ator de ameaças para executar código através do processo legítimo do explorer ou para carregar um rootkit UMD.
Além disso, espalhar DLLs mascaradas como arquivos .ico pode ser um vetor de ataque interessante.
Para obter os identificadores de janela corretos, usei o Spy++, que é uma ferramenta instalada com o Visual Studio.

Muitos agradecimentos a Bill G., da Microsoft, pelo lindo ícone de pasta!
Obrigado, cara aleatório da internet, pelo lindo ícone de injeção!