Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет redrat ([info]redrat)
@ 2008-09-20 03:20:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Не подумайте, что я сошёл с ума...
Просто иногда мне хочется странного. Например, потратить несколько часов своей единственной, и оттого бесценной жизни, на разгадку какой-нибудь совершенно бесполезной пустяковины. А если к этому добавить мой патологический перфекционизм (начав дело, я уже не могу его бросить, пока не доведу до конца), то становится понятным, почему зачастую единственным результатом этого процесса оказывается только тренировка ума, без какой-либо практической пользы.

Ну вот, отмазку я придумал, теперь можно переходить к практическим результатам. ;-)

Уже довольно долго я пользуюсь наборами кодеков от K-Lite (чего, кстати, и вам советую). Однажды в процессе вивисекции Виндов мне понадобилось выяснить, какие ключи реестра прописывет WMlite при установке, однако хитрые разработчики не захотели делиться этой информацией с миром, и потому защитили свой дистрибутив паролем. Вот тут-то меня и клинануло...

В общем, представляю вам один из методов взлома защищённых паролем дистрибутивов Inno Setup.

1. Для начала нам понадобятся три вещи: распаковщик innounp (берём тут), декомпилятор ROPS (берём там же), и собственно сам дистрибутив (в нашем случае - wmlite240.exe). Сразу хочу пояснить, что после наездов одной очень мелкомягкой фирмы дистрибутив wmlite был убран с официального сайта, так что если захотите повторить мои исследования - ищите его в Сети, и да обрящите!

2. Натравив innounp на дистрибутив сразу же выясняем, что все файлы в нём защищены паролем, и следовательно - не могут быть извлечены. Но здравый смысл нам подсказывает, что пароль должен храниться где-то внутри дистрибутива! Что ж, беглый взгляд на документацию подсказывает, что у innounp есть нужный нам ключик "-m", который позволяет извлекать "internal embedded files". Проверяем:

D:\Work>innounp.exe -v -m wmlite240.exe
; Version detected: 5102
Size        Time              Filename
--------------------------------------
    221184  2002.08.29 03:41  {sys}\msadds32.ax
    278559  2003.11.20 22:48  {sys}\wmv8ds32.ax
    258048  2003.11.20 22:50  {sys}\wmvds32.ax
         <...>
      2184  2008.09.20 01:16  embedded\InfoBefore.rtf
     14139  2008.09.20 01:16  embedded\CompiledCode.bin
     52574  2008.09.20 01:16  embedded\WizardImage.bmp
      4158  2008.09.20 01:16  embedded\WizardSmallImage.bmp
       223  2008.09.20 01:16  embedded\en.isl
     15622  2008.09.20 01:16  install_script.iss
--------------------------------------
Очевидно, что единственным подходящим кандидатом на роль хранителя пароля является скрипт установки CompiledCode.bin, вот его-то мы и вытащим из дистрибутива (по очевидным причинам он не запаролен).

D:\Work>innounp.exe -x -m wmlite240.exe embedded\CompiledCode.bin
3. Вдумчивое разглядывание содержимого файла CompiledCode.bin приводит нас к мысли, что найти пароль в этой мешанине символов будет довольно затруднительно. Самое время воспользоваться второй утилиткой - декомпилятором установочных скриптов Inno Setup.

D:\Work>disasm CompiledCode.bin CompiledCode.txt
Вот, теперь стало немного понятнее! Совсем немного... Где-то внутри полусотни килобайт этого текста прячется пароль, но где именно? Тут есть два пути: честный и быстрый. Честный - это сесть и внимательно просмотреть весь исходник скрипта, прокручивая в голове логику его работы и пытаясь найти функцию, которая отвечает за подстановку пароля. Но мы пойдём другим путём™!

4. Где-то на просторах Интернета я отыскал пароль к старому дистрибутиву K-Lite версии 2.70, теперь оставалось только найти сам этот дистрибутив (eMule рулит!) и применить к нему три вышеописанные операции.

Не буду вас томить: нужная нам функция называется CURPAGECHANGED. Конечно, она делает много разных вещей, но если внимательно просмотреть в ней все присваивания переменных вида ASSIGN Base[1], то кандидатов на роль пароля окажется не так уж и много. В частности, для klcodec270b.exe им оказался 'WizardForm', а для wmlite240.exe - '2f6e8aa144908b174504d788e1a51d77b47ae704'.

P.S. Собственно, на этом можно было и успокоиться, если бы не одно "но": в новых версиях дистрибутивов K-Lite разработчики отказались от паролей-констант, и теперь они вычисляются в момент инсталляции по некоему довольно простому алгоритму. Что ж, пытливому уму это не помеха: находим в листинге номера двух функций, которые содержат в своём названии слово password, потом ищем код, где они выполняются. Чуть выше этого места должен быть вызов функции, формирующей переменную со строкой пароля. Вот, собственно, и всё.


