Blog. Just Blog

Исследование защиты программы Icecream Slideshow Maker

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Icecream Slideshow Maker
Скриншот программы Icecream Slideshow Maker

Программа Icecream Slideshow Maker, как вы догадались из названия, предназначена для создания слайд-шоу. Все делается за несколько кликов, достаточно просто выбрать фотографии, эффекты перехода, длительность отображения кадров, а потом сохранить готовый видеоролик в нужном формате. В незарегистрированной версии есть ограничение по количеству слайдов, а также по разрешению и формату готового видео. Не люблю ограничения.

Забираем дистрибутив с сайта, устанавливаем, смотрим. Помимо самой программы инсталлятор пытается ставить всякие кодеки, библиотеки Qt и прочую муть, но главный исполняемый файл все равно один. Он ничем не накрыт и не упакован, отправляем его на дизассемблирование.

Сообщение незарегистрированной версии
Сообщение незарегистрированной версии

Настройки незарегистрированной версии
Настройки незарегистрированной версии

Незарегистрированная версия ведет себя как написано, то есть ограничивает количество слайдов при добавлении файлов в проект, предлагает обновиться до полной версии при выборе формата и большого разрешения видеофайла. В настройках есть кнопка активации, но код все равно проверяется на сервере. Что ж, значит будем применять бинарную хирургию.

Если посмотреть на заголовок окна, то там будет надпись "FREE". Логично предположить, что после активации там должно быть что-то вроде "PRO", раз уж такая формулировка встречается в окне с предложением активации.

Строки сообщения в файле
Строки сообщения в файле

Так и есть, обе строчки легко обнаруживаются в файле. Идем в дизассемблер, не забывая, что имеем дело с Qt. Указатели на указатели на указатели, овощи там, рожь, вот это все.
  1. .rdata:0055ABCC aPro            db 'PRO',0   ; DATA XREF: .data:off_68B0A0
  2. .rdata:0055ABD0 aFree           db 'FREE',0  ; DATA XREF: .data:off_68B0A4
  1. .data:0068B0A0 off_68B0A0      dd offset aPro
  2. .data:0068B0A0                                         ; "PRO"
  3. .data:0068B0A4 off_68B0A4      dd offset aFree
  4. .data:0068B0A4                                         ; "FREE"
  1. ; Функция проверки зарегистрированности
  2. .text:0049B7AE                 call    sub_420000
  3. ; Если она вернула AL=0, то программа не зарегистрирована
  4. .text:0049B7B3                 test    al, al
  5. .text:0049B7B5                 jz      short loc_49B7EF
  6. ; "PRO"
  7. .text:0049B7B7                 mov     edx, off_68B0A0
  8. .text:0049B7BD                 test    edx, edx
  9. .text:0049B7BF                 jz      short loc_49B7D1
  10. ...
  11. ...
  12. ...
  13. .text:0049B7EF loc_49B7EF:
  14. ; "FREE"
  15. .text:0049B7EF                 mov     edx, off_68B0A4
  16. .text:0049B7F5                 test    edx, edx
  17. .text:0049B7F7                 jz      short loc_49B80B
  18. .text:0049B7F9                 mov     ecx, edx
  19. .text:0049B7FB                 lea     esi, [ecx+1]
  20. .text:0049B7FE                 mov     edi, edi
Функция проверки по сути проверкой не является, тут просто загружается флаг зарегистрированности. Сама проверка выполняется где-то в другом месте.
  1. .text:00420000 sub_420000
  2. .text:00420000                 mov     al, [ecx+10h]
  3. .text:00420003                 retn
  4. .text:00420003 sub_420000      endp
Что ж, раз тут используется флаг состояния регистрации, то надо просто заменить код, чтобы функция всегда возвращала AL=1. Пара команд MOV AL,1 и RET решают эту задачу. Сохраняем изменения, запускаем.

Сообщение о поврежденном файле
Сообщение о поврежденном файле

Ага, исходный файл с цифровой подписью, мы его пропатчили, значит контрольная сумма изменилась и подпись стала невалидная. Программа проверяет цифровые подписи и в случае изменения своих компонентов перестает запускаться.

Строка сообщения в файле
Строка сообщения в файле

Строка также легко обнаруживается в файле. Осталось найти место в коде, где и как выполняется проверка целостности.
  1. .text:004AEC53                 mov     esi, eax
  2. .text:004AEC55                 push    1Ch
  3. .text:004AEC57                 push    offset aTheFile1IsNotS
  4. ; "The file '%1' is not signed."
  5. .text:004AEC5C                 mov     byte ptr [esp+168h+var_4], 1
Этот код находится внутри достаточно объемной процедуры, где вызываются стандартные функции проверки цифровых подписей, а также обрабатываются различные ошибочные ситуации. На выходе AL=1 - цифровая подпись корректная, AL=0 - ошибка проверки целостности. Патчим начало функции проверки командами MOV AL,1 и RET. Сохраняем изменения, запускаем. Вместо сообщения об ошибке нас радостно встречает сплеш-окно запускаемой программы.

