Esta biblioteca Rust e ferramenta CLI demonstra um método alternativo para encontrar o endereço base de DLLs carregadas sem usar uma caminhada pelo Process Environment Block (PEB). Essa técnica é particularmente útil em cenários onde a caminhada pelo PEB pode ser detectada ou bloqueada.
Diferenças entre Branches
Branch Principal
Usa o crate winapi e VirtualQuery para validação de memória
As funções da biblioteca (lib.rs) não têm instruções de impressão para integração limpa
A ferramenta CLI (main.rs) inclui saída de depuração para prova de conceito
Bom para aprender e entender a técnica
Branch OPSEC
Sem dependências externas - totalmente autocontido
Sem chamadas à API do Windows - usa acesso direto à memória com tratamento de exceções em vez de VirtualQuery
Sem instruções de impressão nas funções da biblioteca
Furtividade aprimorada - não faz chamadas de API
Melhor para implantes/ferramentas - deixa menos rastros e é mais difícil de detectar
Ambos os branches são seguros de usar, mas o branch OPSEC oferece benefícios adicionais de segurança operacional para cenários onde chamadas de API podem ser monitoradas ou bloqueadas.
Como Funciona
O programa usa uma abordagem de caminhada de pilha (stack walking) para localizar DLLs ao:
Acessando o Thread Environment Block (TEB):
Usa assembly inline para ler o ponteiro do TEB a partir do registrador de segmento GS (GS:[0x30])
Recupera a base da pilha (GS:[0x08]) e o limite da pilha (GS:[0x10]) do TEB
Caminhada de Pilha (Stack Walking):
Começa pelo ponteiro de pilha atual (RSP)
Percorre a pilha procurando endereços de retorno
Verifica cada endereço para memória executável
Branch Principal: Usa VirtualQuery para validar regiões de memória
Branch OPSEC: Usa acesso direto à memória com tratamento de exceções
Identificação de Módulo:
Para cada endereço de retorno potencial, verifica se ele aponta para memória executável
Quando memória executável é encontrada, caminha para trás para encontrar o cabeçalho PE
Valida o módulo verificando:
Assinatura MZ (cabeçalho DOS)
Assinatura PE
Características da DLL
Arquitetura de 64 bits
Nome do módulo a partir do diretório de exportação
Validação:
Verifica se o módulo é a DLL alvo consultando seu nome no diretório de exportação
Confirma que todas as estruturas do cabeçalho PE são válidas
Por Que Esta Abordagem?
Métodos tradicionais de encontrar DLLs geralmente envolvem percorrer a lista de módulos do PEB. Embora eficazes, essa abordagem pode ser:
Detectada por softwares de segurança
Bloqueada em determinados ambientes
Este método de caminhada de pilha oferece uma alternativa que:
Não depende do PEB
Pode funcionar em ambientes onde a caminhada do PEB é bloqueada