252 lines
9.3 KiB
Markdown
252 lines
9.3 KiB
Markdown
```markdown
|
||
# Проект КМП - Кодомнемонический преобразователь. Русский дизассемблер 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-битном режиме. Хорошо видно, как инструкции и регистры переводятся на русский язык:
|
||
|
||
```bash
|
||
$ ./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` → `переместить есикс,0x457`
|
||
- `lea rdx,[rel 0x87dd8]` → `загрузить_адрес рдикс,[rel 0x87dd8]`
|
||
- `call 0x8151e` → `вызвать 0x8151e`
|
||
- `push 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` | `ебипи` |
|
||
|
||
---
|
||
|
||
## 🔧 Использование
|
||
|
||
### Основные опции
|
||
|
||
```bash
|
||
./ndisasm-ru -b 16/32/64 файл # Установка разрядности
|
||
./ndisasm-ru -o смещение файл # Установка базового адреса
|
||
./ndisasm-ru -e байты файл # Пропуск заголовка
|
||
./ndisasm-ru -k старт,байты # Пропуск региона
|
||
./ndisasm-ru -h # Справка
|
||
```
|
||
|
||
### Примеры
|
||
|
||
```bash
|
||
# Дизассемблирование 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
|
||
```
|
||
|
||
---
|
||
|
||
## 🧪 Тестирование
|
||
|
||
```bash
|
||
# Сборка и тестирование
|
||
make test
|
||
```
|
||
|
||
Или вручную:
|
||
|
||
```bash
|
||
# Создание тестового файла
|
||
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/kmp
|
||
- **Назначение:** Адаптация для языка программирования КВС
|
||
|
||
Модификация включает:
|
||
- Добавление модуля `zamenyator` для перевода мнемоник и регистров
|
||
- Патч `ndisasm.c` для вызова переводчика в функции `output_ins()`
|
||
- Сборка в независимый проект
|
||
|
||
---
|
||
|
||
## 🤝 Благодарности
|
||
|
||
- Команде разработчиков **NASM** за отличный инструмент
|
||
- Сообществу **КВС** за вдохновение
|
||
|
||
---
|
||
|
||
## 🔗 Ссылки
|
||
|
||
- [Проект КВС](https://github.com/artradeskz/kvs)
|
||
- [Официальный сайт NASM](https://www.nasm.us/)
|
||
- [Исходный код NASM](https://git.nasm.us/nasm.git)
|
||
|
||
---
|
||
|
||
## 📧 Контакты
|
||
|
||
По вопросам и предложениям: [GitHub Issues](https://github.com/artradeskz/kmp/issues)
|
||
|
||
---
|
||
|
||
*ndisasm-ru — Русский дизассемблер для КВС*
|
||
``` |