Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
static_asm — Заголовочный ассемблер времени компиляции на C++2x для кодирования инструкций x86/x86-64 | Kitploit
Инструменты/GitHubGitHub/mahmoudimus/static_asm
Генерация полезной нагрузкиАнализ КодаЭксплуатацияОбратная инженерияШелл-кодАнализ Бинарных ФайловОбучение и ОбразованиеГенерация ШеллкодаУчебные Маршруты и Курсы
GitHubmahmoudimus/static_asm

static_asm

Заголовочный ассемблер времени компиляции на C++2x для кодирования инструкций x86/x86-64

311168 месяцев назадПроверено Kitploit
РепозиторийСайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

static_asm

CI Лицензия

Библиотека только с заголовками для C++20, предназначенная для кодирования инструкций x86/x86-64 на этапе компиляции.

Этот проект распространяется под двойной лицензией: Boost Software License 1.0 и MIT License. Вы можете выбрать любую из них.

Назначение

  • Изучение кодирования ассемблера x86 практичным и увлекательным способом
  • Генерация инструкций ассемблера на этапе компиляции с полной безопасностью типов
  • Создание шаблонов shellcode и 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 is 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 (расширение байта нулём до двойного слова)
movzx(rax, bx);          // 48 0F B7 C3 (расширение слова нулём до учётверённого слова)
movsx(eax, cl);          // 0F BE C1 (расширение байта знаком до двойного слова)
movsx(rax, dx);          // 48 0F BF C2 (расширение слова знаком до учётверённого слова)
movsxd(rax, ecx);        // 48 63 C1 (расширение двойного слова знаком до учётверённого слова)

// Загрузка эффективного адреса
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 (знаковое деление)

// Двухоперандный IMUL (результат = результат * источник)
imul(rax, rbx);          // 48 0F AF C3
imul(ecx, edx);          // 0F AF CA

// Трёхоперандный IMUL (результат = источник * непосредственное)
imul(rax, rbx, 10);      // 48 6B C3 0A
imul(ecx, edx, 1000);    // 69 CA E8 03 00 00

Управление потоком

// Безусловные переходы
jmp(0x10);               // EB 10 (короткий, 8-битное смещение)
jmp(0x1000);             // E9 00 10 00 00 (близкий, 32-битное смещение)
jmp(rax);                // FF E0 (косвенный)
jmp(here);               // EB FE (jmp $, бесконечный цикл)

// Условные переходы (8-битное смещение)
jz(0x10);                // 74 10
jnz(0x20);               // 75 20
jb(0x08);                // 72 08 (ниже/перенос)
jae(0x08);               // 73 08 (выше или равно/нет переноса)
jl(0x10);                // 7C 10 (меньше, знаковое)
jge(0x10);               // 7D 10 (больше или равно, знаковое)

// Условные переходы (32-битное смещение для длинных ветвей)
jz_near(0x10000);        // 0F 84 00 00 01 00
jnz_near(0x20000);       // 0F 85 00 00 02 00

// Вызов и возврат
call(rax);               // FF D0 (косвенный вызов)
call(0x100);             // E8 00 01 00 00 (относительный вызов)
ret();                   // C3
ret(0x10);               // C2 10 00 (возврат и извлечение 16 байт)

Условные пересылки

// Пересылка, если условие истинно (без штрафа за ветвление!)
cmovz(rax, rbx);         // 48 0F 44 C3 (переслать, если ноль)
cmovnz(eax, ecx);        // 0F 45 C1 (переслать, если не ноль)
cmovl(rax, rdx);         // 48 0F 4C C2 (переслать, если меньше, знаковое)
cmovge(ecx, esi);        // 0F 4D CE (переслать, если больше или равно, знаковое)
cmovb(rax, rbx);         // 48 0F 42 C3 (переслать, если ниже, беззнаковое)
cmovae(edx, edi);        // 0F 43 D7 (переслать, если выше или равно, беззнаковое)

// С источником в памяти
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

Строковые операции

Скачать инструмент