9.3 KiB
9.3 KiB
# Проект КМП - Кодомнемонический преобразователь. Русский дизассемблер x86-64 для языка КВС
**ndisasm-ru** — это модифицированная версия утилиты `ndisasm` из пакета **Netwide Assembler (NASM)**, адаптированная для вывода дизассемблированного кода на русском языке в синтаксисе языка **КВС**.
---
## 📌 Особенности
- ✅ **Перевод мнемоник** инструкций x86-64 на русский язык
- ✅ **Перевод регистров** (64, 32, 16, 8-битных) на русский язык
- ✅ **Числовые значения** остаются без изменений
- ✅ **Синтаксис** соответствует языку программирования КВС
- ✅ **Полная совместимость** с оригинальным `ndisasm` по функциональности
- ✅ **Независимая сборка** — не требует наличия NASM
---
## 🚀 Быстрый старт
```bash
# Клонирование репозитория
git clone https://github.com/artradeskz/ndisasm-ru.git
cd ndisasm-ru
# Сборка
make
# Запуск
./ndisasm-ru -b 64 файл.elf
📖 Пример вывода
Ниже приведён фрагмент дизассемблирования самого ndisasm-ru в 64-битном режиме. Хорошо видно, как инструкции и регистры переводятся на русский язык:
$ ./ndisasm-ru -b 64 -o 0x81380 -e 0x81380 ndisasm-ru | head -20
00081380 B957040000 переместить есикс,0x457
00081385 488D154C6A0000 загрузить_адрес рдикс,[rel 0x87dd8]
0008138C 488D355D6F0000 загрузить_адрес рсиай,[rel 0x882f0]
00081393 488D3D4B6A0000 загрузить_адрес рдиай,[rel 0x87de5]
0008139A E87F010000 вызвать 0x8151e
0008139F F30F1EFA endbr64
000813A3 50 втолкнуть раикс
000813A4 58 вытолкнуть раикс
000813A5 50 втолкнуть раикс
000813A6 E8B5540000 вызвать 0x86860
000813AB E860FEFFFF вызвать 0x81210
000813B0 F30F1EFA endbr64
000813B4 50 втолкнуть раикс
000813B5 58 вытолкнуть раикс
000813B6 488D3DC3720000 загрузить_адрес рдиай,[rel 0x88680]
000813BD 50 втолкнуть раикс
000813BE 31C0 исключающее_или еаикс,еаикс
000813C0 E805000000 вызвать 0x813ca
000813C5 E8E6FFFFFF вызвать 0x813b0
000813CA F30F1EFA endbr64
Что мы видим в этом выводе:
mov ecx,0x457→переместить есикс,0x457lea rdx,[rel 0x87dd8]→загрузить_адрес рдикс,[rel 0x87dd8]call 0x8151e→вызвать 0x8151epush rax→втолкнуть раиксpop rax→вытолкнуть раиксxor eax,eax→исключающее_или еаикс,еаикс
📂 Структура проекта
ndisasm-ru/
├── src/
│ ├── ndisasm.c # Основной файл дизассемблера (с патчем)
│ ├── zamenyator.c # Модуль перевода мнемоник и регистров
│ ├── zamenyator.h # Заголовок модуля перевода
│ ├── disasm.c # Ядро дизассемблера (оригинал)
│ ├── sync.c # Синхронизация (оригинал)
│ └── ... # Остальные файлы из NASM
├── include/ # Заголовочные файлы
├── Makefile # Makefile для сборки
└── README.md # Этот файл
📋 Таблица перевода
Мнемоники (основные)
| Английская | Русская (КВС) |
|---|---|
mov |
переместить |
add |
прибавить |
sub |
вычесть |
cmp |
сравнить |
jmp |
переход |
je / jz |
переход_если_равно / переход_если_ноль |
jne / jnz |
переход_если_неравно / переход_если_не_ноль |
call |
вызвать |
ret |
вернуться |
push |
втолкнуть |
pop |
вытолкнуть |
test |
проверить |
xor |
исключающее_или |
and |
и |
or |
или |
inc |
увеличить |
dec |
уменьшить |
syscall |
вызов_системы |
nop |
нет_операции |
lea |
загрузить_адрес |
Полный список мнемоник и регистров см. в файле src/zamenyator.c.
Регистры
| Английский | Русский (КВС) |
|---|---|
rax |
раикс |
rbx |
рбикс |
rcx |
рсикс |
rdx |
рдикс |
rsi |
рсиай |
rdi |
рдиай |
rsp |
рсипи |
rbp |
рбипи |
r8 – r15 |
р8 – р15 |
eax |
еаикс |
ebx |
ебикс |
ecx |
есикс |
edx |
едикс |
esi |
есиай |
edi |
едиай |
esp |
есипи |
ebp |
ебипи |
🔧 Использование
Основные опции
./ndisasm-ru -b 16/32/64 файл # Установка разрядности
./ndisasm-ru -o смещение файл # Установка базового адреса
./ndisasm-ru -e байты файл # Пропуск заголовка
./ndisasm-ru -k старт,байты # Пропуск региона
./ndisasm-ru -h # Справка
Примеры
# Дизассемблирование 32-битного бинарного файла
./ndisasm-ru -b 32 program.bin
# Дизассемблирование 64-битного ELF-файла с пропуском заголовка
./ndisasm-ru -b 64 -e 0x40 program.elf
# Дизассемблирование с указанием виртуального адреса
./ndisasm-ru -b 64 -o 0x400000 -e 0x81380 program.elf
🧪 Тестирование
# Сборка и тестирование
make test
Или вручную:
# Создание тестового файла
echo -n -e "\xB8\x01\x00\x00\x00" > test.bin
# Запуск теста
./ndisasm-ru -b 32 test.bin
# Ожидаемый вывод: 00000000 B801000000 переместить еаикс,0x1
⚠️ Ограничения
- Поддерживаются только инструкции x86-64, присутствующие в таблице перевода
- Некоторые специфические инструкции (SSE, AVX, CET) могут отображаться на английском
- Сегментные префиксы пока не переведены
📜 Лицензия и авторство
Оригинальный проект NASM
Исходный код основан на проекте Netwide Assembler (NASM).
- Автор: Simon Tatham, Julian Hall и другие участники проекта NASM
- Официальный сайт: https://www.nasm.us/
- Исходный код: https://git.nasm.us/nasm.git
- Лицензия: BSD 2-Clause License
Авторские права © 1996-2025 Авторы NASM. Все права защищены.
Распространение и использование разрешены при условии сохранения уведомления об авторских правах и списка условий. Подробнее: https://opensource.org/licenses/BSD-2-Clause
Модификация для КВС
- Автор модификации: artradeskz
- Проект: https://github.com/artradeskz/ndisasm-ru
- Назначение: Адаптация для языка программирования КВС
Модификация включает:
- Добавление модуля
zamenyatorдля перевода мнемоник и регистров - Патч
ndisasm.cдля вызова переводчика в функцииoutput_ins() - Сборка в независимый проект
🤝 Благодарности
- Команде разработчиков NASM за отличный инструмент
- Сообществу КВС за вдохновение
🔗 Ссылки
📧 Контакты
По вопросам и предложениям: GitHub Issues
ndisasm-ru — Русский дизассемблер для КВС