DEBUG — низкоуровневый отладчик DOS и ранних версий Windows

DEBUG — консольный отладчик для работы с памятью, регистрами и двоичным кодом, доступный в DOS и Windows до XP (32-бит). Синтаксис внутренних команд и практические примеры.

Команда DEBUG запускает интерактивный низкоуровневый отладчик, унаследованный из MS-DOS. Она позволяет читать и записывать содержимое памяти, просматривать и изменять регистры процессора, дизассемблировать двоичный код, а также запускать небольшие программы прямо из командной строки. Основной use-case — отладка 16-битных COM-файлов и изучение архитектуры x86 на базовом уровне.

Синтаксис команды DEBUG

DEBUG [имя_файла [параметры_файла]]

Плейсхолдеры:

  • имя_файла — необязательный путь к COM- или EXE-файлу, который нужно загрузить в память для отладки.
  • параметры_файла — аргументы, которые будут переданы загружаемой программе.

После запуска DEBUG переходит в интерактивный режим с приглашением -. Здесь вводятся однобуквенные команды.

Ключи и параметры (внутренние команды отладчика)

Команда Описание Пример
A [адрес] Ввод ассемблерного кода начиная с указанного адреса A 100 — ввод с адреса CS:0100
D [диапазон] Дамп памяти в hex и ASCII D 0100 011F
E адрес [значения] Изменить байты памяти по адресу E 0100 B8 01 00
U [диапазон] Дизассемблировать машинный код U 0100 0110
R [регистр] Показать или изменить регистры процессора R — все регистры; R AX — изменить AX
G [=адрес] [адрес_останова] Запустить программу (Go); при указании адреса останова — до точки останова G — до конца; G =0100 0110
T [=адрес] [число_шагов] Трассировка (Trace) — выполнить одну инструкцию с выводом регистров T — один шаг; T 5 — пять шагов
P [=адрес] [число] Процедурный шаг (Proceed) — как T, но CALL выполняется целиком P
L [адрес] [диск] [сектор] [число] Загрузить секторы диска или файл в память L 0100 2 0 1
W [адрес] [диск] [сектор] [число] Записать содержимое памяти на диск или в файл W 0100
N имя_файла Задать имя файла для последующих команд L/W N test.com
Q Выйти из отладчика Q

Примеры использования

Просмотр дампа памяти

Нужно посмотреть, что находится по адресу CS:0100 после загрузки программы.

debug myprogram.com
-D 0100 012F

Отладчик выведет шестнадцатеричный дамп 48 байт и их ASCII-представление справа.

Изменение байта в памяти и запуск

Нужно на лету заменить значение по адресу 0100 с B8 на 90 (NOP) и проверить поведение программы.

debug myprogram.com
-E 0100 90
-G

Команда E записывает новый байт, затем G запускает программу. Изменения не сохраняются на диск — только в памяти текущей сессии.

Создание минимального COM-файла

Классический способ написать крошечную программу на ассемблере и сохранить её как COM-файл без компилятора:

debug
-A 100
0C63:0100 MOV AH,09
0C63:0102 MOV DX,108
0C63:0105 INT 21
0C63:0107 INT 20
0C63:0108 DB 'Hello$'
0C63:010F
-N hello.com
-R CX
CX 0000
:0F
-W
Writing 0000F bytes
-Q

После Q в текущей папке появится файл hello.com, выводящий строку Hello.

Просмотр и изменение регистров

Перед трассировкой полезно проверить начальное состояние регистров и при необходимости скорректировать.

debug myprogram.com
-R
AX=0000  BX=0000  CX=0012  DX=0000  SP=FFFE ...
-R AX
AX 0000
:0001
-T

Команда R AX предлагает ввести новое значение AX, после чего T выполняет следующую инструкцию с выводом состояния всех регистров.

Дизассемблирование загруженного файла

Нужно быстро посмотреть, какие инструкции находятся в начале COM-файла.

debug unknown.com
-U 0100 011F

Отладчик выведет мнемоники ассемблера с адресами и hex-кодами — базовый статический анализ без внешних инструментов.

Частые ошибки и решения

Симптом Причина Решение
«debug» не является внутренней командой в Windows 10/11 DEBUG.EXE удалён начиная с 64-битных версий Windows Vista и Windows 7 x64 Использовать 32-битную Windows XP, DOSBox, или NTVDM на 32-битной Windows 7
DEBUG запускается, но команды не выполняются на 32-битной Windows 7 NTVDM (NT Virtual DOS Machine) отключён или не установлен Включить через «Программы и компоненты» → «Включение или отключение компонентов» → NTVDM
Программа зависает после G Код попал в бесконечный цикл или некорректный адрес Использовать G =0100 адрес_останова вместо безусловного G; при зависании — Ctrl+C
«Error writing file» при команде W Не установлен регистр CX (размер файла в байтах) перед записью Перед W установить R CX с нужным количеством байт
Дизассемблер показывает бессмыслицу Адрес указывает на данные, а не на код, или файл EXE (а не COM) EXE-файлы имеют заголовок; начало кода ищите по смещению, указанному в заголовке PE

Когда применять, а когда нет

Команда DEBUG была актуальна в эпоху DOS и Windows 9x/XP для отладки 16-битных программ, прямой работы с памятью и аппаратными портами. Права администратора для запуска не требовались, но NTVDM должен быть доступен.

На современных 64-битных Windows начиная с Vista файл debug.exe отсутствует в системе — команда попросту не работает. Не используйте DEBUG для работы с 32- и 64-битными приложениями: он их не понимает. Для современной отладки используйте WinDbg (Microsoft), x64dbg или встроенный отладчик Visual Studio.

Аналог в PowerShell или современном Windows: windbg.exe, ntsd.exe — для нативных приложений; для скриптов PowerShell — встроенный Set-PSBreakpoint.

FAQ

Работает ли DEBUG в Windows 10?

Нет, в 64-битных версиях Windows 10 и 11 файл debug.exe отсутствует. Для запуска 16-битного отладчика используйте DOSBox или виртуальную машину с Windows XP.

Можно ли с помощью DEBUG редактировать файлы на диске?

Да, с помощью команд L (загрузить секторы) и W (записать) в сочетании с E можно редактировать произвольные секторы диска. Это крайне рискованно на современных дисках — ошибка может уничтожить файловую систему.

Чем DEBUG отличается от WinDbg?

DEBUG работает только с 16-битным кодом в режиме реального времени DOS/NTVDM. WinDbg — полноценный отладчик ядра и пользовательского режима для 32- и 64-битных приложений Windows, поддерживает символы, расширения и анализ дампов памяти.

Как выйти из DEBUG, если программа зависла?

Нажмите Ctrl+C или Ctrl+Break — это прервёт выполнение и вернёт в приглашение отладчика. После этого введите Q для выхода.

Можно ли использовать DEBUG для обхода защиты программ?

Технически — можно изменять байты в памяти во время выполнения. Однако это нарушает лицензионные соглашения большинства программ, а на современных Windows не работает из-за отсутствия debug.exe и защитных механизмов типа DEP/ASLR.

Оцените статью
( Пока оценок нет )
MW10
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.