Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
ThreadStackSpoofer — Thread Stack Spoofing - PoC para uma técnica avançada de evasão na memória que permite ocultar melhor a alocação de memória do shellcode injetado de scanners e analistas. | Kitploit
Ferramentas/GitHubGitHub/mgeeky/threadstackspoofer
Frameworks de Testes de PenetraçãoFrameworks de ExploraçãoForensia de MemóriaShellcodeAnálise de MalwareRed TeamingDesenvolvimento de Payloads
GitHubmgeeky/threadstackspoofer

ThreadStackSpoofer

Thread Stack Spoofing - PoC para uma técnica avançada de evasão na memória que permite ocultar melhor a alocação de memória do shellcode injetado de scanners e analistas.

Ver Repositório
1.2k19219há 4 anosRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Prova de Conceito de Spoofing de Pilha de Thread / Spoofing de Pilha de Chamadas

Uma implementação de PoC para uma técnica avançada de evasão em memória que falsifica a Pilha de Chamadas de Thread. Esta técnica permite contornar regras de exame de memória baseadas em thread e ocultar melhor shellcodes enquanto estão na memória do processo.

Introdução

Esta é uma implementação de exemplo para a técnica Thread Stack Spoofing com o objetivo de evadir Analistas de Malware, AVs e EDRs que procuram referências aos frames do shellcode na pilha de chamadas de uma thread examinada. A ideia é esconder referências ao shellcode na pilha de chamadas da thread, mascarando assim alocações que contêm o código do malware.

A implementação, juntamente com o meu ShellcodeFluctuation, traz para a comunidade de Segurança Ofensiva implementações de exemplo para acompanhar o que é oferecido por produtos C2 comerciais, para que possamos fazer o mesmo em nossas ferramentas de Red Team. 💪

A implementação mudou

A implementação atual difere bastante do que foi originalmente publicado. Isto porque percebi que existe uma abordagem muito mais simples para terminar o processamento da pilha de chamadas da thread e ocultar os frames relacionados ao shellcode, simplesmente escrevendo 0 no endereço de retorno do primeiro frame que controlamos:

void WINAPI MySleep(DWORD _dwMilliseconds)
{
    [...]
    auto overwrite = (PULONG_PTR)_AddressOfReturnAddress();
    const auto origReturnAddress = *overwrite;
    *overwrite = 0;

    [...]
    *overwrite = origReturnAddress;
}

A implementação anterior, que utilizava StackWalk64, pode ser acessada neste commit c250724.

Esta implementação é muito mais estável e funciona bem tanto em Debug como em Release nas duas arquiteturas – x64 e x86.

Demonstração

É assim que uma pilha de chamadas pode parecer quando NÃO está falsificada:

not-spoofed

Isto, por sua vez, quando o spoofing da pilha de threads está ativado:

spoofed

Acima podemos ver que o último frame na nossa pilha de chamadas é o nosso callback MySleep. Alguém pode perguntar se isso imediatamente traz novas oportunidades de IOCs? Regras de caça podem procurar threads cujas pilhas de chamadas não se desenrolam para os seguintes pontos de entrada esperados da thread, localizados em bibliotecas do sistema:

kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21

No entanto, a pilha de chamadas da thread falsificada pode parecer um pouco estranha à primeira vista; um breve exame do meu sistema mostrou que também existem outras threads que não se desenrolam para os pontos de entrada acima:

pilha de chamadas legítima

A captura de tela acima mostra uma thread do Total Commander x64 não modificado. Como podemos ver, a sua pilha de chamadas se assemelha bastante à nossa em termos de frames iniciais da pilha.

Por que deveríamos nos preocupar em falsificar cuidadosamente a nossa pilha de chamadas quando existem processos que exibem características que podemos simplesmente imitar?

Como funciona?

