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
Ferramentas/GitHubGitHub/dmaivel/covirt
Análise EstáticaAnálise Dinâmica (Sandboxing)Análise de CódigoEngenharia ReversaAnálise de MalwareAnálise de Binários
GitHubdmaivel/covirt

covirt

Um virtualizador de código x86-64 para ofuscação baseada em VM.

Ver Repositório
248382há 1 anoRevisado 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

covirt license

Um virtualizador de código x86-64 para ofuscação baseada em VM.

Recursos

  • Arquitetura de máquina virtual baseada em pilha
  • Ofuscação de código MBA e automodificante
  • Suporte para binários PE* e ELF
  • Marcadores de código para definir regiões protegidas

*Suporte para PE testado apenas em binários compilados via MinGW-w64

Primeiros passos

Dependências

O CMake buscará todas essas dependências, portanto, não é necessário instalá-las você mesmo.

Baixar ferramenta
NomeVersão
CMake3.25+
Zydis4.1.0+
zasmÚltima
LIEF0.15.1+

Compilação

É necessário um compilador compatível com C++23 para compilar.

root@kitploit:~
git clone https://github.com/dmaivel/covirt.git
cd covirt
mkdir build
cd build
cmake ..
cmake --build . --config Release

Se você estiver compilando no Windows via Visual Studio, deve usar clang-cl: cmake .. -T ClangCL -A x64.

Uso

root@kitploit:~
Usage: covirt [--help] [--version] [--output OUTPUT_PATH] [--vm_code_size MAX] [--vm_stack_size SIZE] [--no_self_modifying_code] [--no_mixed_boolean_arith] [--show_dump_table] INPUT_PATH

Code virtualizer for x86-64 ELF & PE binaries

Positional arguments:
  INPUT_PATH                         path to input binary to virtualize 

Optional arguments:
  -h, --help                         shows help message and exits 
  -v, --version                      prints version information and exits 
  -o, --output OUTPUT_PATH           specify the output file [default: INPUT_PATH.covirt] 
  -vcode, --vm_code_size MAX         specify the maximum allowed total lifted bytes [default: 2048]
  -vstack, --vm_stack_size SIZE      specify the size of the virtual stack [default: 2048]
  -no_smc, --no_self_modifying_code  disable smc pass 
  -no_mba, --no_mixed_boolean_arith  disable mba pass 
  -d, --show_dump_table              show disassembly of the vm instructions

Marcadores de código

Para que o covirt saiba quais funções precisam ser virtualizadas, você deve adicionar os marcadores de início e fim ao seu código-fonte, como abaixo:

root@kitploit:~
#include "covirt_stub.h"

int my_function(...)
{
    int result = 0;
  
    __covirt_vm_start();
    // ...
    __covirt_vm_end();

    return result;
}

[!IMPORTANT]

  • Não coloque __covirt_vm_end em locais inalcançáveis (ou seja, após um return), pois isso impedirá a emissão do stub final
  • Os stubs __covirt_vm_...(); não funcionarão usando MSVC porque usam assembly inline
  • É necessário suporte a SSE4

Demo

root@kitploit:~
#include <covirt_stub.h>
#include <stdio.h>

int calculate(int a, int b)
{
    int result = 0;

    __covirt_vm_start();
    
    for (int i = 0; i < 10; i++)
        if (i > 5)
            result += result + a;
        else
            result += (result >> 1) + b;
    printf("result = %d\n", result);

    __covirt_vm_end();

    return result;
}

int main()
{
    calculate(5, 12);
}

O aplicativo de exemplo acima foi virtualizado usando covirt a.out -d, que gera um despejo das instruções da VM após a ofuscação e virtualização. A implementação atual da VM empurra a maioria dos operandos para a pilha para processá-los, reduzindo a complexidade da codificação das instruções da VM. Para instruções que não possuem um manipulador de VM definido, elas serão executadas nativamente (vm_exit -> native instruction -> vm_enter). Chamar funções segue o mesmo fluxo, no qual saímos, chamamos a função e reentramos na VM. No geral, as transformações fazem os binários crescerem significativamente em tamanho:

  • a.out como ELF: 15.5 kB -> 1.0 MB
  • a.out como PE: 259.3 kB -> 1.3 MB

Ofuscação

DescriçãoIDA
Descompilação do IDA de vm_entry, que foi ofuscado apenas pela passagem MBA. Mais de 27k LOC foram gerados pelo descompilador.cpp
Desmontagem do IDA de vm_entry, que foi ofuscado pelas passagens MBA e SMC. A descompilação não funciona.cpp

Problemas conhecidos

  • Não é possível chamar outra função protegida pela VM dentro de uma região protegida
    • Causa segfault se a VM estiver ofuscada
    • Nenhum valor de retorno se a VM não estiver ofuscada