Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
covirt — Un virtualiseur de code x86-64 pour l'obfuscation basée sur VM | Kitploit
Outils/GitHubGitHub/dmaivel/covirt
Analyse StatiqueAnalyse Dynamique (Sandboxing)Analyse de CodeRétro-ingénierieAnalyse de MalwareAnalyse de Binaires
GitHubdmaivel/covirt

covirt

Un virtualiseur de code x86-64 pour l'obfuscation basée sur VM

Voir le dépôt
248382il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

covirt license

Un virtualiseur de code x86-64 pour l'obfuscation basée sur une machine virtuelle.

Fonctionnalités

  • Architecture de machine virtuelle basée sur la pile
  • Obfuscation par MBA (Mixed Boolean Arithmetic) et code auto-modifiable
  • Prise en charge des binaires PE* et ELF
  • Marqueurs de code pour définir les régions protégées

*La prise en charge de PE n'a été testée que sur des binaires compilés via MinGW-w64

Pour commencer

Dépendances

CMake récupérera toutes ces dépendances, vous n'avez donc pas besoin de les installer vous-même.

Télécharger l’outil
NomVersion
CMake3.25+
Zydis4.1.0+
zasmDernière
LIEF0.15.1+

Compilation

Un compilateur compatible C++23 est nécessaire pour compiler.

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

Si vous compilez sur Windows via Visual Studio, vous devez utiliser clang-cl : cmake .. -T ClangCL -A x64.

Utilisation

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                         chemin vers le binaire d'entrée à virtualiser 

Optional arguments:
  -h, --help                         affiche le message d'aide et quitte 
  -v, --version                      affiche les informations de version et quitte 
  -o, --output OUTPUT_PATH           spécifie le fichier de sortie [par défaut : INPUT_PATH.covirt] 
  -vcode, --vm_code_size MAX         spécifie la taille totale maximale autorisée des instructions levées (lifted bytes) [par défaut : 2048]
  -vstack, --vm_stack_size SIZE      spécifie la taille de la pile virtuelle [par défaut : 2048]
  -no_smc, --no_self_modifying_code  désactive le passage SMC 
  -no_mba, --no_mixed_boolean_arith  désactive le passage MBA 
  -d, --show_dump_table              affiche le désassemblage des instructions de la VM

Marqueurs de code

Pour que covirt sache quelles fonctions doivent être virtualisées, vous devez ajouter les marqueurs de début et de fin dans votre code source, comme ceci :

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

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

    return result;
}

[!IMPORTANT]

  • Ne placez pas __covirt_vm_end dans des emplacements inaccessibles (par exemple après un return), car cela empêcherait l'émission du stub de fin.
  • Les stubs __covirt_vm_...(); ne fonctionneront pas avec MSVC car ils utilisent l'assembleur inline.
  • La prise en charge de SSE4 est requise.

Démo

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);
}

L'application exemple ci-dessus a été virtualisée en utilisant covirt a.out -d, ce qui affiche un dump des instructions de la VM après l'obfuscation et la virtualisation. L'implémentation actuelle de la VM pousse la plupart des opérandes sur la pile pour les traiter, réduisant ainsi la complexité du codage des instructions de la VM. Pour les instructions qui n'ont pas de gestionnaire défini dans la VM, elles seront exécutées nativement (vm_exit -> instruction native -> vm_enter). L'appel de fonctions suit le même pipeline : on sort, on appelle la fonction, puis on rentre à nouveau dans la VM. Ensemble, ces transformations augmentent considérablement la taille des binaires :

  • a.out en tant qu'ELF : 15.5 kB -> 1.0 MB
  • a.out en tant que PE : 259.3 kB -> 1.3 MB

Obfuscation

DescriptionIDA
Décompilation IDA de vm_entry, obfusquée uniquement avec le passage MBA. Plus de 27k lignes de code ont été générées par le décompilateur.cpp
Désassemblage IDA de vm_entry, obfusquée avec les passages MBA et SMC. La décompilation ne fonctionne pas.cpp

Problèmes connus

  • Impossible d'appeler une autre fonction protégée par la VM depuis une région protégée
    • Provoque un segfault si la VM est obfusquée
    • Aucune valeur de retour si la VM n'est pas obfusquée