Blog. Just Blog

Исследование защиты программы Green Screen Wizard

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

Программа Green Screen Wizard предназначена для создания коллажей на базе фотографий, выполненных по технологии "хромакей". Суть этой технологии заключается в том, что на заднем фоне снимаемого объекта размещается однотонный экран зеленого цвета. При последующей обработке этот однотонный фон исключается и вместо него можно вставить в кадр любой другой фон. Такой способ гораздо удобнее, чем вырезать во всяких фотошопах по контуру нужные объекты. Конечно, это если считать стоимость программы 130 баксов приемлемой. Если вы так не считаете, то в продолжении статьи у меня для вас есть полезная информация.

Скачиваем дистрибутив демо-версии, устанавливаем, запускаем. Сразу же появляется окно с предупреждением, что программа не зарегистрирована, но предлагает опробовать ее в демо-режиме.

Окно регистрации
Окно регистрации

Как мы видим, программа умеет работать в трех режимах: Full Version, Professional Version и Pro Batch Version. Друг от друга они отличаются наличием всяких полезных функций, а в незарегистрированном варианте программы на готовую фотографию накладывается водяной знак "Demo". Итак, что нам надо сделать? Во-первых, избавиться от триального окна при запуске программы, а во-вторых сделать так, чтобы программа всегда работала в максимальном режиме "Pro Batch Version".

Начнем с триального окна. Файл ничем навесным не защищен и не упакован, поэтому в ресурсах легко отыскать нужное нам диалоговое окно:

Диалоговое окно в ресурсах
Диалоговое окно в ресурсах

Его индекс равен 195 в десятичной или 0C3h в шестнадцатеричной системе счисления. Поищем в дизассемблере что-нибудь, связанное с этим индексом. После нескольких ложных вхождений, найдется вот такой кусочек кода:
  1. .text:00518422                 mov     esi, [esp+18h+arg_0]
  2. .text:00518426                 push    0
  3. .text:00518428                 push    0C3h
  4. .text:0051842D                 mov     ecx, esi
  5. .text:0051842F                 call    ??0CDialog@@QAE@IPAVCWnd@@@Z
  6. ; CDialog::CDialog(uint,CWnd *)
  7. .text:00518434                 lea     edi, [esi+78h]
  8. .text:00518437                 mov     [esp+18h+var_4], 0
  9. .text:0051843F                 mov     ecx, edi
  10. .text:00518441                 mov     dword ptr [esi], offset off_5EB91C
Как видно из названий вызываемых функций, здесь выполняется загрузка диалогового окна из ресурсов и отображение его на экране. Если посмотреть код чуть выше и чуть ниже, то окажется, что это все оформлено в самостоятельную процедуру, которая, в свою очередь, вызывается из следующего кода:
  1. .text:00506D44                 mov     eax, [ebp+arg_3D30C]
  2. .text:00506D4A                 push    offset aGswd    ; "GSWD"
  3. .text:00506D4F                 push    eax             ; unsigned __int8 *
  4. ; Сравнить какую-то строку со строкой "GSWD"
  5. .text:00506D50                 call    __mbscmp
  6. .text:00506D55                 add     esp, 8
  7. .text:00506D58                 test    eax, eax
  8. .text:00506D5A                 setz    al
  9. .text:00506D5D                 test    al, al
  10. .text:00506D5F                 push    esi
  11. .text:00506D60                 jz      short loc_506D8C
  12. .text:00506D62                 call    sub_4ED8C0
  13. .text:00506D67                 lea     eax, [esp+6F0h+var_674]
  14. .text:00506D6B                 push    eax
  15. .text:00506D6C                 mov     [ebp+arg_288], 0
  16. .text:00506D76                 mov     [ebp+arg_28E], 1
  17. ; Открыть триальное окно
  18. .text:00506D7D                 call    sub_518400
  19. .text:00506D82                 mov     byte ptr [esp+6F0h+var_8], 11h
  20. .text:00506D8A                 jmp     short loc_506DA7
  21. .text:00506D8C ; -------------------------------------------------
  22. .text:00506D8C loc_506D8C:
  23. ; Вызывать какую-то функцию проверки
  24. .text:00506D8C                 call    sub_4EF3C0
  25. .text:00506D91                 test    al, al
  26. .text:00506D93                 jnz     short loc_506DC8
  27. .text:00506D95                 lea     ecx, [esp+6F0h+var_674]
  28. .text:00506D99                 push    ecx
  29. ; Открыть триальное окно
  30. .text:00506D9A                 call    sub_518400
  31. .text:00506D9F                 mov     byte ptr [esp+6F0h+var_8], 12h
