На видео выше я записал наглядную реализацию процесса, описанного в разделе «Сборка и установка».
Эта статья посвящена запуску SoftICE, популярного отладчика для DOS и Windows, в эмулированной среде MS-DOS, а также обходу недостатка Bochs, эмулятора IA-32 (x86) PC.
Весь процесс выполнялся из-под Linux. Не знаю, получится ли проделать то же самое в MacOS, не говоря уже о Windows.
Отладчик SoftICE был разработан компанией NuMega в 1987 году и стал самым используемым инструментом для отладки DOS, а позднее и Windows. Последней его версией стала 2.80, которая вышла в 1997 году исключительно для DOS. У того, кто захочет использовать динамическую отладку для реверс-инжиниринга старого ПО сегодня, есть несколько вариантов:
Однако если вы хотите не просто заняться реверс-инжинирингом, но и воспроизвести реальный опыт использования старых инструментов DOS, то с SoftICE ничто не сравнится. Когда соответствующее оборудование недоступно, мы прибегаем к эмуляторам, и вот здесь возникают свои сложности.
SoftICE не работает в DOSBox-X. Этот отладчик работает в Bochs, который, в отличие от DOSBox, основан на полной эмуляции x86 процессоров. А в этом случае придётся чуть повозиться с настройкой Bochs, но есть и другая проблема.
Предположим, мы установили MS-DOS и SoftICE в среде Bochs. Запустить SoftICE можно комбинацией Ctrl+d, и всё будет в порядке, если не пытаться проделать это в процессе выполнения программы, использующей VGA-режим – игры, например. В этом случае выполнение приостанавливается, и SoftICE по факту оказывается на первом плане, но мы его не видим из-за некорректного возобновления текстового режима. Окно Bochs просто уменьшается до высоты интерфейса отладчика.
На аппаратном уровне решением будет подключение дополнительного монитора ко второму графическому адаптеру, обеспечивающему вывод с контроллера дисплея MC6845, то есть карты MDA/Hercules. После этого выполнение
К сожалению, Bochs не эмулирует ни MDA (Monochrome Display Adapter), ни второй дисплей. Хотя сэмулировать текстовый режим MDA нетрудно, в конечном итоге я так и сделал. Я откопал старую тему на SourceForge, где обсуждали добавление эмуляции MDA в Bochs. Полноценной реализации нигде не приводилось, поэтому я создал форк Bochs с необходимыми изменениями.
Детали реализации можно найти в файле readme репозитория. Самое важное, пожалуй, то, что текстовый экран MDA в самом Bochs не отображается. Он записывается в именованный канал передачи (pipe) в виде кодовых точек формата UTF-8 вместе с управляющими последовательностями ANSI для отрисовки атрибутов символов MC6845. Затем этот канал опрашивается внешней программой, выводящей из него текст в терминал (образец такой программы был добавлен в репозиторий).
На скриншоте ниже в Bochs выполняется игра при одновременном отображении SoftICE в окне терминала:

Клонируйте мой форк Bochs и скомпилируйте его с опцией
Создайте образ жёсткого диска с помощью
Нам потребуется файл
Мне пришлось закомментировать
В других версиях Bochs есть один неприятный момент – после выбора
Ещё одна проблема в том, что Bochs аварийно завершается при запуске, когда в результате нечистого выхода остаётся файл блокировки образа диска. Поэтому, если присутствует висящий
Запустите Bochs и перейдите к установке MS-DOS. Когда система запросит очередной диск, кликните
Далее снова используйте
Устанавливаем драйвер в DOS.
Добавьте в
А в
Теперь, когда мы можем использовать CD-образ, давайте создадим его в хост-системе. Предполагая, что файлы SoftICE 2.80 (лежат в S-ICE280.ZIP внутри sice280_and_extras.zip в разделе «Загрузки») находятся в каталоге
Для вставки CD измените опцию
После очередной загрузки DOS можно продолжать установку SoftICE.
В файле
В
На этом всё. После перезагрузки вы сможете вызывать SoftICE нажатием

Для получения возможности отладки игр и аналогичных графических программ осталось проделать один шаг. Эмуляция MDA в моём форке Bochs активируется, когда Bochs находит переменную среды
Обратите внимание, что после включения MDA при отсутствии работающей программы, использующей канал передачи, выполнение будет заблокировано. Поэтому далее мы такую программу запустим – это будет образец mda_viewer из репозитория.
Запустите Bochs, дополнительно указав
Подтверждение того, что MDA запущен, можно найти в выводе Bochs в виде следующей строки:
Запустите игру или иную программу, использующую режим VGA. Нажмите
Графический дисплей возвращается, и окно терминала, где выполняется
Всё это ПО давно не поддерживается, так как самое молодое датируется 1997 годом.
MS-DOS 6.22 ↪
SoftICE 2.80 and extras ↪
OAKCDROM.SYS ↪

