Blog. Just Blog

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

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

AbstractCurves - интересный генератор абстрактных изображений, позволяющий создавать потрясающие обои или фоновые рисунки, а также добавлять к фотографиям различные эффекты. Интерфейс у программы такой, что невольно задумываешься о поллитровке, но это не главный ее недостаток. Без регистрации постоянно будет появляться напоминание о необходимости выложить деньги, а до этого момента вы не сможете сохранить результаты ваших трудов. Только вот двадцатка зелени в хозяйстве совсем не лишняя, лучше потратить ее на что-нибудь другое.

Забираем с сайта дистрибутив, устанавливаем, смотрим. Главный исполняемый файл всего один, он упакован при помощи бесплатного пакера UPX. Никаких сюрпризов тут нет, UPX снимается при помощи самого же себя с ключом upx -d. После этого распакованный файл отправляется прямиком в дизассемблер. Пока он приводит двоичный код в удобочитаемый Ассемблер, запустим саму программу и посмотрим, как у нее проявляются внешние признаки незарегистрированности. Всплывающее окно и ввод серийного номера пока трогать не будем, а вот надпись "(Demo)" в заголовке окна очень интересна. Поищем эту строчку в файле:

Строка найдена
Строка найдена

Теперь вернемся к дизассемблированному листингу и посмотрим, где эта строка используется.
  1. .text:008CA632                 call    sub_480ED0
  2. ; Получить адрес настроек (?)
  3. .text:008CA637                 mov     eax, [eax+104h]
  4. .text:008CA63D                 cmp     eax, ebx
  5. .text:008CA63F                 jz      short loc_8CA68C
  6. ; Получить адрес указателя на указатель
  7. .text:008CA641                 mov     edx, [eax+0CCh]
  8. ; Второй указатель пустой?
  9. .text:008CA647                 cmp     [edx], ebx
  10. ; Нет, надпись "Demo" не добавляем
  11. .text:008CA649                 jnz     short loc_8CA68C
  12. ; Добавить в заголовок надпись "Demo"
  13. .text:008CA64B                 push    ebx
  14. .text:008CA64C                 lea     eax, [esp+2Ch+var_18]
  15. .text:008CA650                 push    offset aDemo    ; " (Demo)"
  16. .text:008CA655                 push    eax
  17. .text:008CA656                 call    sub_8C9F40
  18. .text:008CA65B                 add     esp, 0Ch
Берется участок памяти, где хранятся некие настройки (ну или не настройки, а, например, флаги состояния, или что-то подобное). Если адрес этого участка не определен, то сразу выполняется переход, чтобы не получить ошибку доступа к несуществующей ячейке памяти. Если блок памяти найден, то в нем берется указатель, который хранится по смещению 0CCh от начала блока. Если по этому указателю записано ненулевое значение, то строчка "Demo" в заголовок не добавляется. Логично предположить, что по этому второму указателю находится какой-то набор данных, отвечающий за регистрацию.

Теперь стоит запустить программу под отладчиком, установить точку останова по адресу 008CA632 и в режиме пошаговой трассировки посмотреть, что там творится. Действительно, в незарегистрированном состоянии второй указатель указывает на нулевое значение. Для подобных случаев я использую следующий метод патча: заворачиваю значение, на которое ссылается указатель, на сам указатель. Формирование главного окна программы в большинстве случаев выполняется раньше всех триальных окон и прочей шароварщины, но позже, чем из реестра или файлов прочитаны регистрационные данные. На этом этапе есть неплохой шанс внушить программе, что все проверки пройдены правильно и дальше надо работать в полную силу.

Патч указателя
Патч указателя

Команда CMP [EDX],EBX заменяется на равную ей по размеру MOV [EDX],EDX, а следующий за ней условный переход меняется на безусловный. Сохраняем изменения, проверяем.

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

Упоминание Demo в заголовке и прочие внешние проявления незарегистрированной версии исчезли, окно с напоминанием не появляется, пресеты открыты, готовый рисунок можно сохранять. Цель достигнута.

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

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

Комментарии

Отзывы посетителей сайта о статье
user (16.12.2017 в 21:27):
На 49FF86 есть еще переход - надпись Demo на первоначальном экране ("Новый файл, Открыть...)
ManHunter (16.12.2017 в 12:15):
Это уже что-то локально погнулось. Если адреса загрузки действительно не меняются, то все остается в UDD. Для проверки Alt+B в отладчике.
usr (16.12.2017 в 10:57):
А если отладчик не помнит свои бряки - это зависит от исследуемой проги? Вроде адреса не меняются при запусках, UDD есть...
Exit (14.12.2017 в 16:31):
Дьявол кроется в деталях )
PageUp'ом листал, к нужному адресу ))
Спасибо за разбор интересной программы!
ManHunter (14.12.2017 в 16:23):
F5 и .008CA647
Точка означает, что надо переходить по VA, а без точки переход по абсолютному файловому смещению.
Exit (14.12.2017 в 16:21):
Даааа, пол литра - это мягко сказано )))
Судя по справке, автор много сил вложил в софтину.
Очень интересный подход к генерации графики.
ManHunter, а как в Hiew переходить к нужному адресу?
Жму F5 (Goto), вбиваю 008CA647 а переход происходит не туда...
Пардон, за нубский вопрос ))
ManHunter (14.12.2017 в 15:46):
Это инсталлятор, зачем его распаковывать??? o_O
nordpoint (14.12.2017 в 15:35):
upx: ********\Desktop\upx394w\AbstractCurves_Setup.exe: NotPackedExcep
tion: not packed by UPX
7zip распаковал!

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

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

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