Linux coutner

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

Использую Infra-Linux 8.10 (infra-linux.org) - максимально русифицированный вариант Ubuntu 8.10 с последним русским OpenOfiice.org от команды i-rs.ru. Столкнулся с невозможностью инсталляции некоторых программ из мира Windows под wine (в частности мне нужны по работе некоторые IDE для микроконтроллеров, устанавливающие собственные драйвера USB-устройств), равно не получилось под WINE@Etersoft. Решил пока пойти альтернативным, хоть и не самым свободным, путём. Установив 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 - мною был использован перевод соответствующей инструкции

5
Ваша оценка: Нет (1 vote)

Комментарии

antanariva аватар

Здорово, думал

Здорово, думал как запустить на виртуалке "компас" с рабочего стола гнома, и вот ответ! ))

Только после прочтения и легкого офигевания, анекдот один вспомнился (не в обиду разумеется :) )
- Холмс, а что это за красное пятно на стене, мне оно не нравится... - сказал Ватсон, прижимаясь к полу
- Это, Ватсон, пятно, которое уже целый час пытается нас съесть - говорит уворачиваясь от пятна Холмс
- И что вы думаете с ним делать, Холмс?
- Элементарно, Ватсон. С точки зрения банальной эрyдиции - каждый индивидyyм, критически мотивирyющий абстракцию, может неадекватно реагировать на тенденции особых изменений, концептyально интерпретирyя общепринятые дефанизирyющие поляризаторы в свете всех кинетически кореллирyющих аспектов.
- Нну... Тогда.. я думаю мы можем спокойно спать!