
Carregador dinâmico de shellcode com capacidades sofisticadas de evasão
AsmLdr é um loader de shellcode avançado implementado em linguagem assembly x64, projetado para ambientes Windows x64. Seu propósito principal é executar payloads criptografados enquanto minimiza a detecção por softwares antivírus avançados, sistemas de detecção e resposta de endpoint (EDR), sandboxes e depuradores. Ele consegue isso resolvendo módulos, APIs e chamadas de sistema dinamicamente em tempo de execução, eliminando dependências estáticas como tabelas de importação ou endereços fixos. Essa abordagem cria um binário compacto com baixo perfil de detecção.
O loader usa module stomping para colocar o shellcode em uma seção executável de uma DLL existente, descriptografa o payload na memória e o executa via syscalls indiretas com stack spoofing. Ele inclui recursos de evasão, como medidas anti-debugging, ajustes de temporização para imitar padrões normais de aplicativos e bypass do rastreamento de eventos do Windows (ETW). Essas capacidades o tornam uma ferramenta para red teaming e pesquisa de segurança. Aviso Ético: Este projeto é apenas para fins educacionais e de pesquisa. Ele demonstra internals de baixo nível do Windows, incluindo travessia do PEB, parsing da tabela de exportação, unhooking de syscalls e manipulação da proteção de memória. Use em ambientes controlados (ex.: VMs). O uso indevido para atividades maliciosas é ilegal e antiético. O autor se isenta de responsabilidade por qualquer uso indevido.
AsmLdr oferece uma gama de recursos para execução furtiva de payloads e evasão. Cada um é descrito abaixo, com foco em sua função e benefícios:
Resolução de Módulos via Travessia do PEB: O loader lista os módulos em execução seguindo a cadeia de módulos do PEB. Ele compara nomes de módulos usando comparações Unicode para encontrar e retornar o endereço base da DLL desejada. Esse método ignora funções de carregamento padrão, reduzindo o risco de interceptação.
Resolução de APIs a partir de Tabelas de Exportação: O loader examina o diretório de exportação de uma DLL para localizar funções. Ele combina APIs usando hashing ou, opcionalmente, verificações diretas de nome com validação de comprimento para evitar confusão entre nomes de funções semelhantes. Isso fornece o endereço da função sem depender de importações pré-vinculadas.
Proteções Anti-Debugging: O loader detecta depuração por meio de múltiplas verificações e sai de forma limpa se qualquer uma indicar análise.
Geração de Código Lixo para Resistência à Análise: O loader executa sequências de operações não essenciais para criar padrões confusos na desmontagem, dificultando a análise estática sem impactar a eficiência em tempo de execução.
Normalização de Temporização e Comportamento: O loader mede a velocidade do sistema para executar cargas de trabalho simuladas que correspondem aos padrões normais de aplicativos, ajudando a se misturar com processos legítimos. Ele também pausa brevemente antes de ações-chave para normalizar o tempo de execução.
Bypass de Registro do ETW: O loader configura breakpoints de hardware em APIs de registro do ETW para interceptar e pular chamadas de registro de eventos, prevenindo rastros nos logs do sistema.
Unhooking em Múltiplas Camadas: O loader recupera dinamicamente números de chamadas de sistema válidos (SSNs) verificando funções diretamente, varrendo o código próximo se estiver com hook, ou contando padrões na ntdll para estimar o número, ajustando para exceções conhecidas.
Técnicas utilizadas:
Syscall Indireto e Stack Spoofing: O loader encontra caminhos de código limpos na ntdll para chamadas de sistema e encadeia até 32 operações, ocultando a pilha de chamadas para evitar rastreamento. Ele restaura o estado original após a conclusão.
DLL Hollowing: O loader carrega uma DLL alvo, permite temporariamente escrita em sua seção de código, insere o shellcode criptografado, descriptografa e redefine as proteções para somente execução.
Descriptografia em Memória: O loader descriptografa o shellcode aplicando um padrão de chave repetida diretamente na memória injetada.
Funções Utilitárias: O loader inclui ferramentas para medir comprimentos de strings, comparar strings (caracteres padrão ou largos), gerar hashes de nomes para buscas, validar ponteiros de memória e ler timestamps para controles de temporização.
O script Python generate.py criptografa o arquivo de shellcode bruto. Ele adiciona padding para alinhamento, cria ou usa uma chave e aplica XOR em cada byte com a chave em um ciclo repetido. O arquivo de saída shellcode.asm define tamanhos, arrays para os dados criptografados e a chave, e uma rotina para carregar os dados em tempo de execução. A descriptografia do loader corresponde a esse processo na memória. Observe que chaves mais longas aumentam o tempo de espera.
Prepare um binário de shellcode bruto (ex.: payload.bin). Execute python generate.py payload.bin [optional_key] para produzir shellcode.asm.
Modifique szDllName (palavras hexadecimais Unicode em evader.asm) para DLLs alternativas como urlmon.dll. Recalcule os hashes DJB2 para novas APIs usando a lógica str_hash. Comente as macros (ex.: KILL_DEBUGGERS) para depuração.
AsmLdr é otimizado para Windows 10 e 11 x64; atualizações do kernel podem alterar offsets (ex.: PEB+0x18) ou padrões da NTDLL (ex.: 0xb8d18b4c), exigindo validação. O tratamento de erros depende de retornos NTSTATUS (ex.: <0 indica falha), sem registro em log integrado. Operações lixo e falsas consomem ciclos de CPU, podendo alertar monitores de recursos em sistemas limitados. Use somente em ambientes controlados.