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

Кража со взломом

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

Хакер, номер #109, стр. 032

(step@gameland.ru)

Крис Касперски

Как скопировать установленную программу

Хочется перенести программу на другой компьютер, но дистрибутив утерян или необозначен, а если даже и обозначен, жаль терять свои настройки. Знакомая ситуация, не правда ли? Существует множество утилит клонирования программ, но все они требуют обязательного наличия инсталлятора. А у нас его нет! Но зато если постараться и немного подумать, то можно обойтись и без него!

Когда-то, еще во времена старой-доброй MS-DOS, перенос, программ решался тривиальным копированием базового каталога (например, \GAMES\DOOM2\) с одного компьютера на другой. Эта техника не утратила своей актуальности и до сих пор, но используется все реже и реже. Современные программы в подавляющем большинстве нагло лезут в реестр, в директории типа \WINNT\System32 и еще в десяток подобных мест, разбрасывая свой код, данные и временные файлы по всей системе, а потому копирование базового каталога в чаще всего уже ничего не решает и на новом компьютере программа категорически отказывается работать.

Этим активно пользуются многие фирмы, специализирующиеся на обслуживании офисной техники. Устанавливая программы без дистрибутивов они сажают пользователей на иглу, вынуждая постоянно обращаться к себе за повторной установкой.

Метод каменных стрел и топоров

Начнем с самого тупого и классического метода. Сначала копируем базовый каталог на новую машину и запускаем приложение. Программа ругается, сообщая, чего ей там не хватает. Надо сказать, что не хватает ей обычно динамических библиотек. Ну, что ж — находим их и копируем. Запускаем и… снова обламываемся. Дело в том, что весь список отсутствующих библиотек тебе никто не сообщит, поэтому продолжаем этот незамысловатый процесс до тех пор, пока программа не запустится или пользователь не обломается. А обломаться он может по очень многим причинам. Стоит только программе вместо внятного сообщения об ошибке выдать что-то типа «Неправильная установка» - и все. Кранты!

Самый простой случай

Хорошо, инсталлятора у нас нет. Но деинсталлятор в подавляющем большинстве случаев все-таки остается. Чаще всего он кладется в базовый каталог с программой, реже - в папку \WINNT\Installer\. А деинсталлятор - это… тот же самый инсталлятор, только наоборот! Развернув принцип на 180 градусов, мы получим инструмент, который, собственно говоря, и искали. На самом деле, конечно, просто так взять и превратить деинсталлятор в инсталлятор не получится, как его не крути. Но вот выдрать из него список устанавливаемых файлов/драйверов и ветвей реестра вполне возможно. В половине случаев вообще не надо ломать голову, потому как в основном каталоге программы лежит лог-файл (обычно с расширением log), созданный инсталлятором с перечнем всех совершенных им действий. Загрузив его в любой текстовый редактор, например в FAR по <F4> или <F3>, мы можем видеть, какие файлы, динамические библиотеки и драйверы были скопированы и какие ключи реестра созданы. Остается только повторить эти действия вновь и… программа встанет на соседний компьютер как родная!

Так, ладно, довольно теории. Займемся практикой. Откроем для примера базовый каталог программы Macro Express 3, найдем в нем файл INSTALL.LOG и загрузим его в любой текстовый редактор.

Мы видим не только копируемые файлы/ярлыки/динамические библиотеки/etc, но и ветви реестра вместе с их значениями! Кстати, обратим внимание, что помимо базового каталога Macro Express 3 добрался до директории Common Files и начал там слегка безобразничать.

Впрочем, нам просто повезло. В некоторых (достаточно редких) случаях в лог-файл попадают только сами ветви реестра, создаваемые инсталлятором, без их значений, что, собственно говоря, и неудивительно, поскольку лог-файл чаще всего создается для деинсталлятора, которому достаточно знать лишь имя ключа реестра. На конкретное значение ему плевать. Вот оно и не попадает в лог. Ну что делать? Придется открыть старый-добрый редактор реестра и быстро-быстро извлечь оттуда все значения из обозначенных ключей на автопилоте.

А если лога нет?

Гораздо хуже, когда никакого лога в нашем распоряжении нет. Возьмем, например, достаточно известную утилиту PDF Creator. В базовом каталоге из всех интересующих нас вещей лежат лишь unins000.exe и unins000.dat. Ну первый из них мы отбросим сразу (это исполнительный движок — общий для всех программ, созданных инсталлятором данного типа), а вот unins000.dat откроем в FAR'е по <F3> или в Hiew'е.