Тут все просто. Патчим два условных перехода на безусловные по адресам 00506D60 и 00506D93. Сохраняем изменения, запускаем. Триальное окно исчезло и программа сразу же переходит в демо-режим, о чем нам радостно сообщает надпись в заголовке окна.

Программа работает в демо-режиме
Программа работает в демо-режиме

Вторая часть Марлезонского балета. Переведем программу в режим максимальных возможностей, то есть сделаем из "Demo Version" полноценную "Pro Batch Version". Как вы уже догадались, все начинается с поиска строки "Demo Version" и выяснения условий ее появления.
  1. ; Записать в регистр EAX переменную из [esi+20h]
  2. .text:004EF824                 mov     eax, [esi+20h]
  3. .text:004EF827                 test    eax, eax
  4. ; Если она не равна 0, то переход дальше, иначе программа работает в демо-режиме
  5. .text:004EF829                 jnz     short loc_4EF873
  6. .text:004EF82B                 push    0Bh             ; MaxCount
  7. .text:004EF82D                 push    offset aVersion7_4 ; "Version 7.4"
  8. .text:004EF832                 lea     ecx, [esi+3D0A8h]
  9. .text:004EF838                 call    sub_401720
  10. .text:004EF83D                 push    4               ; MaxCount
  11. .text:004EF83F                 push    offset aGswd_0  ; "GSWD"
  12. .text:004EF844                 lea     ecx, [esi+3D0B4h]
  13. .text:004EF84A                 call    sub_401720
  14. .text:004EF84F                 push    27h             ; MaxCount
  15. .text:004EF851                 push    offset aGreenScreen_10
  16. ; "     Green Screen Wizard - Demo Version"...
  17. .text:004EF856                 lea     ecx, [esi+3D0B0h]
  18. .text:004EF85C                 call    sub_401720
Здесь и ниже в дизассемблерном листинге очень красивый и понятный код. Берется переменная из [esi+20h], затем по очереди сравнивается со значениями 0, 1, 2 и 3, что соответствует разным режимам работы программы. Максимальные возможности программы открываются при значении 3. Поищем, где же ячейка памяти [esi+20h] инициализируется значением 3. Далеко ходить не пришлось, это буквально на несколько строчек выше:
  1. .text:004EF7F6                 push    offset aGswe    ; "GSWE"
  2. .text:004EF7FB                 push    edi             ; int
  3. .text:004EF7FC                 call    sub_401E10
  4. .text:004EF801                 add     esp, 8
  5. .text:004EF804                 test    al, al
  6. .text:004EF806                 jz      short loc_4EF819
  7. .text:004EF808                 mov     dword ptr [esi+20h], 3
  8. .text:004EF80F                 mov     byte ptr [esi+24h], 1
  9. .text:004EF813                 mov     byte ptr [esi+25h], 1
