Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
covirt — x86-64用コード仮想化ツール(VMベースの難読化) | Kitploit
ツール/GitHubGitHub/dmaivel/covirt
静的分析動的分析 (サンドボックス)コード分析リバースエンジニアリングマルウェア分析バイナリ解析
GitHubdmaivel/covirt

covirt

x86-64用コード仮想化ツール(VMベースの難読化)

リポジトリを見る
2483821年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

covirt license

VMベースの難読化のためのx86-64コード仮想化ツール。

特徴

  • スタックベースの仮想マシンアーキテクチャ
  • MBA、自己修正コード難読化
  • PE* および ELF バイナリのサポート
  • 保護領域を定義するコードマーカー

*PEのサポートは MinGW-w64 でコンパイルされたバイナリでのみテストされています

はじめに

依存関係

CMake がこれらの依存関係をすべて取得するため、自分でインストールする必要はありません。

名前バージョン
CMake3.25+
Zydis4.1.0+
zasm最新
LIEF0.15.1+

ビルド

ビルドには C++23 互換のコンパイラが必要です。

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

Windows で Visual Studio を使ってコンパイルする場合は、clang-cl を使用する必要があります: cmake .. -T ClangCL -A x64

使い方

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                         仮想化する入力バイナリへのパス 

Optional arguments:
  -h, --help                         ヘルプメッセージを表示して終了 
  -v, --version                      バージョン情報を表示して終了 
  -o, --output OUTPUT_PATH           出力ファイルを指定 [デフォルト: INPUT_PATH.covirt] 
  -vcode, --vm_code_size MAX         リフトされたバイトの最大許容合計を指定 [デフォルト: 2048]
  -vstack, --vm_stack_size SIZE      仮想スタックのサイズを指定 [デフォルト: 2048]
  -no_smc, --no_self_modifying_code  SMCパスを無効化 
  -no_mba, --no_mixed_boolean_arith  MBAパスを無効化 
  -d, --show_dump_table              VM命令の逆アセンブルを表示

コードマーカー

covirt がどの関数を仮想化する必要があるかを認識するためには、以下のようにソースコードに開始マーカーと終了マーカーを追加する必要があります:

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

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

    return result;
}

[!IMPORTANT]

  • __covirt_vm_end を到達不可能な場所(return の後など)に配置しないでください。エンドスタブが生成されなくなります。
  • __covirt_vm_...(); スタブはインラインアセンブリを使用するため MSVC では動作しません
  • SSE4 サポートが必要です

デモ

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

上記のサンプルアプリケーションは covirt a.out -d を使用して仮想化され、難読化と仮想化後のVM命令のダンプを出力します。現在のVM実装では、ほとんどのオペランドをスタックにプッシュして処理することで、VM命令のエンコードの複雑さを軽減しています。定義されたVMハンドラがない命令は、ネイティブで実行されます(vm_exit -> native instruction -> vm_enter)。関数呼び出しも同じパイプラインに従い、VMを抜けて関数を呼び出し、VMに再入します。これらの変換により、バイナリのサイズが大幅に増加します。

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

難読化

説明IDA
MBAパスのみで難読化された vm_entry のIDA逆コンパイル。デコンパイラによって27,000行以上のコードが生成されました。cpp
MBAおよびSMCパスで難読化された vm_entry のIDA逆アセンブル。逆コンパイルは機能しません。cpp

既知の問題

  • 保護領域内から別のVM保護関数を呼び出せない
    • VMが難読化されている場合、セグメンテーションフォールトが発生
    • VMが難読化されていない場合、戻り値なし
ツールをダウンロード