В первой же строке мы видим: Inno Setup Uninstall Log (b). Ага, значит, это лог, созданный инсталлятором Inno Setup. И хотя лог не упакован (смотри по <F3> сколько хочешь), он представлен в неудобном для нас нетекстовом формате — в общем, изучать его в таком виде вообще не вариант. Гораздо удобнее будет заплатить десяток баксов за декомпилятор (или найти бесплатный)!

Набираем в Google «Inno decompiler» и получаем внушительный список, в котором мне больше всего понравился бесплатный InstallExplore от Сергея Ванина, выполненный в виде плагина для FAR'а — http://plugring.farmanager.com/downld/files/instexpl_v0.3.rar. Просто наводим курсор на файл, который мы хотим декомпилировать, нажимаем <Shift-F3> и получаем список файлов/ключей реестра в удобочитаемой форме или… сообщение об ошибке, но это очень редкий случай. Что ж делать, придется отправляться на поиски другого декомпилятора.

К сожалению, существует большое количество инсталляторов, для которых до сих пор нет достойных декомпиляторов. Взять хотя бы Nullsoft Install System (да-да, тот самый Nullsoft, подаривший нам Winamp), который используется для установки, к примеру, Abyss Web Server. Мы видим всего лишь один файл uninstall.exe, который включает в себя как исполнительный движок, так и лог.

Просматривая лог в Hiew'е, мы видим текстовые строки (смотри листинг), из которых заключаем, что программа что-то заносит в файл wininit.ini. Находим этот файл в каталоге Windows, открываем его и видим текстовую строку «[Rename] NUL=C:\DOCUME~1\ KRISKA~1\LOCALS~1\Temp\A~NSISu_.exe», так что с этим пунктом все ясно. Далее видно, что Abyss Web Server копирует себя в C:\Program Files в ProgramFilesDir — каталог с именем программы (в данном случае это Abyss Web Server), после чего лезет в ключ реестра Software\Microsoft\Windows\CurrentVersion и чего-то там создает. Ну, что он там создает, догадаться нетрудно: Abyss Web Server и создает. После этого добавляет себя на панель быстрого запуска Quick Launch и на этом считает свою миссию выполненной.

Вот мы и декомпилировали двоичный файл деинсталлятора в Hiew'е (или в FAR'е по <F3>) без всяких дополнительных утилит, то есть вручную. Конечно, нам повезло, что uninstall.exe не был упакован никаким протектором (в жизни и такое случается), а лог лежал в незашифрованном виде. Иначе без помощи отладчика и дизассемблера нам бы уже не обойтись. Однако это клинические случаи, которые практически не встречаются, а если даже и встречаются, то существуют гораздо более короткие пути, чем отладка и дизассемблирование.

Мониторинг файлов и реестра

Утилиты для наблюдения за обращением к файлу и ветвям реестра достаточно популярны в среде хакеров. Казалось бы, что может быть проще: запускаем filemon/regmon и смотрим, куда лезет наша подопытная программа. Конечно, с полученной простыней протокола еще предстоит повозиться, выкидывая из нее повторные обращения, но это все же проще, чем ковыряться в двоичном файле по <F3>.

На самом деле средства мониторинга - это last resort, к которому прибегают, когда по-другому перенести программу с одного компьютера на другой никак не получается. Дело в том, что всякая программа активно обращается и к тем ветвям реестра, которые сама не создает. Продемонстрируем это на примере популярного почтового клиента The Bat, протокол общения с реестром которого представлен на картинке.

Достаточно очевидно, что ветвь HKCU\Software\RIT\The Bat!\Editor\Font Size принадлежит самому The Bat'у и должна быть перенесена на соседний компьютер вместе с ним. А вот ветвь типа HKLM\System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{5B16484-4D38-4523-D6D-83753E568472} уже является частью системы и относится к TCP/IP-стеку со всеми его интерфейсами, идентификаторы которых на разных компьютерах навряд ли будут совпадать.

Возникает резонный вопрос: как отделить зерна от плевел, то есть выделить лишь те ветви реестра (файла), которые были созданы самой программой при ее установке? Ответ прост. Копируем базовый каталог подопытной программы на соседнюю машину, на ней же запускаем монитор реестра и смотрим, с открытием каких именно ветвей она обламывается (в этом случае в статусе операции будет указано ERROR или NOT FOUND). Однако следует учесть, что некоторые ветви реестра отсутствуют не просто так, а по творческому замыслу разработчика программы. В этом случае на целевом компьютере (с правильно установленной программой) монитор реестра выдаст тот же самый результат — NOT FOUND.