Программа успешно "зарегистрирована"
Программа успешно "зарегистрирована"

В заголовке окна появилась надпись "PRO", в настройках пропала кнопка активации, при добавлении файлов больше нет ограничений, а при выборе формата видео никаких сообщений не появляется. Готовый видеоролик создается также без проблем. Цель достигнута.

Поделиться ссылкой ВКонтакте
Просмотров: 1482 | Комментариев: 9

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (19.08.2019 в 13:41):
master-ufa (18.08.2019 в 05:44):
Дилетанский вопрос.
«Патчим начало функции проверки командами MOV AL,1 и RET»
заменяем адреса 004AEC53
.text:004AEC53                 mov     esi, eax
На:
.text:004AEC53                 mov     AL, 1
.text:004AEC54   RET

Ниже добавляем новый адрес?
Можно добавить скрин с внесенными изменениями?
ManHunter (15.08.2019 в 10:55):
MNV, по поводу запросов в правилах сайта все предельно ясно написано.
MNV (10.08.2019 в 13:30):
Прочитал почти все Ваши статьи по исследованию защит разнообразных программ. Как было некоторыми замечено, для препарирования брались программы с довольно простой конструкцией. Строки лежат в открытом виде, многие "защиты" обходились патчем условного перехода. Конечно, Ваш опыт очевиден, плюс Вы ещё и материал излагаете лаконично и без лишней воды. Разбираете даже сам алгоритм генерация ключа или его проверки. Это очень важная информация для становления крекера здорового человека. Кейген - высший пилотаж, без сомнений.
Разбирал программу, ScreenCam называется, без упаковщика, без протектора, но код внутри довольно хитрый. Получилось обойти проверку рег данных, но изменения в файл вносить нельзя, где-то зарыта проверка то ли на CRC, то ли на что-то ещё. Сделал лоадер, запускаю через него, но рег данные каждый раз нужно вносить снова, хоть и любые, но напрягает, что решение получилось костылём.
Может у Вас будет возможность и интерес разобрать не совсем стандартный код? Было бы интересно прочитать Ваш разбор такой программы. Если будет интересно, скачать можно тут [del]
xussr (07.08.2019 в 22:57):
За спасибо разобрался да за одно на других продуктах этой фирмы потренировался правда не во всех они проверку подписи делали ))))
ManHunter (07.08.2019 в 14:34):
Тогда место для патча в этом случае 002FE7D0
xussr (07.08.2019 в 14:30):
CPU Disasm
Address   Hex dump          Command                                  Comments
002FE7CE      CC            INT3
002FE7CF      CC            INT3
002FE7D0  /$  6A FF         PUSH -1                                  ; SlideshowMaker.002FE7D0(guessed Arg1)
002FE7D2      68 30163800   PUSH 00381630                            ; Entry point
002FE7D7  |.  64:A1 0000000 MOV EAX,DWORD PTR FS:[0]
002FE7DD      50            PUSH EAX
002FE7DE      81EC 40010000 SUB ESP,140
002FE7E4  |.  A1 68B64D00   MOV EAX,DWORD PTR DS:[4DB668]
002FE7E9  |.  33C4          XOR EAX,ESP
002FE7EB  |.  898424 3C0100 MOV DWORD PTR SS:[LOCAL.3],EAX
002FE7F2  |.  56            PUSH ESI
002FE7F3  |.  57            PUSH EDI
002FE7F4  |.  A1 68B64D00   MOV EAX,DWORD PTR DS:[4DB668]
002FE7F9  |.  33C4          XOR EAX,ESP
002FE7FB  |.  50            PUSH EAX
002FE7FC  |.  8D8424 4C0100 LEA EAX,[LOCAL.2]
002FE803  |.  64:A3 0000000 MOV DWORD PTR FS:[0],EAX
002FE809  |.  8BB424 5C0100 MOV ESI,DWORD PTR SS:[ARG.1]
002FE810  |.  0F57C0        XORPS XMM0,XMM0
002FE813  |.  F30F7F4424 40 MOVDQU XMMWORD PTR SS:[LOCAL.69],XMM0
002FE819  |.  C74424 40 100 MOV DWORD PTR SS:[LOCAL.69],10
002FE821  |.  837E 14 08    CMP DWORD PTR DS:[ESI+14],8
002FE825  |.  72 04         JB SHORT 002FE82B
002FE827  |.  8B06          MOV EAX,DWORD PTR DS:[ESI]
002FE829  |.  EB 02         JMP SHORT 002FE82D
002FE82B  |>  8BC6          MOV EAX,ESI

дошел до этого куска и в стопоре...в начало пачe приложение крошится?

Я все в ольге, пардон ...
ManHunter (07.08.2019 в 14:28):
В IDA два экрана вверх крутанул и вот оно начало функции, его ни с чем не перепутать.
xussr (07.08.2019 в 14:25):
А начало процедуры можно частично показать

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

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.1 сек. / MySQL: 2 (0.0105 сек.) / Память: 4.5 Mb
Наверх