
Para quando DLLMain é a única opção
Para quando DLLMain é a única opção
LdrLockLiberator é uma coleção de técnicas para escapar ou, de outra forma, dispensar o Loader Lock ao executar seu código a partir de DllMain ou em qualquer outro lugar onde o bloqueio possa estar presente. Foi lançado em conjunto com o artigo "Perfect DLL Hijacking". Nós lhe damos a chave para destravar o carregador de bibliotecas e fazer o que quiser com o seu carregador (no seu próprio computador)!
As técnicas são projetadas para serem universais, limpas e 100% seguras sempre que possível. Elas são projetadas para funcionar sem modificar a proteção de memória ou ponteiros. Isso é importante para permanecer compatível com mitigações modernas de exploração. A única arquitetura oficialmente suportada é x86-64 (32 bits está praticamente extinto).
Quer aprender as razões arquiteturais pelas quais DllMain é tão problemático no Windows enquanto sistemas operacionais do tipo Unix não enfrentam dificuldades aqui? Por favor, fique à vontade!.
É exatamente o que parece. Destrave o Loader Lock, defina os eventos do loader e inverta LdrpWorkInProgress. É recomendado manter RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN indefinido para a melhor estabilidade.
NÃO USE ESTA TÉCNICA EM CÓDIGO DE PRODUÇÃO. Isso foi criado como um subproduto da minha pura curiosidade e vontade de não deixar nenhuma pedra sem virar. Qualquer coisa que você fizer com este código é por sua conta.
Usamos o atexit da CRT, tipicamente usado por EXEs, em nosso código de DLL para escapar do Loader Lock quando o programa termina. Para cargas dinâmicas (usando LoadLibrary), isso se torna 100% seguro ao fixar (LDR_ADDREF_DLL_PIN) nossa biblioteca com LdrAddRefDll, para que um FreeLibrary subsequente não remova nossa DLL da memória.
Em breve!
Os exemplos fornecidos sequestram MpClient.dll de C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. Instruções são fornecidas nos comentários do código-fonte para adaptar facilmente isso a qualquer outra combinação de DLL e programa (principalmente apenas atualizando os exports para cargas estáticas)!
Como prova de conceito, executamos ShellExecute como payload padrão. No entanto, você pode fazer com que isso faça qualquer coisa que quiser!
O LdrLockLiberator.c na raiz deste projeto foi testado para compilar no Visual Studio 2022.
Vincule ao NTDLL selecionando o projeto atual do Visual Studio na janela Solution Explorer e navegando até Project > Properties na barra de menus. Nos menus suspensos Configuration no topo, selecione All Configurations e All Platforms. Agora, vá para Linker > Input e acrescente a Additional Dependencies: ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) até LdrLockLiberatorWDK neste repositóriobuildPronto! Sua DLL está compilada e pronta para uso!
Como alternativa ao WDK, compilar com MinGW provavelmente também funcionaria.
MIT License - Copyright (C) 2023-2024 Elliot Killick [email protected]