Перенос же ветвей реестра осуществляется элементарно, через его редактор. Просто выделяем требуемую ветвь, щелкнув по ней. В меню выбираем «Реестр -> Экспорт файла реестра» и в появившемся диалоговом окне говорим, что хотим экспортировать только выбранную ветвь, а не весь реестр целиком. Мы получаем reg-файл, запустив который на соседней машине, добавляем эту ветвь в реестр. Порядок добавления ветвей произволен.

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

Следы времени на песке файловой системы

Заходим в базовый каталог программы и смотрим, когда был создан главный исполняемый файл (кликаем правой клавишей мыши по «Свойствам»), например VMWare.exe. На компьютере автора время ее установки - 10 июня 2004 года, 18:12:30 (версия уже устарела, как мамонт, но для нас сойдет).

Давим «Пуск -> Найти -> Файлы и папки» и в параметрах поиска вводим «Дата -> Файлы, созданные -> с 10.06.2004 по 10.06.2004 -> Найти». Таким образом мы находим всю дичь, спрятанную не только в базовом каталоге VMware, но и в каталогах C:\WINNT\System32 и C:\WINNT\System32\Drivers. Красота!

К сожалению, этот способ не лишен недостатков. Если две или более программы устанавливались в один и тот же день, то поиск по времени покажет их всех, поскольку глупая оболочка Windows не позволяет задавать в критериях поиска минуты и секунды (да мы и не должны их задавать, ведь процесс установки иной раз занимает полчаса или около того).

Впрочем, просматривая свойства всех найденных файлов через контекстное меню (там время создания указывается с точностью до секунды), мы легко отсеем посторонних кандидатов, конечно, при том условии, что разные программы ставились с приличным разносом во времени. Если же установка проводилась в конвейерном режиме (то есть одна программа за другой), определить, какие файлы принадлежат какой программе, практически невозможно.

Другой тонкий вопрос. Если на момент установки подопытной программы требуемые ей библиотеки уже имелись на компьютере (например, .NET Framework), то, очевидно, они не были установлены, а даже если и были, то… при перезаписи новых файлов поверх старых время их создания не меняется (так уж устроен NTFS-драйвер). В результате после переноса на соседний компьютер программа может не найти каких-то библиотек и не запуститься. Каких именно, поможет выяснить файловый монитор, хотя в большинстве случаев удается обойтись и без него.

С этим справится каждый!

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

Регистрация OLE- и ActiveX-компонентов

OLE- и AcriveX-компоненты (заключенные в файлах с расширениями dll или ocx) помимо переноса на соседний компьютер требуют обязательной регистрации. Регистрация осуществляется штатной утилитой regsvr32.exe, запускаемой с именем регистрируемой библиотеки в командной строке. Просто берем dll- или ocx-файл и передаем его имя утилите regsvr32.exe в качестве параметра. Если регистрация прошла успешно, то все ОК, если же нет – мы увидим сообщение об ошибке. Беда в том, что если практически все ocx-файлы являются OLE-компонентами, то в случае с dll этого не скажешь. Как узнать, кто из них кто? Без дизассемблирования (и даже без подглядывания в таблицу импорта), только методом тыка!

Впрочем, процесс регистрации обратим, и ключ /u удаляет зарегистрированный компонент из системы. К сожалению, описанный способ не универсальный и далеко не всегда срабатывающий. Некоторые компоненты требуют регистрации с ключом /I, ожидающим увидеть строку параметров, которых мы не знаем и о которых даже не догадываемся. А ведь без правильной регистрации всех компонентов программа работать не будет!

Особенно много компонентов содержат программы, написанные на Visual Basic'е и Delphi. Впрочем, не будем отчаиваться. Раз регистрация по сути своей сводится к созданию новых ключей в системном реестре, то все они могут быть найдены по методике, описанной выше. То есть через монитор.

Охота за динамическими библиотеками

В некоторых руководствах по выдиранию приложений встречается утверждение, что определить набор используемых динамических библиотек можно с помощью Olly или Process Explorer'а. Все они показывают список DLL, загруженных в адресное пространство исследуемого процесса, делая тайное явным. И не нужно ковырять логи деинсталляторов. ОК, запускаем Process Explorer и смотрим, какие DLL использует, ну например, Опера.

И вот тут нас ждет «приятный сюрприз». Оказывается, что посторонние программы весьма активно внедряют свои динамически библиотеки во все запускаемые приложения для организации межпроцессорного взаимодействия. В данном случае мы видим PDESKRES.DLL, PDSHELL.DLL, PDTOOLS.DLL, принадлежащие оснастке карты Matrox G450, а также SSSensor.dll от SyGate Personal Firewall. И хотя от того, что мы перетащим их на соседнюю машину, никакого вреда не будет (без соответствующих exe эти библиотеки будут лежать мертвым грузом), но ведь и пользы от них никакой! А винчестеры все-таки не резиновые. Но даже это не самое страшное!

