|
| |||
|
|
Не подумайте, что я сошёл с ума... Просто иногда мне хочется странного. Например, потратить несколько часов своей единственной, и оттого бесценной жизни, на разгадку какой-нибудь совершенно бесполезной пустяковины. А если к этому добавить мой патологический перфекционизм (начав дело, я уже не могу его бросить, пока не доведу до конца), то становится понятным, почему зачастую единственным результатом этого процесса оказывается только тренировка ума, без какой-либо практической пользы. Ну вот, отмазку я придумал, теперь можно переходить к практическим результатам. ;-) Уже довольно долго я пользуюсь наборами кодеков от 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.bin3. Вдумчивое разглядывание содержимого файла 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 - '2f6e8aa144908b174504d788e1a51d77b47ae70 P.S. Собственно, на этом можно было и успокоиться, если бы не одно "но": в новых версиях дистрибутивов K-Lite разработчики отказались от паролей-констант, и теперь они вычисляются в момент инсталляции по некоему довольно простому алгоритму. Что ж, пытливому уму это не помеха: находим в листинге номера двух функций, которые содержат в своём названии слово password, потом ищем код, где они выполняются. Чуть выше этого места должен быть вызов функции, формирующей переменную со строкой пароля. Вот, собственно, и всё. |
||||||||||||||