Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #106, ОКТЯБРЬ 2007 г.

Portable — вот она радость!

Степан «Step» Ильин

Хакер, номер #106, стр. 036

(step@gameland.ru)

Создаем из любой программы ее portable-версию

Ну какой дурак поставил сюда этот древний Office? Куда делся интерпретатор Perl? Тут есть хоть один нормальный редактор кода? В такие моменты хочется пойти найти админа и надавать ему как следует: и бог с ним, что сам настроить ничего не может, так ведь и другим не дает. Чуть что – ограничение прав. Вот если на одной-единственной флешке был бы весь необходимый набор софта, тогда бы не приходилось тратить уйму времени на пустяки! Только вот найти portable-версии приложений очень сложно, а зачастую даже невозможно. Ну что делать? Значит, будем портировать сами! Решено.

Если внимательно изучить статистику загрузок, несложно заметить, что портированные версии программ пользуются ошеломляющим успехом и могут потягаться даже с оригинальными утилитами. Оно и понятно, куда приятнее иметь портативную версию программы при себе, нежели жестко зашитую в недрах системы. Все хорошо до тех пор, пока на флешку не потребуется записать что-то экзотическое. Ну, скажем, Perl-скрипт собственного сочинения или какое-то редкое приложение, для которого portable-версии, естественно, не окажется. Есть призрачный шанс, что нужное приложение не шибко норовит залезть внутрь системы, не покушается на реестр и, возможно, даже установится… Но куда вероятнее, что инсталлятор гордо выдаст ошибку, ссылаясь на недостаточность прав. Да чего таить, скорее всего, именно так и будет.

Теоретически можно отследить зависимости программы, посмотрев на то, что делает установщик во время инсталляции. Благо отследить изменения файловой системы и реестра легко с помощью небезызвестных утилит от Sysinternals — Filemon и Regmon, которые ныне принадлежат самому Microsoft. Но и тут велик шанс обломаться, поскольку изменения в чужой системе производить, как правило, запрещено. Другое дело - результаты нашего небольшого исследования можно оформить в виде плагина для Bart PE Builder и собрать на базе Windows свой LiveCD с нужной программой, но это все-таки не то. Перезапускаться в искусственное, достаточно тормозное и ограниченное окружение – это не самый лучший вариант. Тут нужно взять на вооружение инструменты покруче да посмелее. И, к счастью, такие есть.

Та же виртуализация, только в профиль

Многие дельные разработки долго остаются закрытыми от широкой публики. Иногда оттого, что у разработчиков напрочь отсутствуют PR-качества и они тупо не могут или даже не хотят распространять программу. Или же, наоборот, оттого, что меркантильная составляющая души подсказывает программеру, что свое детище нужно либо отдавать за деньги, либо вообще никак. И это как раз тот самый случай, который произошел с продуктом Thinstall. Еще во время написания довольно старого материала «Убойная флешка» я был наслышан о существовании подобной утилиты. Но тогда, к великому сожалению, даже сверхактивные поиски не привели меня к какой-либо рабочей и даже триальной версии программы. А вот сейчас она у меня в руках. Надо сказать, что просто закачать пробную версию с офсайта не получится: параноидальные модераторы отклоняли мою заявку, даже если в ней было указана абсолютно правильная информация обо мне. Я спам. Вот так. Виноваты сами: значит, буду использовать взломанную версию, ссылочку на которую я почерпнул в разделе «Варезник» форума www.ru-board.com.

Для того чтобы понять, зачем нужна и как работает эта утилита, давай разберемся: а что, собственно, мешает программам работать без установки на других машинах? Причин на самом деле не так много: во-первых, программы не могут записать и считать свои настройки из реестра (ветку HKEY_LOCAL_MACHINE использует практически любое приложение), и, во-вторых, они не имеют права на чтение и запись в глобальные каталоги, в том числе в c:\program files\ и системные папки Винды (system32 и прочие). Если бы для приложения можно было создать песочницу (во взрослой терминологии — sandbox), то есть виртуальное окружение со своим реестром и файловой системой (и, само собой, с зависимыми папками и ключами), к которым программа могла, как ей нужно, обращаться (при этом не внося изменения в основную систему), то оно отлично работало бы и вне родного компа. Вот как раз такой контейнер и позволяет сделать программа Thinstall.

Общий алгоритм портирования любого приложения заключается в следующем. Надо:

  1. сделать слепок системы (snapshot), записав текущее состояние файловой системы и реестра;
  2. установить программу, которую нужно портировать;
  3. сделать слепок системы после установки;
  4. выявить изменения в двух snapshot’ах;
  5. поместить файлы программы, а также все вспомогательные файлы (из системных директорий) и ключи реестра в специальный файл-контейнер, распространяемый в виде единственного exe-файла;
  6. во время запуска такого бинарника на другом компьютере создать виртуальное окружение sandbox для программы и воссоздать состояние системных файлов и реестра, которые видимы только для портированной программы.

Вот, собственно, и все, попробуем сделать это на практике?

