Рассмотрим передачу файлов в виртуальную машину с помощью симуляции активности пользователя.
Представим что у нас есть некоторая виртуальная машина под управлением операционной системы DOS (FreeDOS 1.1/MS-DOS 6.22) с полным набором программ, но не имеющая съемных носителей, последовательных и параллельных портов, доступа в сеть и установленных гостевых дополнений. Единственное что доступно — это консоль.
Попробуем скопировать файлы в виртуальную машину с машины клиента через… клавиатуру! Хотя и виртуальную :)
Так как копирование фалов по клавиатуре процесс длительный даже при использовании эмулятора клавиатуры "Key Paste", запасаемся свободным временем и приступаем.
Тестовый стенд
Для начала подготовим тестовый стенд для нашего эксперимента:
- Хост виртуализации QEMU и клиент — GNU/Linux
- Виртуальные машины:
- ВМ «DOS»
- ВМ «Windows XP» (также клиент ВМ «DOS»)
Доступ к виртуальной машине Windows XP осуществляется через протокол SPICE. Установлены и работают гостевые дополнения имеется выход в сеть.
Доступ к виртуальной машине DOS осуществляется через протокол VNC. Никаких дополнительных программ не установлено.
На виртуальной машине «Windows XP» запущена программа «Key Paste» готовая к эмуляции набора текста. Так как набор текста парализует работу в операционной системе, вынос клиента виртуальной машины DOS в виртуальную машину или отдельный компьютер вполне оправдано.
Создание простого бинарного файла
Попробуем создать в ВМ «DOS» простой бинарный файл размером в 5 байт в котором каждый байт содержит значение соответствующее его позиции а именно: 1,2,3,4,5 в шестнадцатеричной системе исчисления.
Создаем файл 5.txt со следующим содержимым:
n 5.bit e 0000 01 02 03 04 05 rcx 5 w 0 q
где, первая строка определяет имя создаваемого файла, вторая — содержимое файла в шестнадцатеричном формате, четвертая — размер файла.
Отправим файл на обработку программой «Debug»
debug < 5.txt
С помощью команды dir убеждаемся что файл создан
dir 1.bit
Подготовка к передаче большого файла
Debug позволяет создавать бинарные файлы только до 64Кб. Для создания больших файлов воспользуемся кодированием Base64, которое используется в электронной почте. В DOS по умолчанию нет средств для работы с кодировкой Base64 по-этому скопируем программу для работы с кодировкой base64 и программу для проверки контрольных сумм md5.
Первым делом, скопируем программу md5sum для проверки контрольных сумм md5, используя шестнадцатеричное представление.
В Linux с помощью программы hexdump создадим заготовку файла для передачи в программу debug
hexdump -v -e '"e %04_ax "' -e '10/1 "%02X "' -e '"n"' md5sum.exe > md5sum_.hex
На выходе получим файл с содержимым вида:
e 0000 4D 5A 73 01 3C 00 01 00 02 00 e 000a F1 0F FF FF 66 12 00 50 00 00 e 0014 00 00 00 00 1C 00 00 00 0E 00 e 001e 74 07 B9 80 3B BE FE 76 89 F7 e 0028 1E A9 B5 80 8C C8 05 05 00 8E e 0032 D8 05 FC 0A 8E C0 FD F3 A5 FC e 003c 2E 80 6C 12 10 73 E7 92 AF AD
Подсчитаем размер файла md5sum.exe с помощью команды
ls -l md5sum.exe
В результате получим число «30579». Преобразуя данное число в шестнадцатеричную систему исчисления из десятичной получим число «7773».
Используя заготовку и информацию о размере файла создадим исходный файл для создания бинарного файла с помощью программы debug.
Проверим работоспособность файла в ВМ «Windows XP».
debug < md5sum.txt
Файл собрался. Переименуем файл md5sum.bin в файл md5sum.exe и попробуем подсчитать контрольную сумму файла md5sum.exe.
md5sum.exe md5sum.exe
контрольная сумма подсчитана и совпадает.
Теперь можно передать файл в DOS и проверить контрольную сумму
Аналогичным образом скопируем файл base64.exe.
Копирование большого файла
Попробуем скопировать большой файл. В качестве примера возьмем дистрибутив «DOS Navigator» от компании «RIT-labs». Закодируем файл дистрибутива «dn151.zip» в формат Base64 с помощью команды:
base64 dn151.zip > dn.b64
Аналогичным образом запакуем файл unzip.exe
base64 UNZIP.EXE > unzip.b64
Так как текстовый редактор edit в DOS очень тяжело переваривает большие текстовые файлы, разобьем файл «dn.b64» на файлы по 3500 строк с помощью команды split
split -d -l 3500 dn.b64 dn
В результате выполнения команды получим файлы: «dn.00», «dn.01», «dn.02» и «dn.03».
С помощью edit и клавиатуры скопируем полученные файлы в DOS. С помощью перенаправления потока, объединим четыре текстовых файла в один
type dn.00 >> dn.txt type dn.01 >> dn.txt type dn.02 >> dn.txt type dn.03 >> dn.txt
Полученный файл раскодируем с помощью base64
base64 dn.txt dn.zip
раскодируем распаковщик:
base64 unzip.txt unzip.exe
Распакуем архив дистрибутива «DOS Navigator»
unzip -e dn.zip -d c:dn
После распаковки можно запускать «DOS Navigator» командой:
c:dndn
Заключение
В результате данного эксперимента мы научились с помощью эмулятора клавиатуры передавать большие объемы текста, копировать файлы в виртуальные машины даже под управлением DOS. Которая казалась бы на первый взгляд не содержит средств взаимодействия с буфером обмена и создания бинарных файлов.
Процесс передачи файлов чрезвычайно медлителен, однако с другой стороны он работает и может использоваться в аварийных ситуациях или параноидальных условиях. Прежде чем приступать к реальной передаче файлов через клавиатуру вы можете скопировать текстовые файлы со специально подготовленного компакт-диска.
Используемое ПО:
- KeyPaste [ umvirt.org/projects/keypaste ]
- MD5sum [ www.freedos.org/software/?prog=md5sum, www.ibiblio.org/pub/micro/pc-stuff/freedos/files/util/file/md5sum/ ]
- Base64 [ old-dos.ru/files/file_1422.html ]
- 7Zip [ www.freedos.org/software/?prog=7-zip ]
- UnZip [ www.freedos.org/software/?prog=unzip ]
- Dos Navigator [ www.ritlabs.com/en/products/dn/, www.ritlabs.com/download/files3/dn/dn151.zip ]
Автор: b0r1s