Blog. Just Blog

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

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

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

Забираем с офсайта дистрибутив последней версии, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, сразу отправляем его на разбор в дизассемблер. Запускаем программу, смотрим на внешние проявления триальности. При старте сразу появляется предупреждение, что после 30 дней карета превратится в тыкву, а вотпрямщаз было бы неплохо метнутся в кассу и оплатить требуемую сумму. Но 70 евро точно не лишние, перебьются. Соглашаемся на пробный период без активации, открываем окно "О программе".

Окно "О программе"
Окно "О программе"

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

Строка в ресурсах
Строка в ресурсах

Строка быстро обнаруживается в ресурсах, ее числовой индекс получается 906 или 38Ah, если в шестнадцатеричной системе. Теперь поищем в листинге место, где такой индекс используется.
  1. .text:0041285D                 call    sub_8387A0
  2. .text:00412862                 add     esp, 0Ch
  3. .text:00412865                 lea     ecx, [esp+89Ch+var_890]
  4. .text:00412869                 call    sub_44FB30
  5. .text:0041286E                 mov     [esp+89Ch+var_4], 0
  6. ; Проверить значение переменной в памяти
  7. .text:00412879                 cmp     dword_A7E63C, 0
  8. ; Если оно нулевое, то вывести строку триального статуса
  9. .text:00412880                 jz      loc_412970
  10. .text:00412886                 push    0
  11. .text:00412888                 push    offset Default
  12. .text:0041288D                 lea     ecx, [esp+8A4h+var_488]
  13. .text:00412894                 call    loc_41A020
  14. .text:00412899                 mov     eax, dword_A842F8
  15. .text:0041289E                 lea     ecx, [esp+89Ch+var_488]
  16. ...
  17. ...
  18. ...
  19. .text:00412970 loc_412970:
  20. ; Загрузить из ресурсов строку с индексом 38Ah
  21. .text:00412970                 push    38Ah
  22. .text:00412975                 call    sub_705F6E
  23. .text:0041297A                 test    eax, eax
  24. .text:0041297C                 jz      short loc_412990
  25. .text:0041297E                 push    38Ah
  26. .text:00412983                 push    eax
  27. .text:00412984                 lea     ecx, [esp+8A4h+var_488]
  28. .text:0041298B                 call    loc_419E80
Часть промежуточного кода я убрал, чтобы не загромождать текст. Проверяется значения переменной, если оно нулевое, то выполняется условный переход и из ресурсов загружается строка о триальном статусе программы. Логично предположить, что в ячейке памяти dword_A7E63C находится статус зарегистрированности программы и для правильной работы он не должен быть равен нулю. По перекрестным ссылкам поищем место, где эта переменная инициализируется каким-нибудь ненулевым значением. Таких мест несколько, но меня заинтересовал следующий кусочек кода:
  1. .text:0040C36A                 mov     ecx, edi
  2. .text:0040C36C                 push    0
  3. .text:0040C36E                 push    offset aDontremindregi
  4. ; "DontRemindRegistration"
  5. .text:0040C373                 push    offset aRegistration
  6. ; "registration"
  7. .text:0040C378                 call    dword ptr [eax+7Ch]
  8. .text:0040C37B                 mov     dword_A7E630, eax
  9. .text:0040C380                 mov     edx, offset aSoftwareClasse
  10. ; "Software\\Classes\\IcoFile\\DefaultIcon"
  11. .text:0040C385                 xor     eax, eax
  12. .text:0040C387                 mov     ecx, 80000001h  ; hKey
  13. .text:0040C38C                 mov     word ptr [ebp+Data], ax
  14. .text:0040C393                 lea     eax, [ebp+Data]
  15. .text:0040C399                 push    eax             ; lpData
  16. .text:0040C39A                 push    offset aPictureindex ; "PictureIndex"
  17. .text:0040C39F                 call    sub_439FE0
  18. .text:0040C3A4                 mov     ax, word ptr [ebp+Data]
  19. .text:0040C3AB                 add     esp, 8
  20. .text:0040C3AE                 cmp     ax, 32h
  21. .text:0040C3B2                 jnz     short loc_40C3BB
  22. .text:0040C3B4                 mov     esi, 2
  23. .text:0040C3B9                 jmp     short loc_40C3FF
  24. .text:0040C3BB ; ---------------------------------------
  25. .text:0040C3BB loc_40C3BB:
  26. .text:0040C3BB                 cmp     ax, 33h
  27. .text:0040C3BF                 jnz     short loc_40C3DC
  28. .text:0040C3C1                 mov     esi, 3
  29. .text:0040C3C6                 mov     dword_A7E63C, 1
  30. .text:0040C3D0                 mov     dword_A7E638, 0
  31. .text:0040C3DA                 jmp     short loc_40C3FF
  32. .text:0040C3DC ; ---------------------------------------
  33. .text:0040C3DC loc_40C3DC:
  34. .text:0040C3DC                 cmp     ax, 34h
  35. .text:0040C3E0                 jnz     short loc_40C3FD
  36. .text:0040C3E2                 mov     esi, 4
  37. .text:0040C3E7                 mov     dword_A7E63C, 1
  38. .text:0040C3F1                 mov     dword_A7E638, 1
  39. .text:0040C3FB                 jmp     short loc_40C3FF
  40. .text:0040C3FD ; ---------------------------------------
  41. .text:0040C3FD loc_40C3FD:
  42. .text:0040C3FD                 xor     esi, esi
  43. .text:0040C3FF loc_40C3FF:
  44. .text:0040C3FF                 mov     eax, dword_A7E380
  45. .text:0040C404                 xor     bl, bl
  46. .text:0040C406                 test    eax, eax