«Боже, я стала портативной!»

Установленная Thinstall представляет собой набор файлов, в том числе бинарных. И сначала даже непонятно, что нужно запускать. Вот и хорошо, потому что запускать сейчас ничего и не надо :). Для портирования программы нам перво-наперво понадобится установить девственно чистую Винду (win2k или XP). Зачем?! Вообще говоря, по этому поводу можно не заморачиваться и портировать большинство приложений и на своей обычной системе с кучей установленных программ и многочисленных настроек «под себя». Но при этом в контейнер обязательно попадут посторонние ветки реестра и системные файлы, а это уже не есть хорошо. Более того, Thinstall практически моментально создает слепок чистой системы, в то время как над давно установленной ОС может корпеть по несколько минут. Или вот еще ситуация. У тебя на компьютере уже установлен .NET-фреймворк, и ты портируешь приложение, которое его использует. Естественно, файлы этой платформы в контейнер уже не попадут, и приложение уже не запустится на компьютере, где .NET не установлен. Комментарии излишни. Поэтому я тебе все-таки рекомендую и даже настоятельно рекомендую не полениться запустить какую-нибудь VMware Workstation или бесплатный VMware Server и потратить часок, чтобы установить ОС под виртуальной машиной. Специально для портирования приложений!

Вот теперь приступим. Из всех исполняемых файлов, которые лежат в папке с программой, нам понадобится только один — SetupCapture.exe. Это графический интерфейс для консольных утилит (компиляторов виртуальной файловой системы и реестра VFTool/VRegTool, а также специального линковщика TLink), которые, собственно, и занимаются сборкой портированных приложений. Рекомендую расшарить файлы из директории Thinstall, тогда к ним можно будет обратиться прямо из виртуальной машины (локальная сеть с домашней ОС, скорее всего, будет настроена автоматически), набрав в адресной строке UNC-адрес папки: \\step\Thistall (например). Это самый лучший вариант, поскольку мы ничего не копируем на чистую систему, хотя ничто не мешает это сделать, перенеся файлы Thinstall каким-либо еще способом (через ту же самую флешку).

Далее создаем первый слепок системы, то есть структуру, в которой содержится текущее состояние ОС без установленных программ и приложений. Для этого запусти утилиту SetupCapture и выбери Pre-install Scan. Перед этим можно было бы указать диск и ветки реестра для сканирования, но обычно по умолчанию все выставлено правильно. На быстром компьютере этот процесс едва ли займет более 10-20 секунд.

Теперь, когда сканирование системы завершено, можно приступить к установке непосредственно портируемого приложения. Просто возьми инсталлятор и сделай все самым обычным образом (не бойся, даже если потребуется перезагрузка) с одним одним-единственным нюансом. Позаботься о том, чтобы установщик создал на рабочем столе или в меню «Пуск» ярлыки для запуска приложения. Если такой опции не предусмотрено, как, например, в случае с интерпретатором Active Perl, ярлык нужно создать самому. Это очень важно, поскольку именно так Thinstall определяет, какие из появившихся в системе бинарников нужно портировать! В случае же, когда у приложения нет инсталлятора, можно просто вручную скопировать файлы в нужную директорию (а на рабочем столе, естественно, создать ярлыки). Это тоже нормально.

Теперь следующий шаг. В принципе можно было бы прямо сейчас приступать к повторному сканированию системы и созданию контейнера, но в этом случае приложение придется конфигурировать каждый раз заново. На фига нам такое счастье? Нет уж, предлагаю настроить все прямо сейчас, выставить нужные параметры. Допустим, если это браузер, то добавить закладки, установить домашнюю страницу, подключить к Firefox (а я использую именно его) все необходимые плагины (Firebug, DownloadIT и прочие прелести жизни). И только после этого программе следует дать отмашку на заключительное сканирование системы (кнопка Post-install Scan).

Сразу по завершении в Thinstall/Captures появится папка с названием проекта. Если внимательно присмотреться, то можно заметить, что все содержимое – это различные файлы и папки, которые появились в системе после сканирования, а также файлы с ключами реестра. Тут же лежит файлик build.bat. Если ты обращался к Thinstall по локальной сети, можешь смело приступать к его выполнению. В противном случае файлы придется переместить в реальную систему, туда, где была установлена Thinstall. Выполнение build.bat запускает компилятор виртуального реестра, паковщик виртуальной файловой системой, а также специальный линкер, который соберет все хозяйство в exe-файл. И в результате получаем что? Правильно, портированную версию приложения. Можешь тут же попробовать ее на другом компьютере и плясать от радости до упаду :).

Ох уж эти тонкости

Тут надо сказать, что на выходе может получиться несколько exe-файлов. Это значит, что во время установки приложения было создано несколько ярлыков и портированные версии, соответственно, скомпилировались для каждого бинарника. Как правило, необходимости в этом нет, но откуда же Thinstall об этом знать? Предлагаю ей это сообщить и заодно рассмотреть дополнительные нюансы портирования приложений. При всей простоте процесса, однако, предусмотрена масса дополнительных настроек, которые задаются в текстовом конфиге package.ini. Вот пример:

[BuildOptions]

OutDir=bin

SandboxName=reader7

[AdobeDownloadManager.exe]

Source=%ProgramFilesDir%\Common

Files\Adobe\ESD\AdobeDownloadManager.exe

ReadOnlyData=bin\Package.ro.tvr

[AcroRd32.exe]

Source=%ProgramFilesDir%\Adobe\Acrobat 7.0\Reader\AcroRd32.exe

Shortcut=AdobeDownloadManager.exe

[reader_sl.exe]

Source=%ProgramFilesDir%\Adobe\Acrobat 7.0\Reader\reader_sl.exe

Shortcut=AdobeDownloadManager.exe

Несложно заметить, что каждый exe’шник описывается в своей собственной секции. Все ненужное (в данном случае это секции [reader_sl.exe] и [AdobeDownloadManager.exe]) можно просто отсюда убрать и запустить процесс сборки контейнера (build.bat) заново. Теперь будет создан только один, нужный нам exe’шник.

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

CompressionType — с помощью этого параметра можно включить компрессию для файлов внутри контейнера. По умолчанию сжатие файлов отключено:

[Compression]

CompressionType=None

Для того чтобы его активировать, необходимо в качестве значения параметра указать Fast или Small для соответственно быстрого или медленного, но более эффективного сжатия. Вот так:

[Compression]

CompressionType=Fast

;CompressionType=Small

Еще один важный параметр — это тип изоляции (DirectoryIsolationMode), влияющий на поведение портированного приложения в системе. По умолчанию он выставлен в значение WriteCopy, позволяющее читать любые файлы с компьютера, но запрещающее вносить в них изменения. Причем если системный элемент (файл или ключ реестра) существует как в реальной, так и в виртуальной системе, то программа увидит исключительно виртуальный. В рамках package.ini это выглядит так:

[Isolation]

DirectoryIsolationMode=WriteCopy

В случае необходимости его можно выставить в Merged, и тогда программа сможет обращаться напрямую к реальным файлам в системе, а новые файлы будут сохраняться на жестком диске. Третий вариант — Full — рекомендуется использовать, когда приложение нужно полностью изолировать от реальной системы. Вся работа будет осуществляться исключительно в виртуальном окружении (sandbox’е).

Когда приложение портировать невозможно

Несмотря на то что большинство приложений отлично поддается портированию с помощью Thinstall, встречаются досадные, но вполне понятные ситуации-исключения, когда переносную версию программы сделать невозможно:

  • Приложение использует для своей работы предварительно установленный системный драйвер. А это практически все антивирусы, файрволы, VPN-клиенты. Чудес не бывает, и в чужой системе без прав администратора установить такие вещи, естественно, невозможно.
  • Программа основана на DCOM-сервисах. Thinstall изолирует COM и DCOM, поэтому к сетевым приложениям, которые используют эту технологию, можно обратиться только с локального компьютера.
  • В приложении используются глобальные DDL-хуки. Некоторые приложения используют API-функцию SetWindowsHooxEx для того, чтобы инжектировать DLL сразу во все процессы системы (например, для того чтобы перехватить активность клавиатуры и мыши). Такой фокус в окружении Thinstall не сработает.

U3 нос соседу!

U3 — это новый стандарт форматирования USB-накопителей, в который заложен принцип «подключил и работай». Сразу после подключения флешки в системе появляется два раздела: один (небольшой) в виде CD-ROM, другой (большой) как съемный накопитель. На первом размещается утилита LaunchPad, представляющая собой удобную панель для запуска программ. Поскольку раздел опознается операционной системой как CD-ROM диск, LaunchPad запускается автоматически. Своим видом LaunchPad сильно напоминает системное меню «Пуск», только здесь слева находится список программ, которые можно запустить с флешки, а справа — список возможных действий для управления диском и программами. Остальная часть флешки, определяющаяся как сменный накопитель, своей работой ничем внешне не выделяется. Помимо автозапуска LaunchPad, технология U3 позволяет программам работать в своем собственном окружении без предварительной инсталляции. Адаптированные для U3 приложения вправе взаимодействовать с файлами и реестром хост-машины, как если бы были установлены в систему. При этом все внесенные ими изменения откатываются, как только флешку вытаскивают из компьютера. К сожалению, все это возможно только в том случае, когда разработчики конкретной программы позаботились о совместимости с платформой U3 (SDK для программеров доступен на сайте www.u3.com).

WWW

  • www.thinstall.com — официальный сайт Thinstall, на котором выложена масса видероликов, демонстрирующих процесс портирования приложений. В том числе и сложные случаи, когда приложение использует платформу .NET, Java и ActiveX.

DVD

Мы постараемся выложить пробную версию программы Thinstall, если на это даст разрешение компания-разработчик. Помимо этого на DVD тебя ждет подборка portable-софта, в том числе для платформы U3.

Содержание