Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
static_asm — x86/x86-64命令エンコーディングのためのヘッダオンリーC++2xコンパイル時アセンブラ | Kitploit
ツール/GitHubGitHub/mahmoudimus/static_asm
ペイロード生成コード分析エクスプロイトリバースエンジニアリングシェルコードバイナリ解析学習と教育シェルコード生成学習パスとコース
GitHubmahmoudimus/static_asm

static_asm

x86/x86-64命令エンコーディングのためのヘッダオンリーC++2xコンパイル時アセンブラ

311168ヶ月前Kitploit レビュー済み

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
リポジトリを見る
ウェブサイト

static_asm

CI License

ヘッダーオンリーのC++20ライブラリで、コンパイル時のx86/x86-64命令エンコーディングを提供します。

このプロジェクトはBoost Software License 1.0とMIT Licenseのデュアルライセンスです。どちらかのライセンスを選択できます。

目的

  • 実用的かつ楽しい方法でx86アセンブリエンコーディングを学ぶ
  • 完全な型安全性を持ってコンパイル時にアセンブリ命令を生成する
  • ランタイムオーバーヘッドなしでシェルコードやJITコードテンプレートを作成する

クイックスタート

#include "static_asm.hpp"

using namespace static_asm::x86::registers;
using namespace static_asm::x86::instructions;

// コンパイル時にマシンコードを構築
constexpr auto code = core::assemble(
    mov(rax, 0x12345678),    // mov rax, imm32
    add(rax, rcx),           // add rax, rcx
    xor_(r8, r8),            // xor r8, r8
    call(rax),               // call rax
    ret()                    // ret
);
// code は std::array<uint8_t, N> - 完全にconstexpr!

カテゴリ別の例

ALU操作

// レジスタ間
add(rax, rbx);           // 48 01 D8
sub(ecx, edx);           // 29 D1
and_(r8, r9);            // 4D 21 C8
or_(rsi, rdi);           // 48 09 FE
xor_(eax, eax);          // 31 C0 (レジスタをゼロにする一般的なイディオム)
cmp(rax, rcx);           // 48 39 C8

// 即値とレジスタ
add(rax, 0x10);          // 48 83 C0 10 (符号拡張されたimm8)
add(rax, 0x10000);       // 48 05 00 00 01 00 (imm32)
sub(ecx, 100);           // 83 E9 64
and_(rdx, 0xFF);         // 48 83 E2 FF

// メモリオペランド付き
add(eax, dword_ptr(rbx));              // 03 03
add(rax, qword_ptr(rcx + 0x10));       // 48 03 41 10
sub(dword_ptr(rsp + 0x20), eax);       // 29 44 24 20

データ移動

// レジスタ間
mov(rax, rbx);           // 48 89 D8
mov(eax, ecx);           // 89 C8
mov(r8, r9);             // 4D 89 C8

// 即値をレジスタへ
mov(rax, 0x12345678);    // 48 C7 C0 78 56 34 12
mov(eax, 0xDEADBEEF);    // B8 EF BE AD DE

// メモリ操作
mov(rax, qword_ptr(rbx));              // 48 8B 03
mov(eax, dword_ptr(rcx + 0x10));       // 8B 41 10
mov(qword_ptr(rsp + 0x8), rax);        // 48 89 44 24 08
mov(dword_ptr(rbp - 0x20), 0x100);     // C7 45 E0 00 01 00 00

// ゼロ/符号拡張
movzx(eax, bl);          // 0F B6 C3 (バイトをdwordにゼロ拡張)
movzx(rax, bx);          // 48 0F B7 C3 (ワードをqwordにゼロ拡張)
movsx(eax, cl);          // 0F BE C1 (バイトをdwordに符号拡張)
movsx(rax, dx);          // 48 0F BF C2 (ワードをqwordに符号拡張)
movsxd(rax, ecx);        // 48 63 C1 (dwordをqwordに符号拡張)