Некоторые динамические библиотеки подгружаются лишь в строго определенных ситуациях, например при нажатии на кнопку «Печать» или вызове определенного пункта меню. Естественно, до тех пор пока эти действия не будут совершены, список DLL, выдернутый из адресного пространства, будет одновременно и избыточный, и неполный.

DVD

Все утилиты, необходимые для копирования уже установленного приложения, мы выложили на нашем DVD.

WARNING

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

Содержание
загрузка...
Журнал Хакер #151Журнал Хакер #150Журнал Хакер #149Журнал Хакер #148Журнал Хакер #147Журнал Хакер #146Журнал Хакер #145Журнал Хакер #144Журнал Хакер #143Журнал Хакер #142Журнал Хакер #141Журнал Хакер #140Журнал Хакер #139Журнал Хакер #138Журнал Хакер #137Журнал Хакер #136Журнал Хакер #135Журнал Хакер #134Журнал Хакер #133Журнал Хакер #132Журнал Хакер #131Журнал Хакер #130Журнал Хакер #129Журнал Хакер #128Журнал Хакер #127Журнал Хакер #126Журнал Хакер #125Журнал Хакер #124Журнал Хакер #123Журнал Хакер #122Журнал Хакер #121Журнал Хакер #120Журнал Хакер #119Журнал Хакер #118Журнал Хакер #117Журнал Хакер #116Журнал Хакер #115Журнал Хакер #114Журнал Хакер #113Журнал Хакер #112Журнал Хакер #111Журнал Хакер #110Журнал Хакер #109Журнал Хакер #108Журнал Хакер #107Журнал Хакер #106Журнал Хакер #105Журнал Хакер #104Журнал Хакер #103Журнал Хакер #102Журнал Хакер #101Журнал Хакер #100Журнал Хакер #099Журнал Хакер #098Журнал Хакер #097Журнал Хакер #096Журнал Хакер #095Журнал Хакер #094Журнал Хакер #093Журнал Хакер #092Журнал Хакер #091Журнал Хакер #090Журнал Хакер #089Журнал Хакер #088Журнал Хакер #087Журнал Хакер #086Журнал Хакер #085Журнал Хакер #084Журнал Хакер #083Журнал Хакер #082Журнал Хакер #081Журнал Хакер #080Журнал Хакер #079Журнал Хакер #078Журнал Хакер #077Журнал Хакер #076Журнал Хакер #075Журнал Хакер #074Журнал Хакер #073Журнал Хакер #072Журнал Хакер #071Журнал Хакер #070Журнал Хакер #069Журнал Хакер #068Журнал Хакер #067Журнал Хакер #066Журнал Хакер #065Журнал Хакер #064Журнал Хакер #063Журнал Хакер #062Журнал Хакер #061Журнал Хакер #060Журнал Хакер #059Журнал Хакер #058Журнал Хакер #057Журнал Хакер #056Журнал Хакер #055Журнал Хакер #054Журнал Хакер #053Журнал Хакер #052Журнал Хакер #051Журнал Хакер #050Журнал Хакер #049Журнал Хакер #048Журнал Хакер #047Журнал Хакер #046Журнал Хакер #045Журнал Хакер #044Журнал Хакер #043Журнал Хакер #042Журнал Хакер #041Журнал Хакер #040Журнал Хакер #039Журнал Хакер #038Журнал Хакер #037Журнал Хакер #036Журнал Хакер #035Журнал Хакер #034Журнал Хакер #033Журнал Хакер #032Журнал Хакер #031Журнал Хакер #030Журнал Хакер #029Журнал Хакер #028Журнал Хакер #027Журнал Хакер #026Журнал Хакер #025Журнал Хакер #024Журнал Хакер #023Журнал Хакер #022Журнал Хакер #021Журнал Хакер #020Журнал Хакер #019Журнал Хакер #018Журнал Хакер #017Журнал Хакер #016Журнал Хакер #015Журнал Хакер #014Журнал Хакер #013Журнал Хакер #012Журнал Хакер #011Журнал Хакер #010Журнал Хакер #009Журнал Хакер #008Журнал Хакер #007Журнал Хакер #006Журнал Хакер #005Журнал Хакер #004Журнал Хакер #003Журнал Хакер #002Журнал Хакер #001