Запуск из Ubuntu программ в виртуальной WindowsXP, запущенной в VirtualBox

Использую Infra-Linux 8.10 (infra-linux.org) - максимально русифицированный вариант Ubuntu 8.10 с последним русским OpenOfiice.org от команды i-rs.ru. Столкнулся с невозможностью инсталляции некоторых программ из мира Windows под wine (в частности мне нужны по работе некоторые IDE для микроконтроллеров, устанавливающие собственные драйвера USB-устройств), равно не получилось под [email protected] Решил пока пойти альтернативным, хоть и не самым свободным, путём. Установив WindowsXP SP3 в виртуальной машине в VirtualBox 2.1.4 убедился, что нужные мне программы функционируют, а режим интеграции рабочего стола приятно скрывает некоторый дискомфорт от переключений.

Решил сделать возможным запуск программ в виртуальной Windows по клику на файл в Nautilus - как для исполняемых файлов, так и для ассоциированных в Windows расширений. Путей виделось несколько:

  1. запустить в Windows bat-файл, который ищет появление в расшаренной между Infra и Windows директории какого-нибудь файла с командой,
  2. найти и прикрутить нечто типа PsExec от Sysinternals,
  3. найти другой путь.

Первый вариант оставил на закуску - неинтересен он мне.

Второй вариант проверил - обнаружилась аналогичная утилита под Linux winexe - установил, проверил - не смоглось - то ли руки кривые, то ли утила сырая - консольные программы пускаются и работают, а вот варианты с GUI корректно не поднимают окон - такого рванья я давно не видел. Как запасный вариант можно было попробовать пускать родную PsExec из-под wine, но решил, что это масло масляное.

Оставался третий путь. Погуглив нашёл вариант удалённого запуска программ в Windows (к слову - равно и в *nix) - с помощью утилиты netcat. Добыл её вариант для Windows где-то, вроде там.

После некоторого времени ознакомления получил устойчивый способ запуска GUI-программ в удалённой Windows. Оставалось автоматизировать процесс передачи пути к файлу, а также постараться максимально просто оградить виртуальную Windows от сетевых угроз.

Первое было решено с помощью скрипта и ручного прописывания его вызова в контекстном подменю "Открыть в программе" файлов в nautilus. Естественно путь в виртуальной Windows проходит через сетевой драйв - примонтированную как x: расшаренную папку VirtualBox (имя ей было дано в Infra-Linux как ~/vboxshare).

Тут нужно остановиться подробнее. Infra-Linux у меня по традиции стоит второй системой (раньше была OpenSuse 10.3, и только на "копейке" - Acer Aspire One 110 - стоит Easy Peasy - кастомная Ubuntu 8.10 - как основная). Рядом установлена WindowsXP (религиозные вопросы обсуждать не будем;)) с NTFS-разделами. NTFS-разделы примонтированы через fstab с ntfs-3g. Симлинки на них положил для удобства на десктоп - в Infra-Linux он называется кириллицей "Рабочий стол" и попытки заменить имя просто переименовыванием папки приводят к удручающим последствиям - не знаю насколько эта папка отличается от остальных, но после переименования (позволяется) через неё не проходят симлинки;(.

Менять путь решил с помощью sed. Для перекодировки utf-8 в cp-866 нашлась имеющаяся в дистрибутиве утилита iconv.

Заодно в vboxshare сделал симлинк на /home/vitaly - обозвал vhome:

ln -fs /home/vitaly /home/vitaly/vboxshare/vhome

Возможно, сама утилита netcat в Ubuntu не предустановлена (обычно в большинстве дистрибутивов она есть из коробки), тогда её нужно установить:

sudo apt-get install netcat

В /home/vitaly/my создал файл скрипта, обозвал "windows". Прошу сильно не пинать за силу скриптостроения;) - получилось вот как:

#! /bin/bash
#
echo '"'x:$1'"'|iconv -f utf-8 -t cp866 |sed 's/\/home\/vitaly/\/vhome/g'|sed 's/\//\\/g'> a.txt
echo exit >> a.txt
nc -i 1 10.0.0.110 4455 < a.txt
rm a.txt