Тут происходит получение данных из реестра, затем на основании этих данных выполняется одна из веток алгоритма, причем флагов два и инициализируются они в каждой ветке по-разному. Предположу, что это что-то типа "совсем не зарегистрировано", "зарегистрировано, но не проверено через интернет и не активировано" и нужный нам статус "зарегистрировано и активировано". Для выполнения условий надо заменить условный переход по адресу 0040C3B2 на безусловный, то же самое сделать с переходом по адресу 0040C3BF, а условный переход по адресу 0040C3E0 забить NOP'ами. Теперь при любом раскладе флаг статуса будет взводиться, обеспечивая полноценную работу программы. Сохраняем изменения, запускаем.

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

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

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 370 | Комментариев: 6

Комментарии

Отзывы посетителей сайта о статье
ManHunter (21.10.2020 в 16:50):
А там файл справки на 8 мегов и куча иконок. Для работы достаточно одного файла IconWorkshop.exe.
user (21.10.2020 в 16:46):
Что-то слишком много получается - инсталляшка 38 мегабайт
ManHunter (20.10.2020 в 19:22):
Можно и так. Чаще всего вариантов бывает больше одного, поэтому кому как нравится.
А под XP оно действительно не работает, на офсайте:
Platform: Windows Vista / 7 / 8 / 10 - x32 & x64 versions
X-Wing Top Ace (20.10.2020 в 17:10):
А если так?

.40C3AE
  xor eax, eax
  inc eax
  mov d,[0A7E63C], eax
  mov d,[0A7E638], eax
  mov esi, 4
  jmps .40C3FF

Или так:
.40C399
  xor eax, eax
  mov al, 34h
  ; Добавить NOP'ы до адреса 40С3AB

Ассемблер HIEW'ный, посмотрел уже в нем на экзюк.

Под XPенью прога не хотит запускаться, но по логике должно работать (хотя, возможно, jmps нужен на 40С3FD, проверить не могу - не запускается же, понижение полей версии ОС и подсистемы до 5 не сработало). И материться в коде не придется. А поскольку дальше по адресу 40C3FF EAX инитится другим значением, пушить его и восстанавливать тоже не нужно.
ManHunter (18.10.2020 в 12:14):
Это до первого выхода в интернет и проверки регистрации на сервере, потом все слетает нафиг. А так получается один портативный файл, который можно таскать на флешке.
Vnv (18.10.2020 в 08:41):
Достаточно внести в реестр это:

[HKEY_CURRENT_USER\SOFTWARE\Classes\IcoFile\DefaultIcon]
"PictureIndex"=dword:00000034

И не просит денежку!!!

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

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

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