Исследование защиты программы Icon Craft
Скриншот программы Icon Craft
Icon Craft - неплохая программа для работы с иконками, библиотеками иконок и курсорами. С ее помощью вы сможете создать собственные иконки и курсоры, а также преобразовать готовые картинки в иконки. Лично я в силу привычки предпочитаю работать с иконками в AWicons Pro, но и этот редактор мне тоже понравился. Есть триальные ограничения по функционалу, но это мы сейчас быстренько поправим. Ну или не очень быстренько, как дело пойдет.
Скачиваем с офсайта дистрибутив, устанавливаем, смотрим. Основной файл ничем не упакован, сразу скармливаем его дизассемблеру. Пока он работает, запускаем и смотрим на проявления триальности. Куча триальных окон, а на попытку зарегистрировать левыми данными программа реагирует следующим сообщением:
Сообщение о неправильной регистрации
Окна оставим на потом, а вот с сообщением стоит поработать. Строка сообщения легко обнаруживается в листинге дизассемблера. А код, в котором она используется, выглядит следующим образом:
Code (Assembler) : Убрать нумерацию
- CODE:006D3189 call sub_409A4C
- CODE:006D318E cmp [ebp+var_8], 0
- CODE:006D3192 jnz short loc_6D31A0
- ; Указатель на указатель на сообщение "Key is required"
- CODE:006D3194 mov eax, ds:off_7D4294
- CODE:006D3199 mov eax, [eax]
- CODE:006D319B call sub_6D30C0
- CODE:006D31A0 loc_6D31A0:
- CODE:006D31A0 cmp [ebp+var_C], 0
- CODE:006D31A4 jnz short loc_6D31BC
- CODE:006D31A6 mov ecx, offset aPleaseEnterEma
- ; "Please enter email used in your order"
- CODE:006D31AB mov dl, 1
- CODE:006D31AD mov eax, off_408BC0
- CODE:006D31B2 call sub_40D2CC
- CODE:006D31B7 call sub_40393C
- CODE:006D31BC loc_6D31BC:
- CODE:006D31BC mov eax, [ebp+var_8]
- CODE:006D31BF call sub_40419C
- ; Длина серийника должна быть не менее 0Ah символов
- CODE:006D31C4 cmp eax, 0Ah
- CODE:006D31C7 jge short loc_6D31D5
- ; Указатель на указатель на сообщение "Key is required"
- CODE:006D31C9 mov eax, ds:off_7D4294
- CODE:006D31CE mov eax, [eax]
- CODE:006D31D0 call sub_6D30C0
- CODE:006D31D5 loc_6D31D5:
- CODE:006D31D5 lea edx, [ebp+var_20]
- CODE:006D31D8 mov eax, [ebx+2F8h]
- CODE:006D31DE call sub_438218
- CODE:006D31E3 mov eax, [ebp+var_20]
- ; Вызвать первую функцию проверки
- CODE:006D31E6 call sub_6D2A38
- CODE:006D31EB test eax, eax
- ; EAX=0 - правильный серийник
- CODE:006D31ED jz short loc_6D31F9
- CODE:006D31EF mov eax, offset aWrongKey_
- ; "Wrong key."
- CODE:006D31F4 call sub_6D30C0
- CODE:006D31F9 loc_6D31F9:
- CODE:006D31F9 mov eax, [ebp+var_8]
- CODE:006D31FC call sub_6D2A98
- CODE:006D3201 mov edx, [ebx+308h]
- CODE:006D3207 mov eax, [ebp+var_8]
- ; Вызвать вторую функцию проверки
- CODE:006D320A call sub_6D28C4
- CODE:006D320F test eax, eax
- ; EAX=0 - правильный серийник
- CODE:006D3211 jz short loc_6D321D
- CODE:006D3213 mov eax, offset aWrongKeyForThi
- ; "Wrong key for this application."
- CODE:006D3218 call sub_6D30C0
- CODE:006D321D loc_6D321D:
- CODE:006D321D mov dl, 1
- CODE:006D321F mov eax, off_484260
- CODE:006D3224 call sub_484360
- CODE:006D3229 mov [ebp+var_10], eax
Code (Assembler) : Убрать нумерацию
- CODE:006D2A38 sub_6D2A38 proc near
- CODE:006D2A38 var_4 = dword ptr -4
- CODE:006D2A38 push ebp
- CODE:006D2A39 mov ebp, esp
- CODE:006D2A3B push ecx
- CODE:006D2A3C push ebx
- CODE:006D2A3D push esi
- CODE:006D2A3E mov [ebp+var_4], eax
- CODE:006D2A41 mov eax, [ebp+var_4]
- CODE:006D2A44 call sub_404350
- CODE:006D2A49 xor eax, eax
- CODE:006D2A4B push ebp
- CODE:006D2A4C push offset loc_6D2A88
- CODE:006D2A51 push dword ptr fs:[eax]
- CODE:006D2A54 mov fs:[eax], esp
- ; Инициализация счетчика
- CODE:006D2A57 xor esi, esi
- ; Крутануть цикл 10 раз
- CODE:006D2A59 mov ebx, 0Ah
- CODE:006D2A5E loc_6D2A5E:
- CODE:006D2A5E mov eax, [ebp+var_4]
- ; Вызвать подфункцию проверки
- CODE:006D2A61 call sub_6D27D0
- ; Прибавить к счетчику результат проверки
- CODE:006D2A66 add esi, eax
- CODE:006D2A68 push 64h ; dwMilliseconds
- CODE:006D2A6A call Sleep
- CODE:006D2A6F dec ebx
- ; Следующая итерация цикла
- CODE:006D2A70 jnz short loc_6D2A5E
- CODE:006D2A72 xor eax, eax
- CODE:006D2A74 pop edx
- CODE:006D2A75 pop ecx
- CODE:006D2A76 pop ecx
- CODE:006D2A77 mov fs:[eax], edx
- CODE:006D2A7A push offset loc_6D2A8F
- CODE:006D2A7F loc_6D2A7F:
- CODE:006D2A7F lea eax, [ebp+var_4]
- CODE:006D2A82 call sub_403F0C
- CODE:006D2A87 retn
- CODE:006D2A88 ; --------------------------------------
- CODE:006D2A88 loc_6D2A88:
- CODE:006D2A88 jmp loc_403904
- CODE:006D2A8D ; --------------------------------------
- CODE:006D2A8D jmp short loc_6D2A7F
- CODE:006D2A8F ; --------------------------------------
- CODE:006D2A8F loc_6D2A8F:
- ; Записать в EAX итоговый результат
- CODE:006D2A8F mov eax, esi
- CODE:006D2A91 pop esi
- CODE:006D2A92 pop ebx
- CODE:006D2A93 pop ecx
- CODE:006D2A94 pop ebp
- CODE:006D2A95 retn
- CODE:006D2A95 sub_6D2A38 endp
Программа успешно "зарегистрирована"
Программа принимает серийник и просит ее перезапустить. Проверка серийника при запуске - обычная практика для триальных программ. Не проблема, перезапускаем. Все триальные ограничения пропали, первая часть цели достигнута. Можно оставить так, а можно попробовать подобрать валидные регистрационные данные.
Загружаем программу в отладчик и ставим первую точку останова по адресу 006D27D0, это начало функции проверки корректности серийника. Отпускаем на выполнение? но перед этим обратим внимание на интересную строку "2345679qwertyupadfghjkzxcvbnms", ссылки на которую встречаются в обеих функциях проверок. Можно предположить, что эти символы должны присутствовать в серийном номере. Хорошо, придумаем какой-нибудь серийник, например, "12345679abcd" и пробуем зарегистрировать им программу.
Code (Assembler) : Убрать нумерацию
- CODE:006D27D0 sub_6D27D0 proc near
- CODE:006D27D0 var_C = dword ptr -0Ch
- CODE:006D27D0 var_8 = dword ptr -8
- CODE:006D27D0 var_4 = dword ptr -4
- CODE:006D27D0 push ebp
- CODE:006D27D1 mov ebp, esp
- CODE:006D27D3 add esp, 0FFFFFFF4h
- CODE:006D27D6 push ebx
- CODE:006D27D7 push esi
- CODE:006D27D8 xor edx, edx
- CODE:006D27DA mov [ebp+var_C], edx
- CODE:006D27DD mov [ebp+var_4], eax
- CODE:006D27E0 mov eax, [ebp+var_4]
- CODE:006D27E3 call sub_404350
- CODE:006D27E8 xor eax, eax
- CODE:006D27EA push ebp
- CODE:006D27EB push offset loc_6D288B
- CODE:006D27F0 push dword ptr fs:[eax]
- CODE:006D27F3 mov fs:[eax], esp
- CODE:006D27F6 xor eax, eax
- CODE:006D27F8 mov [ebp+var_8], eax
- CODE:006D27FB lea edx, [ebp+var_C]
- CODE:006D27FE mov eax, [ebp+var_4]
- CODE:006D2801 call sub_6D2708
- CODE:006D2806 mov edx, [ebp+var_C]
- CODE:006D2809 lea eax, [ebp+var_4]
- CODE:006D280C call sub_403FA4
- CODE:006D2811 mov eax, [ebp+var_4]
- CODE:006D2814 call sub_40419C
- CODE:006D2819 mov esi, eax
- ; Проверка длины серийника, не менее 7 символов
- CODE:006D281B cmp esi, 7
- CODE:006D281E jge short loc_6D2829
- CODE:006D2820 mov [ebp+var_8], 0Bh
- CODE:006D2827 jmp short loc_6D286D
- CODE:006D2829 ; --------------------------------------
- CODE:006D2829 loc_6D2829:
- CODE:006D2829 xor ebx, ebx
- CODE:006D282B mov eax, [ebp+var_4]
- CODE:006D282E call sub_40419C
- CODE:006D2833 dec eax
- CODE:006D2834 sub eax, 2
- CODE:006D2837 jl short loc_6D284D
- CODE:006D2839 inc eax
- ; XOR символов серийника со второго до предпоследнего
- CODE:006D283A mov edx, 2
- CODE:006D283F loc_6D283F:
- CODE:006D283F mov ecx, [ebp+var_4]
- CODE:006D2842 movzx ecx, byte ptr [ecx+edx-1]
- CODE:006D2847 xor ebx, ecx
- CODE:006D2849 inc edx
- CODE:006D284A dec eax
- CODE:006D284B jnz short loc_6D283F
- CODE:006D284D loc_6D284D:
- CODE:006D284D mov eax, ebx
- CODE:006D284F mov ecx, 1Eh
- CODE:006D2854 cdq
- CODE:006D2855 idiv ecx
- CODE:006D2857 inc edx
- CODE:006D2858 mov eax, offset a2345679qwert_0
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:006D285D mov al, [eax+edx-1]
- CODE:006D2861 mov edx, [ebp+var_4]
- ; Сравнение последнего символа серийника с контрольным из строки
- CODE:006D2864 cmp al, [edx+esi-1]
- CODE:006D2868 jz short loc_6D286D
- ; Символы не совпали, увеличиваем счетчик
- CODE:006D286A inc [ebp+var_8]
- CODE:006D286D loc_6D286D:
- CODE:006D286D xor eax, eax
- CODE:006D286F pop edx
- CODE:006D2870 pop ecx
- CODE:006D2871 pop ecx
- CODE:006D2872 mov fs:[eax], edx
- CODE:006D2875 push offset loc_6D2892
- CODE:006D287A loc_6D287A:
- CODE:006D287A lea eax, [ebp+var_C]
- CODE:006D287D call sub_403F0C
- CODE:006D2882 lea eax, [ebp+var_4]
- CODE:006D2885 call sub_403F0C
- CODE:006D288A retn
- CODE:006D288B ; --------------------------------------
- CODE:006D288B loc_6D288B:
- CODE:006D288B jmp loc_403904
- CODE:006D2890 ; --------------------------------------
- CODE:006D2890 jmp short loc_6D287A
- CODE:006D2892 ; --------------------------------------
- CODE:006D2892 loc_6D2892:
- CODE:006D2892 mov eax, [ebp+var_8]
- CODE:006D2895 pop esi
- CODE:006D2896 pop ebx
- CODE:006D2897 mov esp, ebp
- CODE:006D2899 pop ebp
- CODE:006D289A retn
- CODE:006D289A sub_6D27D0 endp
Code (Assembler) : Убрать нумерацию
- CODE:006D28C4 sub_6D28C4 proc near
- CODE:006D28C4 var_14 = dword ptr -14h
- CODE:006D28C4 var_10 = dword ptr -10h
- CODE:006D28C4 var_C = dword ptr -0Ch
- CODE:006D28C4 var_8 = dword ptr -8
- CODE:006D28C4 var_4 = dword ptr -4
- CODE:006D28C4 push ebp
- CODE:006D28C5 mov ebp, esp
- CODE:006D28C7 xor ecx, ecx
- CODE:006D28C9 push ecx
- CODE:006D28CA push ecx
- CODE:006D28CB push ecx
- CODE:006D28CC push ecx
- CODE:006D28CD push ecx
- CODE:006D28CE push ebx
- CODE:006D28CF push esi
- CODE:006D28D0 mov [ebp+var_8], edx
- CODE:006D28D3 mov [ebp+var_4], eax
- CODE:006D28D6 mov eax, [ebp+var_4]
- CODE:006D28D9 call sub_404350
- CODE:006D28DE mov eax, [ebp+var_8]
- CODE:006D28E1 call sub_404350
- CODE:006D28E6 xor eax, eax
- CODE:006D28E8 push ebp
- CODE:006D28E9 push offset loc_6D29FF
- CODE:006D28EE push dword ptr fs:[eax]
- CODE:006D28F1 mov fs:[eax], esp
- CODE:006D28F4 xor esi, esi
- CODE:006D28F6 lea edx, [ebp+var_10]
- CODE:006D28F9 mov eax, [ebp+var_4]
- CODE:006D28FC call sub_6D2708
- CODE:006D2901 mov edx, [ebp+var_10]
- CODE:006D2904 lea eax, [ebp+var_4]
- CODE:006D2907 call sub_403FA4
- CODE:006D290C mov eax, [ebp+var_4]
- CODE:006D290F call sub_40419C
- CODE:006D2914 cmp eax, 7
- CODE:006D2917 jge short loc_6D2923
- CODE:006D2919 mov esi, 0Bh
- CODE:006D291E jmp loc_6D29E4
- CODE:006D2923 ; --------------------------------------
- CODE:006D2923 loc_6D2923:
- CODE:006D2923 cmp [ebp+var_8], 0
- CODE:006D2927 jz loc_6D29E4
- CODE:006D292D xor ebx, ebx
- CODE:006D292F mov eax, [ebp+var_8]
- CODE:006D2932 call sub_40419C
- CODE:006D2937 dec eax
- CODE:006D2938 test eax, eax
- CODE:006D293A jle short loc_6D294F
- CODE:006D293C mov edx, 1
- CODE:006D2941 loc_6D2941:
- CODE:006D2941 mov ecx, [ebp+var_8]
- CODE:006D2944 movzx ecx, byte ptr [ecx+edx-1]
- CODE:006D2949 add ebx, ecx
- CODE:006D294B inc edx
- CODE:006D294C dec eax
- CODE:006D294D jnz short loc_6D2941
- CODE:006D294F loc_6D294F:
- CODE:006D294F mov eax, ebx
- CODE:006D2951 mov ecx, 1Eh
- CODE:006D2956 cdq
- CODE:006D2957 idiv ecx
- CODE:006D2959 inc edx
- CODE:006D295A mov eax, offset a2345679qwert_1
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:006D295F mov al, [eax+edx-1]
- CODE:006D2963 mov edx, [ebp+var_4]
- ; Сравнить третий символ серийника с контрольным
- CODE:006D2966 cmp al, [edx+1]
- CODE:006D2969 jz short loc_6D296C
- CODE:006D296B inc esi
- CODE:006D296C loc_6D296C:
- CODE:006D296C lea edx, [ebp+var_C]
- CODE:006D296F mov eax, [ebp+var_8]
- CODE:006D2972 call sub_409814
- CODE:006D2977 lea eax, [ebp+var_14]
- CODE:006D297A mov edx, [ebp+var_C]
- CODE:006D297D mov dl, [edx]
- CODE:006D297F call sub_4040B4
- CODE:006D2984 mov eax, [ebp+var_14]
- CODE:006D2987 mov edx, offset a2345679qwert_1
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:006D298C call sub_404488
- CODE:006D2991 test eax, eax
- CODE:006D2993 jle short loc_6D29A6
- CODE:006D2995 lea eax, [ebp+var_4]
- CODE:006D2998 call sub_40436C
- CODE:006D299D mov edx, [ebp+var_C]
- CODE:006D29A0 mov dl, [edx]
- CODE:006D29A2 mov [eax], dl
- CODE:006D29A4 jmp short loc_6D29E4
- CODE:006D29A6 ; --------------------------------------
- CODE:006D29A6 loc_6D29A6:
- CODE:006D29A6 xor ebx, ebx
- CODE:006D29A8 mov eax, [ebp+var_8]
- CODE:006D29AB call sub_40419C
- CODE:006D29B0 dec eax
- CODE:006D29B1 test eax, eax
- CODE:006D29B3 jle short loc_6D29C8
- CODE:006D29B5 mov edx, 1
- CODE:006D29BA loc_6D29BA:
- CODE:006D29BA mov ecx, [ebp+var_8]
- CODE:006D29BD movzx ecx, byte ptr [ecx+edx-1]
- CODE:006D29C2 xor ebx, ecx
- CODE:006D29C4 inc edx
- CODE:006D29C5 dec eax
- CODE:006D29C6 jnz short loc_6D29BA
- CODE:006D29C8 loc_6D29C8:
- CODE:006D29C8 mov eax, ebx
- CODE:006D29CA mov ecx, 1Eh
- CODE:006D29CF cdq
- CODE:006D29D0 idiv ecx
- CODE:006D29D2 inc edx
- CODE:006D29D3 mov eax, offset a2345679qwert_1
- ; "2345679qwertyupadfghjkzxcvbnms"
- CODE:006D29D8 mov al, [eax+edx-1]
- CODE:006D29DC mov edx, [ebp+var_4]
- ; Сравнить второй символ серийника с контрольным
- CODE:006D29DF cmp al, [edx]
- CODE:006D29E1 jz short loc_6D29E4
- CODE:006D29E3 inc esi
- CODE:006D29E4 loc_6D29E4:
- CODE:006D29E4 xor eax, eax
- CODE:006D29E6 pop edx
- CODE:006D29E7 pop ecx
- CODE:006D29E8 pop ecx
- CODE:006D29E9 mov fs:[eax], edx
- CODE:006D29EC push offset loc_6D2A06
- CODE:006D29F1 loc_6D29F1:
- CODE:006D29F1 lea eax, [ebp+var_14]
- CODE:006D29F4 mov edx, 5
- CODE:006D29F9 call sub_403F30
- CODE:006D29FE retn
- CODE:006D29FF ; --------------------------------------
- CODE:006D29FF loc_6D29FF:
- CODE:006D29FF jmp loc_403904
- CODE:006D2A04 ; --------------------------------------
- CODE:006D2A04 jmp short loc_6D29F1
- CODE:006D2A06 ; --------------------------------------
- CODE:006D2A06 loc_6D2A06:
- CODE:006D2A06 mov eax, esi
- CODE:006D2A08 pop esi
- CODE:006D2A09 pop ebx
- CODE:006D2A0A mov esp, ebp
- CODE:006D2A0C pop ebp
- CODE:006D2A0D retn
- CODE:006D2A0D sub_6D28C4 endp
Таким образом правильный серийник будет иметь вид "13v45679abcf". Закрываем отладчик, запускаем программу в обычном режиме и повторяем регистрацию.
Сообщение о правильной регистрации
Реакция такая же, как и в случае с пропатченной программой, это хороший знак. Как минимум это означает, что обе проверки успешно пройдены. В последний раз перезапускаем редактор после регистрации.
Программа успешно зарегистрирована
Триальных окон при запуске нет, в окне "О программе" отображается регистрационное имя, при выходе из программы триальное окно тоже не появляется. Проверяем функционал на предмет ограничений, тут тоже все хорошо. Цель достигнута. Могу предположить, что подобным образом обходится защита и других программ этого разработчика.
Просмотров: 807 | Комментариев: 1
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Rustamer
(06.06.2023 в 12:14):
Один из десятка клонов редактора ArtIcons от AhaSoft. Встречается под разными названиями с почти идентичным сайтом и неизменным функционалом. Сам редактор хороший, им и пользовался во времена PNG/ICO. Но сейчас балом правит SVG, а для него встречал только тяжеловесные полноценные инструменты. А хотелось бы просто редактор иконок с поддержкой SVG (пусть даже и неполной).
Добавить комментарий
Заполните форму для добавления комментария