(10.0.0.110 - адрес виртуалки, 4455 - порт, который выбран руками для слушания на стороне виртуалки). Делаем скрипт исполняемым - можно набрать

chmod +x /home/vitaly/my/windows

или как делают такие лентяи, как я - просто правый клик на файле в nautilus->Свойства->вкладка Права, там поставить птицу Выполнение + Позволять выполнять файл как программы.

В строке запуска файла с определенным разрешением, например,exe, в подменю "Открыть в программе" nautilus-а пишу /home/vitaly/my/windows.

В виртуальной Windows в автозагрузку положил батинок следующего содержания:

nc -l -p 4455 -d -L -e "cmd.exe"

Окошко с cmd всплывает один раз при старте Windows и его закрываю руками. В учебниках по взлому расписывается как сделать эту дыру запускаемой незаметно, но тут я не стал изголяться. Существует утилита Cryptcat, выполняющая те же функции, что и Netcat, но с шифрованием (Blowfish), однако, ИМНО, это такая же дыра, только вид сбоку.

Итак, задача запуска решена.Пока это сочетание открытого для всех cmd на порту 4455 и расшаренных дисков работало через сетевую карту с фиксированным IP (у нас на работе DHCP раздаёт закрепленные MAC-ам IP), ну и с другим статическим IP в той же подсети в виртуальной Windows с хост-интерфейсом(виртуальной машины). Для начала были включены файрволы - в Infra-Linux ufw (по-быстрому настроен через gufw) и в Windows wipfw инсталлированного с опцией deny. В них были прописаны однотипные правила, разрешающие работу по порту 4455 между конкретными IP. В gufw это выглядит так:

10.0.0.3 4455/tcp ALLOW 10.0.0.110 4455/tcp 
10.0.0.110 4455/tcp ALLOW 10.0.0.3 4455/tcp

В wipfw.conf прописано то же так:

add 160 allow tcp from 10.0.0.3:4455 to 10.0.0.110:4455 in
add 160 allow tcp from 10.0.0.110:4455 to 10.0.0.3:4455 in

Вроде бы ничего, но файрвол на винде это, как мы знаем, скорее фикция. Получается, что для ломателей Windows через сетевую с определенной вероятностью можно добраться через шару до домашней директории Linux. Неаккуратненько;)(С)

Плюс, так как я это проделывал на работе, возник вопрос: а как же ж я это проверну дома, если провайдер раздаёт мне IP по DHCP и довольно часто его меняет? Да и на внешнюю сетевую выставлять винду это моветон. Погуглив нашёл решение - создал виртуальную сетевую карту и на неё замапил в свойствах виртуальной машины сетевой адаптер виртуальной Windows.

Сделано это было средствами user-mode-linux

sudo apt-get install uml-utilities

на основе инструкции отсюда - (оно немного не для того, но удалив пару строчек и подправив немного таки заработало) отредактировал /etc/rc.local

sudo gedit /etc/rc.local

добавив в него

TUN=vbox0 #имя предполагаемого хост-интерфейса
IP=192.168.17.1 #IP-адрес хост-интерфейса
USERNAME=vitaly #ваш логин
NETMASK=24      #маска подсети
tunctl -t $TUN -u $USERNAME
ifconfig $TUN up
ifconfig $TUN $IP/$NETMASK
arp -Ds $IP $TUN pub
echo 1 > /proc/sys/net/ipv4/conf/$TUN/proxy_arp

После перезагрузки поднимается интерфейс vbox0. Можно без перезагрузки дать команды

sudo /etc/init.d/rc.local stop
sudo /etc/init.d/rc.local start

В виртуальной машине IP ставим из подсети 192.168.17.0/24, но, естественно, не 192.168.17.1. Дальше дело техники.

В свежей виртуальной Windows XP SP3 пришлось разрешить исключение встроенному "файрволу" на предмет шарения файлов-папок - без этого пинги не пошли.

Остался только вопросик с сетевыми принтерами, но не в этот раз.

Добавление иконок исполняемых Win-приложений в Nautilus можно сделать с помощью пакета icoutils - мною был использован перевод соответствующей инструкции