// 実効アドレスのロード
lea(rax, qword_ptr(rbx + rcx * s4));           // 48 8D 04 8B
lea(rax, qword_ptr(rbx + rcx * s8 + 0x10));    // 48 8D 44 CB 10

// 交換
xchg(rax, rbx);          // 48 87 D8

SIBアドレッシング (Scale-Index-Base)

// [ベース + インデックス * スケール]
mov(eax, dword_ptr(rbx + rcx * s1));   // 8B 04 0B
mov(eax, dword_ptr(rbx + rcx * s2));   // 8B 04 4B
mov(eax, dword_ptr(rbx + rcx * s4));   // 8B 04 8B
mov(eax, dword_ptr(rbx + rcx * s8));   // 8B 04 CB

// [ベース + インデックス * スケール + 変位]
mov(rax, qword_ptr(rbx + rcx * s4 + 0x10));     // 48 8B 44 8B 10
mov(rax, qword_ptr(r12 + r13 * s8 + 0x1000));   // 4B 8B 84 EC 00 10 00 00

// SIBアドレスへのストア
mov(dword_ptr(rax + rdx * s4), ecx);            // 89 0C 90
mov(qword_ptr(rbx + rsi * s8 + 0x20), rax);     // 48 89 44 F3 20

// LEAとSIB(アドレス計算に便利)
lea(rax, qword_ptr(rbx + rcx * s4));            // 48 8D 04 8B
lea(rax, qword_ptr(rdi + rsi * s8 + 0x100));    // 48 8D 84 F7 00 01 00 00

シフトとローテート

// 1によるシフト
shl(eax, 1);             // D1 E0
shr(rax, 1);             // 48 D1 E8
sar(ecx, 1);             // D1 F9

// 即値によるシフト
shl(eax, 4);             // C1 E0 04
shr(rax, 8);             // 48 C1 E8 08
sar(rdx, 16);            // 48 C1 FA 10

// CLレジスタによるシフト
shl(eax, cl);            // D3 E0
shr(rax, cl);            // 48 D3 E8

// ローテート
rol(eax, 1);             // D1 C0
ror(rax, 8);             // 48 C1 C8 08
rcl(ecx, cl);            // D3 D1
rcr(rdx, 1);             // 48 D1 DA

乗算と除算

// 単一オペランド(結果はrdx:rax)
mul(rbx);                // 48 F7 E3 (符号なし: rdx:rax = rax * rbx)
imul(rcx);               // 48 F7 E9 (符号付き: rdx:rax = rax * rcx)
div(rbx);                // 48 F7 F3 (符号なし: rax = rdx:rax / rbx, rdx = 余り)
idiv(rcx);               // 48 F7 F9 (符号付き除算)

// 2オペランドIMUL (dest = dest * src)
imul(rax, rbx);          // 48 0F AF C3
imul(ecx, edx);          // 0F AF CA

// 3オペランドIMUL (dest = src * imm)
imul(rax, rbx, 10);      // 48 6B C3 0A
imul(ecx, edx, 1000);    // 69 CA E8 03 00 00

制御フロー

// 無条件ジャンプ
jmp(0x10);               // EB 10 (short, 8ビットオフセット)
jmp(0x1000);             // E9 00 10 00 00 (near, 32ビットオフセット)
jmp(rax);                // FF E0 (間接)
jmp(here);               // EB FE (jmp $, 無限ループ)

// 条件付きジャンプ (8ビットオフセット)
jz(0x10);                // 74 10
jnz(0x20);               // 75 20
jb(0x08);                // 72 08 (below/carry)
jae(0x08);               // 73 08 (above or equal/no carry)
jl(0x10);                // 7C 10 (less than, 符号付き)
jge(0x10);               // 7D 10 (greater or equal, 符号付き)

// 条件付きジャンプ (長い分岐用の32ビットオフセット)
jz_near(0x10000);        // 0F 84 00 00 01 00
jnz_near(0x20000);       // 0F 85 00 00 02 00