(Добавить комментарий)


[info]ibicus_lj@lj
2008-09-19 23:04 (ссылка)
> в момент инсталляции по некоему довольно простому, но весьма запутанному алгоритму

Привязано к железу?

(Ответить) (Ветвь дискуссии)


[info]redrat@lj
2008-09-20 05:23 (ссылка)
Не, к железу оно точно не привязано, просто строчка пароля не хранится в готовом виде, а формируется в момент инсталляции по некоему алгоритму. Грубо говоря, её не найти контекстным поиском. Глубже ковыряться мне пока лень, да и необходимости особой нет. Боюсь, если начну - опять убью на это пару вечеров... ;-)

(Ответить) (Уровень выше)


[info]redrat@lj
2008-09-20 07:11 (ссылка)
Блин, ну зачем ты меня спросил?! :-((

Короче, пароль на последний klcodec417f.exe - 'd239r9rv3rhjruewwrw382rqwdhr00'.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ibicus_lj@lj
2008-09-20 15:17 (ссылка)
> Блин, ну зачем ты меня спросил?!

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]redrat@lj
2008-09-20 15:40 (ссылка)
Как показывает опыт, единственным надёжным средством защиты ПО являются аппаратные внешние ключи. Всё остальное рано или поздно вскрывается с помощью современных средств отладки и эмуляции.

Другое дело, что стоимость защиты должна быть адекватна стоимости защищаемого ПО. А то встречаются довольно забавные случаи... ;-)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]ibicus_lj@lj
2008-09-20 15:46 (ссылка)
C ключами возникает дикая проблема в дистрибуции.

(Ответить) (Уровень выше)


[info]aleks1958@lj
2008-09-20 09:56 (ссылка)
Круто... Ломка это хорошая тренировка ума.Да и знания приобретенные при ломке - пригодятся обязательно

(Ответить) (Ветвь дискуссии)


[info]redrat@lj
2008-09-20 15:42 (ссылка)
Ну, назвать это ломкой - это грубо польстить. Другое дело, что нынешняя жизнь не даёт много пищи для ума, приходится питаться эрзацами... ;-)

(Ответить) (Уровень выше)


[info]nazikus@lj
2012-11-23 23:14 (ссылка)
хе, не я один такими пустяками страдаю :)

сейчас пробую вскрыть последний k-lite, хочу посмтотреть как именно он кодеки вшивает в систему. Извлек .bin, декомпилировал, в глаза кинулась строка 'FF58iFwioAF09X8VKcMnrd9UnrrfUK2cUrehGctuT8vN9H7tZymM6BobzwwV7NTo', сразу обрадовался... но не тут то было. innounp не принимает, говорит неверный пароль. Из 60000 строчек кода, вырезал regex'ом все строки (все то, что в кавычках), но ничего похожего на пароль не нашел. Слово 'password' встречается только в трех местах, и то в объявлении какого-то класса. Ну вот и застрял. Не подскажете куда еще можно копнуть?

если интересно, вот декомпилированный файл - https://dl.dropbox.com/u/553423/CompiledCode.txt

(Ответить) (Ветвь дискуссии)


[info]redrat@lj
2012-11-24 04:27 (ссылка)
Ну, в постскриптуме я уже писал, что в последних версиях K-Lite пароли в явном виде не хранятся, а вычисляются в момент исполнения.

Копать можно в двух направления: сверху - внимательно посмотреть код функции [469] CURPAGECHANGED и попробовать найти в ней место, где формируется строка пароля; и снизу - предположить, что "заготовка" для пароля формируется в функции [2] и отследить, где эта функция вызывается и что делается с её результатом.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]nazikus@lj
2012-11-24 07:36 (ссылка)
кстати, а почему именно CURPAGECHANGED (а не INITIALIZESETUP, например)? предполагаете, что пароль проверяется на каждой странице визарда?

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

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]nazikus@lj
2012-11-24 07:46 (ссылка)
с скобками кажись понял, это просто адрессация такая (обычно она шестнадцатеричная), а возрастают по разному потому что "цена" каждого вызова своя.

(Ответить) (Уровень выше)


[info]redrat@lj
2012-11-24 14:29 (ссылка)
а почему именно CURPAGECHANGED
Ну, вот выбрали разработчики K-Lite именно эту функцию по каким-то одним им ведомым причинам. Вполне возможно, что сейчас формирование строки пароля происходит в другой функции.

это "стандартный" ассемблер?
Нет, это псевдокод установщика Inno Setup, называется PascalScript. Его исходники доступны тут: https://github.com/remobjects/pascalscript. Цифры в квадратных скобках обычно обозначают адрес или смещение относительно базы.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]nazikus@lj
2012-11-24 15:55 (ссылка)
спасибо.
буду копать на сколько хватить терпения :)

(Ответить) (Уровень выше)