Сравнения с "GSWE" и подобными строчками - это и есть проверка типа лицензии. По всей видимости, это должна быть часть строки серийника или что-то в этом роде. Патчим условный переход по адресу 004EF806, забивая его командами NOP. Сохраняем изменения, запускаем. Упс... Все как было, так и осталось. Более того, если посмотреть под отладчиком, то до этого участка кода дело даже не доходит. Ничего страшного, листаем листинг вверх. В самом начале процедуры проверки обнаруживается такой код:
  1. .text:004EF689                 lea     eax, [esp+1Ch+var_C]
  2. .text:004EF68D                 mov     large fs:0, eax
  3. .text:004EF693                 push    esi
  4. ; Вызвать какую-то функцию проверки
  5. .text:004EF694                 call    sub_4EF3C0
  6. .text:004EF699                 test    al, al
  7. ; Условный переход сразу же на определение версии
  8. .text:004EF69B                 jz      loc_4EF824
  9. .text:004EF6A1                 lea     ecx, [esi+3B610h]
  10. .text:004EF6A7                 test    ecx, ecx
  11. .text:004EF6A9                 lea     edi, [esi+3D0A4h]
  12. .text:004EF6AF                 jnz     short loc_4EF6B5
  13. .text:004EF6B1                 xor     eax, eax
  14. .text:004EF6B3                 jmp     short loc_4EF6CB
Видимо какие-то дополнительные проверки на корректность серийного номера и вообще на его наличие. У нас нет даже некорректного серийника, поэтому инициализации не происходит и все проверки заканчиваются уже на этом этапе. NOP'им условный переход по адресу 004EF69B, чтобы всегда попадать на инициализацию. Ту, которую мы пропатчили чуть раньше. Сохраняем изменения, запускаем.

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

Надпись в заголовке программы изменилась на "Green Screen Wizard Professional", в меню инструментов появился и стал доступным раздел "Batch", а на фотографии пропали надписи "Demo". На этот раз хирургии оказалось больше, чем обычно, заменой пары байт дело не обошлось. Но главное, что основная цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
Chris (26.07.2014 в 14:05):
Здравствуйте, после выполнения последнего этапа исследования: "NOP'им условный переход по адресу 004EF69B..." программа Green Screen Wizard не запускается, появляется окно с предложением отладки программы. В чем может быть проблема?
Vitamin (26.08.2013 в 20:44):
Не стоит гадать на кофейной гуще. Патчить проще, но не интереснее кейгена.
Если повнимательней копнуть декомпилированный код, то можно заметить, что прога использует библиотеку Chilkat (http://www.chilkatsoft.com).
В качестве алгоритма используется процедура keyed-Hash Message Authentication Code (HMAC или KHMAC), точнее HMAC-MD5, а как аргументы - HardwareCode (генерится из ComputerName и VolumeSerial) и введённый серийник (типа 'GSWE-12345-67890').
Если собрались кейгенить и не желаете использовать либу Chilkat, подскажу альтернативу на C# - копайте в направлении 'HMACMD5'.
Кейген на C# лично у меня работает...
Voffka (26.08.2013 в 20:33):
простой это значит простой
http://ru.wikipedia.org/wiki/MD5
и ничего там брутить не надо.
Vopros (26.08.2013 в 18:06):
Voffka, что есть простой md5 ?
У мне пару прог до сих пор валяются, хэш можно сменить, а ключ брутить - жалко железо греть.
Ну и по поводу васика, да привиделось имя функи, а басика не кейгеню после одного случая, когда пришлось разгребать страницы 3 страшных goto.
Voffka (26.08.2013 в 12:19):
Ну как и думал, простой мд5.
irokkezz (25.08.2013 в 08:26):
Setup - Utilities - Activate Product
Voffka (24.08.2013 в 21:03):
Vopros
С чего такое умозаключение(я про бэсик)?
Даже из скрина exescope видно, что это не он, ибо в бэсике не бывает ресурсов окромя иконки.

ManHunter. Не знаешь как вызвать диалог офлайновой активации(в ресурсах есть), там вроде закейгенить не сложно.
Vopros (24.08.2013 в 19:21):
Тетка зачетная)
А прога на васике или показалось ?
Laki (23.08.2013 в 20:24):
Волшебство да и только)))Кто-нибудь может подсказать литературу,чтобы освоиться в этой теме? Её много,конечно,в сети,но что всё ж лучше.Что-то пока ничего не получается. Автору,респект и уважуха,действительно интересные методы!!!

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

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

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