// CallとReturn
call(rax);               // FF D0 (間接call)
call(0x100);             // E8 00 01 00 00 (相対call)
ret();                   // C3
ret(0x10);               // C2 10 00 (returnして16バイトポップ)

条件付き移動

// 条件が真の場合に移動(分岐ペナルティなし!)
cmovz(rax, rbx);         // 48 0F 44 C3 (ゼロなら移動)
cmovnz(eax, ecx);        // 0F 45 C1 (ゼロでなければ移動)
cmovl(rax, rdx);         // 48 0F 4C C2 (lessなら移動, 符号付き)
cmovge(ecx, esi);        // 0F 4D CE (greater or equalなら移動, 符号付き)
cmovb(rax, rbx);         // 48 0F 42 C3 (belowなら移動, 符号なし)
cmovae(edx, edi);        // 0F 43 D7 (above or equalなら移動, 符号なし)

// メモリソース付き
cmovz(rax, qword_ptr(rbx));           // 48 0F 44 03
cmovnz(eax, dword_ptr(rcx + 0x10));   // 0F 45 41 10

ビット操作

// ビットテスト
bt(eax, 5);              // 0F BA E0 05
bt(rax, rbx);            // 48 0F A3 D8

// ビットテスト & セット/リセット/補数
bts(eax, 10);            // 0F BA E8 0A (テストしてセット)
btr(rax, rcx);           // 48 0F B3 C8 (テストしてリセット)
btc(edx, 3);             // 0F BA FA 03 (テストして補数)

// ビットスキャン
bsf(eax, ecx);           // 0F BC C1 (前方スキャン、最初の1を探す)
bsr(rax, rbx);           // 48 0F BD C3 (後方スキャン、最初の1を探す)

// ポピュレーションカウントと先頭/末尾ゼロ
popcnt(eax, ecx);        // F3 0F B8 C1
lzcnt(rax, rbx);         // F3 48 0F BD C3
tzcnt(eax, edx);         // F3 0F BC C2

// バイトスワップ
bswap(eax);              // 0F C8 (バイト順を逆にする)
bswap(rax);              // 48 0F C8

文字列操作

// 基本文字列操作([rsi] および/または [rdi] に対して動作)
movsb();                 // A4 (バイト [rsi] -> [rdi] に移動)
movsw();                 // 66 A5
movsd();                 // A5
movsq();                 // 48 A5

cmpsb();                 // A6 ([rsi] と [rdi] を比較)
stosb();                 // AA (al -> [rdi] にストア)
lodsb();                 // AC ([rsi] -> al にロード)
scasb();                 // AE (al と [rdi] を比較)

// REPプレフィックス付き(rcx回繰り返し)
rep_movsb();             // F3 A4 (memcpy)
rep_movsq();             // F3 48 A5 (高速memcpy、8バイトずつ)
rep_stosb();             // F3 AA (memset)
rep_stosq();             // F3 48 AB

// REPE/REPNE付き(等しい/等しくない間繰り返し)
repe_cmpsb();            // F3 A6 (不一致が発生するまで文字列を比較)
repne_scasb();           // F2 AE (文字列内のバイトをスキャン)

スタック操作

push(rax);               // 50
push(rbx);               // 53
push(r8);                // 41 50
push(0x10);              // 6A 10 (push imm8)
push(0x1000);            // 68 00 10 00 00 (push imm32)

pop(rax);                // 58
pop(rbx);                // 5B
pop(r15);                // 41 5F

システム命令

// システムコール
syscall_();              // 0F 05 (64ビットsyscall)
sysenter();              // 0F 34
sysexit();               // 0F 35

// 割り込み
int3();                  // CC (ブレークポイント)
int_(0x80);              // CD 80 (Linux 32ビットsyscall)
int_(0x21);              // CD 21 (DOS割り込み)

// CPU情報
cpuid();                 // 0F A2
rdtsc();                 // 0F 31
rdtscp();                // 0F 01 F9
ツールをダウンロード