Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
covirt — Ein x86-64-Code-Virtualisierer für VM-basierte Verschleierung | Kitploit
Tools/GitHubGitHub/dmaivel/covirt
Statische AnalyseDynamische Analyse (Sandboxing)Code-AnalyseReverse EngineeringMalware-AnalyseBinäranalyse
GitHubdmaivel/covirt

covirt

Ein x86-64-Code-Virtualisierer für VM-basierte Verschleierung

Repository anzeigen
24838vor 1 JahrVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

covirt license

Ein x86-64-Code-Virtualizer für VM-basierte Verschleierung.

Funktionen

  • Stack-basierte Architektur der virtuellen Maschine
  • MBA, Verschleierung durch selbstmodifizierenden Code
  • Unterstützung für PE*- und ELF-Binärdateien
  • Code-Marker zur Festlegung geschützter Bereiche

*Die PE-Unterstützung wurde nur mit über MinGW-w64 kompilierten Binärdateien getestet

Erste Schritte

Abhängigkeiten

CMake wird alle diese Abhängigkeiten automatisch holen, daher ist eine manuelle Installation nicht erforderlich.

NameVersion
CMake3.25+
Zydis4.1.0+
zasmNeueste
LIEF0.15.1+

Erstellen

Zum Erstellen wird ein mit C++23 kompatibler Compiler benötigt.

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

Wenn Sie unter Windows mit Visual Studio kompilieren, müssen Sie clang-cl verwenden: cmake .. -T ClangCL -A x64.

Verwendung

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

Code-Marker

Damit covirt weiß, welche Funktionen virtualisiert werden müssen, müssen Sie die Start- und Endmarker in Ihren Quellcode einfügen, etwa so:

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

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

    return result;
}

[!IMPORTANT]

  • Platziere __covirt_vm_end nicht an unerreichbaren Stellen (z. B. nach einem return), da dies verhindert, dass der End-Stub emittiert wird
  • __covirt_vm_...();-Stubs funktionieren nicht mit MSVC, da sie Inline-Assembly verwenden
  • SSE4-Unterstützung ist erforderlich

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

Die obige Beispielanwendung wurde mit covirt a.out -d virtualisiert, was nach Verschleierung und Virtualisierung einen Dump der VM-Instruktionen ausgibt. Die aktuelle VM-Implementierung legt die meisten Operanden zur Verarbeitung auf den Stack, was die Komplexität der Kodierung der VM-Instruktionen reduziert. Für Instruktionen ohne definierten VM-Handler werden diese nativ ausgeführt (vm_exit -> native instruction -> vm_enter). Das Aufrufen von Funktionen folgt derselben Pipeline: Wir verlassen die VM, rufen die Funktion auf und betreten die VM erneut. Insgesamt führen die Transformationen dazu, dass die Binärdateien erheblich an Größe zunehmen:

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

Verschleierung

BeschreibungIDA
IDA-Dekompilierung von vm_entry, das nur mit dem MBA-Pass verschleiert wurde. Der Dekompiler erzeugte über 27k LOC.cpp
IDA-Disassemblierung von vm_entry, das mit den MBA- & SMC-Pässen verschleiert wurde. Dekompilierung funktioniert nicht.

Bekannte Probleme

  • Eine andere VM-geschützte Funktion kann nicht aus einer geschützten Region heraus aufgerufen werden
    • Verursacht einen Segfault, wenn die VM verschleiert ist
    • Kein Rückgabewert, wenn die VM nicht verschleiert ist
Tool herunterladen
cpp