Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
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
TamperingSyscalls — Biblioteca C++ que recupera e falsifica argumentos de syscall do Windows usando breakpoints de hardware e manipuladores de exceção para subverter a telemetria do EDR. | Kitploit
Ferramentas/GitHubGitHub/rad9800/tamperingsyscalls
Evasão de IDS/IPSPós-ExploraçãoRed TeamingDesenvolvimento de Payloads
GitHubrad9800/tamperingsyscalls

TamperingSyscalls

Biblioteca C++ que recupera e falsifica argumentos de syscall do Windows usando breakpoints de hardware e manipuladores de exceção para subverter a telemetria do EDR.

Ver Repositório
508766há 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

TamperingSyscalls

TamperingSyscalls é um projeto inovador em 2 partes que consiste em spoofing de argumentos e recuperação de syscalls, ambos abusando de EH para subverter EDRs. Este projeto consiste em ambos os projetos para fornecer uma solução alternativa às syscalls diretas.

Adulterando syscalls.

  1. Configure um EH global que será usado posteriormente.
root@kitploit:~
SetUnhandledExceptionFilter( OneShotHardwareBreakpointHandler );
  1. Defina um breakpoint de hardware no endereço de uma instrução syscall que tenha os bytes 0f05 no registrador Dr0. Podemos localizar o endereço do stub de syscall com esta rápida busca de bytes na memória.
root@kitploit:~
BYTE stub[] = { 0x0F, 0x05 };
for( unsigned int i = 0; i < (unsigned int)25; i++ )
{
	if( memcmp( (LPVOID)((DWORD_PTR)function + i), stub, 2 ) == 0 ) {
		return (LPVOID)((DWORD_PTR)function + i);
	}
}
  1. Então podemos fazer uma chamada a esta função passando NULL para os argumentos <=4 (que tendem a ser os argumentos mais importantes, contendo informações como handles de processo, etc.). Também definimos o EnumState para o Enum correspondente a esta função (para que possamos corrigir os argumentos posteriormente).
  2. Embora o EDR tenha introspecção completa sobre nossos argumentos, ele não pode decidir com confiança que estamos realizando uma ação maliciosa, pois passamos NULL como os primeiros <=4 argumentos.
  3. O EDR então retornará o número do syscall (SSN) e o armazenará em RAX. Se você estiver interessado apenas em recuperar syscalls,
confira o branch stripped deste repositório.
  • O programa então flui para a instrução syscall { 0x0F, 0x05 }, que atinge o breakpoint que definimos anteriormente. Isso lançará uma exceção SINGLE_STEP que será tratada pelo exception handler que configuramos no Passo 1.
  • root@kitploit:~
    if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
    
    1. Este exception handler desabilitará o breakpoint de hardware para Dr0 somente se Dr0 e RIP coincidirem, definindo o valor apontado pelo registrador Dr0 como 0 (que deve ser o RIP atual).
    root@kitploit:~
    if( ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP )
    {
    	if( ExceptionInfo->ContextRecord->Dr7 & 1 ) {
    		if( ExceptionInfo->ContextRecord->Rip == ExceptionInfo->ContextRecord->Dr0 ) {
    			ExceptionInfo->ContextRecord->Dr0 = 0;
    
    1. Em seguida, corrigiremos os registradores restantes que definimos anteriormente como NULL. O motivo de serem 4 é que a convenção de chamada x64 determina o uso de RCX, RDX, R8, R9 para os primeiros 4 argumentos, e o restante é configurado na pilha. É possível configurar manualmente os parâmetros >4 na pilha, mas isso está além do escopo deste projeto, pois exigiria assembly inline. O motivo de ser R10 e não RCX é que no início de todo stub de syscall há mov r10, rcx, pois o registrador RCX é destruído nas próximas instruções.
    root@kitploit:~
    case NTMAPVIEWOFSECTION_ENUM:
    	ExceptionInfo->ContextRecord->R10 =
    		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->SectionHandle;
    
    	ExceptionInfo->ContextRecord->Rdx =
    		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ProcessHandle;
    
    	ExceptionInfo->ContextRecord->R8 =
    		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->BaseAddress;
    
    	ExceptionInfo->ContextRecord->R9 =
    		(DWORD_PTR)((NtMapViewOfSectionArgs*)(StateArray[EnumState].arguments))->ZeroBits;
    

    Podemos ver neste exemplo que estamos corrigindo os argumentos para NtMapViewOfSection.

    Como usar

    Se você quiser começar a falsificar a telemetria do EDR, é possível modificar as definições p[FunctionName] onde elas estão atualmente definidas como NULL.

    Geração

    Para gerar as funções necessárias, use gen.py. Ele suporta:

    • Funções separadas por vírgula
    root@kitploit:~
    python gen.py NtOpenSection,NtMapViewOfSection,NtUnmapViewOfSection
    

    Ele produzirá 3 arquivos: TamperingSyscalls.cpp, TamperingSyscalls.h e main.cpp. Você pode #include "TamperingSyscalls.h" em seu projeto. Podemos chamar as funções acrescentando o nome da função a p, por exemplo pNtOpenSection(...);

    Limitações

    Não podemos definir um breakpoint em NtSetThreadContext ou em suas variantes, pois ele é usado para definir os registradores de depuração. Há um breve período em que os registradores de depuração são definidos, mas é muito pequeno e não acredito que seremos detectados por manter um Dr0 aberto.

    Publiquei um pequeno post no blog, abordando essas técnicas.

    TamperingSyscall's Post de Blog de Visão Geral

    TamperingSyscall's Post de Blog de Falsa Introspecção

    Baixar ferramenta