- PVSM.RU - https://www.pvsm.ru -

Реверс-инжиниринг программ DOS как в старом добром 1990-м

На видео выше я записал наглядную реализацию процесса, описанного в разделе «Сборка и установка».

Эта статья посвящена запуску SoftICE, популярного отладчика для DOS и Windows, в эмулированной среде MS-DOS, а также обходу недостатка Bochs [1], эмулятора IA-32 (x86) PC.
Весь процесс выполнялся из-под Linux. Не знаю, получится ли проделать то же самое в MacOS, не говоря уже о Windows.

Эмуляция SoftICE

Отладчик SoftICE был разработан компанией NuMega в 1987 году и стал самым используемым инструментом для отладки DOS, а позднее и Windows. Последней его версией стала 2.80, которая вышла в 1997 году исключительно для DOS. У того, кто захочет использовать динамическую отладку для реверс-инжиниринга старого ПО сегодня, есть несколько вариантов:

  • DOSBox-X [2] — форк DOSBox, оснащённый отладчиком, имеющим сходство с SoftICE.
  • IDA [3] — хоть и является в первую очередь дизассемблером, также имеет режим отладки; плюс есть плагин dsbxida [4], используемый в качестве связки между IDA и DOSBox-X при отладке программ DOS.
  • Собственные инструменты, которые можно создать с помощью эмулятора процессора Unicorn [5]. Также есть UniDOS [6] — (пока что ограниченный) эмулятор DOS на базе Unicorn.

Однако если вы хотите не просто заняться реверс-инжинирингом, но и воспроизвести реальный опыт использования старых инструментов DOS, то с SoftICE ничто не сравнится. Когда соответствующее оборудование недоступно, мы прибегаем к эмуляторам, и вот здесь возникают свои сложности.

SoftICE не работает в DOSBox-X. Этот отладчик работает в Bochs, который, в отличие от DOSBox, основан на полной эмуляции x86 процессоров. А в этом случае придётся чуть повозиться с настройкой Bochs, но есть и другая проблема.

Предположим, мы установили MS-DOS и SoftICE в среде Bochs. Запустить SoftICE можно комбинацией Ctrl+d, и всё будет в порядке, если не пытаться проделать это в процессе выполнения программы, использующей VGA-режим – игры, например. В этом случае выполнение приостанавливается, и SoftICE по факту оказывается на первом плане, но мы его не видим из-за некорректного возобновления текстового режима. Окно Bochs просто уменьшается до высоты интерфейса отладчика.

На аппаратном уровне решением будет подключение дополнительного монитора ко второму графическому адаптеру, обеспечивающему вывод с контроллера дисплея MC6845 [7], то есть карты MDA/Hercules. После этого выполнение ALTSCR ON в SoftICE позволит переключить дисплей отладчика на второй монитор.

К сожалению, Bochs не эмулирует ни MDA (Monochrome Display Adapter), ни второй дисплей. Хотя сэмулировать текстовый режим MDA нетрудно, в конечном итоге я так и сделал. Я откопал старую тему [8] на SourceForge, где обсуждали добавление эмуляции MDA в Bochs. Полноценной реализации нигде не приводилось, поэтому я создал форк Bochs [9] с необходимыми изменениями.

Детали реализации можно найти в файле readme репозитория. Самое важное, пожалуй, то, что текстовый экран MDA в самом Bochs не отображается. Он записывается в именованный канал передачи (pipe) в виде кодовых точек формата UTF-8 вместе с управляющими последовательностями ANSI для отрисовки атрибутов символов MC6845. Затем этот канал опрашивается внешней программой, выводящей из него текст в терминал (образец такой программы был добавлен в репозиторий [10]).

На скриншоте ниже в Bochs выполняется игра при одновременном отображении SoftICE в окне терминала:

Реверс-инжиниринг программ DOS как в старом добром 1990-м - 1

Сборка и установка

▍ Сборка Bochs

Клонируйте мой форк Bochs и скомпилируйте его с опцией cpu-level-3, то есть под 386-процессор. Подробнее о компиляции Bochs сказано здесь [11]. Вот пример:

$ ./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

«Загрузки» [12] ниже.

▍ Установка 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

«Загрузки» [12]):

$ 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:DOSOAKCDROM.SYS /D:MSCD001

А в AUTOEXEC.BAT эту:

LH C:DOSMSCDEX.EXE /D:MSCD001

▍ Установка SoftICE

«Загрузки» [12]) находятся в каталоге 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:SICES_ICE.EXE

На этом всё. После перезагрузки вы сможете вызывать SoftICE нажатием Ctrl+d.

Реверс-инжиниринг программ DOS как в старом добром 1990-м - 2

Отображение SoftICE через MDA

Для получения возможности отладки игр и аналогичных графических программ осталось проделать один шаг. Эмуляция MDA в моём форке Bochs активируется, когда Bochs находит переменную среды MDA_PIPE, содержащую путь к именованному каналу передачи. Создайте этот канал в хост-системе:

$ mkfifo /tmp/mda_pipe

Обратите внимание, что после включения MDA при отсутствии работающей программы, использующей канал передачи, выполнение будет заблокировано. Поэтому далее мы такую программу запустим – это будет образец mda_viewer [10] из репозитория.

$ 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 [13] [14]
SoftICE 2.80 and extras [15] [16]
OAKCDROM.SYS [17] [18]

Автор: Дмитрий Брайт

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/staroe-zhelezo/390016

Ссылки в тексте:

[1] Bochs: https://bochs.sourceforge.io/

[2] DOSBox-X: https://dosbox-x.com/

[3] IDA: https://hex-rays.com/ida-free/

[4] dsbxida: https://github.com/lab313ru/dsbxida

[5] Unicorn: https://www.unicorn-engine.org/

[6] UniDOS: https://github.com/aquynh/unidos

[7] MC6845: https://en.wikipedia.org/wiki/Motorola_6845

[8] старую тему: https://sourceforge.net/p/bochs/discussion/39593/thread/5a1bab61/

[9] создал форк Bochs: https://github.com/santosoj/bochs-dual-monitor

[10] добавлен в репозиторий: https://github.com/santosoj/bochs-dual-monitor/blob/master/mda_viewer/__main__.py

[11] здесь: https://bochs.sourceforge.io/doc/docbook/user/compiling.html

[12] «Загрузки» : #anchorid1

[13] MS-DOS 6.22: https://storage.googleapis.com/20kbps-static/00_MISC/jscom/dos622.tar.bz2

[14] ↪: #anchorid2

[15] SoftICE 2.80 and extras: https://storage.googleapis.com/20kbps-static/00_MISC/jscom/sice280_and_extras.zip

[16] ↪: #anchorid3

[17] OAKCDROM.SYS: https://storage.googleapis.com/20kbps-static/00_MISC/jscom/oakcdrom.sys.bz2

[18] ↪: #anchorid4

[19] Источник: https://habr.com/ru/companies/ruvds/articles/792226/?utm_source=habrahabr&utm_medium=rss&utm_campaign=792226