Эта статья посвящена запуску SoftICE, популярного отладчика для DOS и Windows, в эмулированной среде MS-DOS, а также обходу недостатка Bochs, эмулятора IA-32 (x86) PC.
Весь процесс выполнялся из-под Linux. Не знаю, получится ли проделать то же самое в MacOS, не говоря уже о Windows.
Эмуляция SoftICE
Отладчик SoftICE был разработан компанией NuMega в 1987 году и стал самым используемым инструментом для отладки DOS, а позднее и Windows. Последней его версией стала 2.80, которая вышла в 1997 году исключительно для DOS. У того, кто захочет использовать динамическую отладку для реверс-инжиниринга старого ПО сегодня, есть несколько вариантов:
- DOSBox-X — форк DOSBox, оснащённый отладчиком, имеющим сходство с SoftICE.
- IDA — хоть и является в первую очередь дизассемблером, также имеет режим отладки; плюс есть плагин dsbxida, используемый в качестве связки между IDA и DOSBox-X при отладке программ DOS.
- Собственные инструменты, которые можно создать с помощью эмулятора процессора Unicorn. Также есть UniDOS — (пока что ограниченный) эмулятор DOS на базе Unicorn.
Однако если вы хотите не просто заняться реверс-инжинирингом, но и воспроизвести реальный опыт использования старых инструментов DOS, то с SoftICE ничто не сравнится. Когда соответствующее оборудование недоступно, мы прибегаем к эмуляторам, и вот здесь возникают свои сложности.
SoftICE не работает в DOSBox-X. Этот отладчик работает в Bochs, который, в отличие от DOSBox, основан на полной эмуляции x86 процессоров. А в этом случае придётся чуть повозиться с настройкой Bochs, но есть и другая проблема.
Предположим, мы установили MS-DOS и SoftICE в среде Bochs. Запустить SoftICE можно комбинацией Ctrl+d, и всё будет в порядке, если не пытаться проделать это в процессе выполнения программы, использующей VGA-режим – игры, например. В этом случае выполнение приостанавливается, и SoftICE по факту оказывается на первом плане, но мы его не видим из-за некорректного возобновления текстового режима. Окно Bochs просто уменьшается до высоты интерфейса отладчика.
На аппаратном уровне решением будет подключение дополнительного монитора ко второму графическому адаптеру, обеспечивающему вывод с контроллера дисплея MC6845, то есть карты MDA/Hercules. После этого выполнение
ALTSCR ON в SoftICE позволит переключить дисплей отладчика на второй монитор.К сожалению, Bochs не эмулирует ни MDA (Monochrome Display Adapter), ни второй дисплей. Хотя сэмулировать текстовый режим MDA нетрудно, в конечном итоге я так и сделал. Я откопал старую тему на SourceForge, где обсуждали добавление эмуляции MDA в Bochs. Полноценной реализации нигде не приводилось, поэтому я создал форк Bochs с необходимыми изменениями.
Детали реализации можно найти в файле readme репозитория. Самое важное, пожалуй, то, что текстовый экран MDA в самом Bochs не отображается. Он записывается в именованный канал передачи (pipe) в виде кодовых точек формата UTF-8 вместе с управляющими последовательностями ANSI для отрисовки атрибутов символов MC6845. Затем этот канал опрашивается внешней программой, выводящей из него текст в терминал (образец такой программы был добавлен в репозиторий).
На скриншоте ниже в Bochs выполняется игра при одновременном отображении SoftICE в окне терминала:

Сборка и установка
▍ Сборка Bochs
Клонируйте мой форк Bochs и скомпилируйте его с опцией
cpu-level-3, то есть под 386-процессор. Подробнее о компиляции Bochs сказано здесь. Вот пример:$ ./configure --with-sdl2 --enable-cpu-level=3
$ makeСоздайте образ жёсткого диска с помощью
bximage (часть сборки Bochs). Вполне сойдут предустановленные значения (hd / flat / 512) и размер в 30 МБ. Я назвал его hdd.img.Нам потребуется файл
.bochsrc, который мы инициализируем, запустив Bochs и выбрав 4. Save options to.... Затем мы его отредактируем, внеся следующие изменения (YMMV):romimage: file="/usr/local/share/bochs/BIOS-bochs-legacy", address=0x00000000, options=fastboot
floppya: 1_44=dos622_d1.img, status=inserted
ata0-master: type=disk, mode=flat, path=hdd.img
#port_e9_hack_all_rings: enabled=0Мне пришлось закомментировать
port_e9_hack_all_rings, потому что иначе Bochs выбрасывал ошибку. dos622_d1.img – это первый из установочных дисков MS-DOS 6.22. Все диски вы найдёте в разделе «Загрузки» ниже.▍ Установка DOS
В других версиях Bochs есть один неприятный момент – после выбора
6. Begin simulation Bochs переходит сразу к отладчику, требуя ввода c <newline> для продолжения выполнения. Чтобы это исправить, нужно создать файл (здесь я его назвал bochs_init), содержащий c и перевод строки, и передавать его в ��иде аргумента опции -rc. Также можно пропустить стартовое меню, передав -q. Объединяя эти два момента, следующая команда обеспечит быстрый запуск Bochs:$ bochs -q -rc bochs_initЕщё одна проблема в том, что Bochs аварийно завершается при запуске, когда в результате нечистого выхода остаётся файл блокировки образа диска. Поэтому, если присутствует висящий
hdd.img.lock, перед запуском Bochs его нужно удалить.Запустите Bochs и перейдите к установке MS-DOS. Когда система запросит очередной диск, кликните
CONFIG и измените файл образа для Floppy disk 0. После завершения установки измените опцию boot в .bochsrc с floppy на disk. При очередном запуске Bochs он должен загрузиться сразу в DOS.▍ Установка драйвера CD-ROM
Далее снова используйте
bximage, но теперь для создания образа дискеты (опции: fd / 1.44M). Я назову его floppy.img. Вставьте этот диск в Bochs (CONFIG / 1. Floppy disk 0) и отформатируйте командой format a: в DOS. Также можно изменить в .bochsrc опцию floppya, чтобы этот образ использовался по умолчанию. После форматирования мы монтируем его в хост-систему и копируем oakcdrom.sys, драйвер Oak CD-ROM (тоже лежит в разделе «Загрузки»):$ sudo mount floppy.img /mnt/tmp
$ sudo cp oakcdrom.sys /mnt/tmp
$ sudo umount /mnt/tmpУстанавливаем драйвер в DOS.
C:\> copy a:\oakcdrom.sys c:\dosC:\> edit config.sysДобавьте в
CONFIG.SYS эту строку:DEVICEHIGH=C:\DOS\OAKCDROM.SYS /D:MSCD001А в
AUTOEXEC.BAT эту:LH C:\DOS\MSCDEX.EXE /D:MSCD001▍ Установка SoftICE
Теперь, когда мы можем использовать CD-образ, давайте создадим его в хост-системе. Предполагая, что файлы SoftICE 2.80 (лежат в S-ICE280.ZIP внутри sice280_and_extras.zip в разделе «Загрузки») находятся в каталоге
sice, эта команда создаст из него образ ISO:$ mkisofs -o cdrom.iso -V CDROM siceДля вставки CD измените опцию
ata1-master в .bochsrc:ata1-master: type=cdrom, path=cdrom.iso, status=insertedПосле очередной загрузки DOS можно продолжать установку SoftICE.
C:\> mkdir sice
C:\> xcopy /e/s d: c:\siceВ файле
AUTOEXEC.BAT добавьте C:\SICE к переменной пути PATH. Обратите внимание, в DOS, в отличие от Bash, в качестве разделителя в путях используется точка с запятой:SET PATH=%PATH%;C:\SICEВ
CONFIG.SYS пропишите загрузку SoftICE до всех остальных драйверов:DEVICE=C:\SICE\S_ICE.EXEНа этом всё. После перезагрузки вы сможете вызывать SoftICE нажатием
Ctrl+d.
Отображение SoftICE через MDA
Для получения возможности отладки игр и аналогичных графических программ осталось проделать один шаг. Эмуляция MDA в моём форке Bochs активируется, когда Bochs находит переменную среды
MDA_PIPE, содержащую путь к именованному каналу передачи. Создайте этот канал в хост-системе:$ mkfifo /tmp/mda_pipeОбратите внимание, что после включения MDA при отсутствии работающей программы, использующей канал передачи, выполнение будет заблокировано. Поэтому далее мы такую программу запустим – это будет образец mda_viewer из репозитория.
$ cd ~/bochs-dual-monitor/mda_viewer/
$ MDA_PIPE=/tmp/mda_pipe python .Запустите Bochs, дополнительно указав
MDA_PIPE:$ MDA_PIPE=/tmp/mda_pipe ~/bochs-dual-monitor/bochs/bochs -qПодтверждение того, что MDA запущен, можно найти в выводе Bochs в виде следующей строки:
[MDA] Using named pipe "/tmp/mda_pipe".Запустите игру или иную программу, использующую режим VGA. Нажмите
Ctrl+d. Графический дисплей исчезнет. Но с уверенностью, что SoftICE сейчас находится на переднем плане (и с выбранным окном Bochs), введите следующую команду SoftICE:altscr onГрафический дисплей возвращается, и окно терминала, где выполняется
mda_viewer, теперь показывает SoftICE. Потребуется привыкнуть набирать команды не в окне терминала, а в окне Bochs. Зато теперь с помощью этой конфигурации можно реверс-инженерить программы DOS так, будто вы снова в 1990 году.Загрузки
Всё это ПО давно не поддерживается, так как самое молодое датируется 1997 годом.
MS-DOS 6.22 ↪
SoftICE 2.80 and extras ↪
OAKCDROM.SYS ↪
Скидки, итоги розыгрышей и новости о спутнике RUVDS — в нашем Telegram-канале 🚀