O algoritmo geral é o seguinte:

  1. Ler o conteúdo do shellcode do ficheiro.
  2. Adquirir todos os ponteiros de função necessários de dbghelp.dll, chamar SymInitialize
  3. Interceptar (hook) kernel32!Sleep apontando de volta para o nosso callback.
  4. Injetar e lançar o shellcode via VirtualAlloc + memcpy + CreateThread. A thread deve começar a partir da nossa função runShellcode para evitar que o StartAddress da thread aponte para algo inesperado e anómalo (como ntdll!RtlUserThreadStart+0x21)
  5. Assim que o Beacon tentar dormir, o nosso callback MySleep é invocado.
  6. Em seguida, sobrescrevemos o último endereço de retorno na pilha com 0, o que efetivamente deve terminar a pilha de chamadas.
  7. Finalmente, é feita uma chamada a ::SleepEx para permitir que o Beacon durma enquanto aguarda mais comunicação.
  8. Depois que o Sleep termina, restauramos os endereços de retorno originais da função previamente guardados e a execução é retomada.

Os endereços de retorno das funções estão espalhados por toda a área de memória da pilha da thread, apontados pelo registo RBP/EBP. Para encontrá-los na pilha, precisamos primeiro recolher os ponteiros de frame e depois desreferenciá-los para sobrescrever:

pilha de quadros

(a imagem acima foi retirada do post de Eli Bendersky chamado Stack frame layout on x86-64)

	*(PULONG_PTR)(frameAddr + sizeof(void*)) = Fake_Return_Address;

A implementação inicial do ThreadStackSpoofer fazia isso nas funções walkCallStack e spoofCallStack, no entanto a implementação atual mostra que esses esforços não são necessários para manter uma pilha de chamadas furtiva.

Exemplo de execução

Caso de uso:

C:\> ThreadStackSpoofer.exe <shellcode> <spoof>

Onde:

  • <shellcode> é o caminho para o ficheiro do shellcode
  • <spoof> quando 1 ou true ativa o spoofing da pilha de threads; qualquer outra coisa desativa-o.

Exemplo de execução que falsifica a pilha de chamadas da thread do beacon:

PS D:\dev2\ThreadStackSpoofer> .\x64\Release\ThreadStackSpoofer.exe .\tests\beacon64.bin 1
[.] Reading shellcode bytes...
[.] Hooking kernel32!Sleep...
[.] Injecting shellcode...
[+] Shellcode is now running.
[>] Original return address: 0x1926747bd51. Finishing call stack...

===> MySleep(5000)

[<] Restoring original return address...
[>] Original return address: 0x1926747bd51. Finishing call stack...

===> MySleep(5000)

[<] Restoring original return address...
[>] Original return address: 0x1926747bd51. Finishing call stack...

Como usar?

Observe o código e a sua implementação, entenda o conceito e reimplemente-o nos seus próprios Carregadores de Shellcode que você utiliza nas suas atividades de Red Team. Esta é mais uma técnica de evasão avançada em memória que aumenta as chances da sua Equipe de não ser detectada por Antivírus, EDRs e Analistas de Malware que estão a analisar os seus implantes.

Ao desenvolver o seu carregador de shellcode avançado, você também pode querer implementar:

  • Criptografia do Heap do Processo – inspire-se neste post do blog: Hook Heaps and Live Free – que pode permitir evadir extratores de configuração do Beacon como o BeaconEye
  • Alterar a proteção das páginas de memória do seu Beacon para RW (de RX/RWX) e criptografar o seu conteúdo – usando a técnica Shellcode Fluctuation – imediatamente antes de dormir (o que pode evadir scanners como o Moneta ou o pe-sieve)
  • Limpar quaisquer resquícios do Carregador Refletivo para evitar deteções baseadas em assinaturas em memória
  • Remover todos os hooks que você possa ter instalado (como AMSI, ETW, WLDP) antes de dormir e depois reaplicá-los.

Na verdade, isto ainda não é um verdadeiro spoofing de pilha

Baixar ferramenta