Blog. Just Blog

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

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

Icon Craft - неплохая программа для работы с иконками, библиотеками иконок и курсорами. С ее помощью вы сможете создать собственные иконки и курсоры, а также преобразовать готовые картинки в иконки. Лично я в силу привычки предпочитаю работать с иконками в AWicons Pro, но и этот редактор мне тоже понравился. Есть триальные ограничения по функционалу, но это мы сейчас быстренько поправим. Ну или не очень быстренько, как дело пойдет.

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

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Окна оставим на потом, а вот с сообщением стоит поработать. Строка сообщения легко обнаруживается в листинге дизассемблера. А код, в котором она используется, выглядит следующим образом:
  1. CODE:006D3189                 call    sub_409A4C
  2. CODE:006D318E                 cmp     [ebp+var_8], 0
  3. CODE:006D3192                 jnz     short loc_6D31A0
  4. ; Указатель на указатель на сообщение "Key is required"
  5. CODE:006D3194                 mov     eax, ds:off_7D4294
  6. CODE:006D3199                 mov     eax, [eax]
  7. CODE:006D319B                 call    sub_6D30C0
  8. CODE:006D31A0 loc_6D31A0:
  9. CODE:006D31A0                 cmp     [ebp+var_C], 0
  10. CODE:006D31A4                 jnz     short loc_6D31BC
  11. CODE:006D31A6                 mov     ecx, offset aPleaseEnterEma
  12. ; "Please enter email used in your order"
  13. CODE:006D31AB                 mov     dl, 1
  14. CODE:006D31AD                 mov     eax, off_408BC0
  15. CODE:006D31B2                 call    sub_40D2CC
  16. CODE:006D31B7                 call    sub_40393C
  17. CODE:006D31BC loc_6D31BC:
  18. CODE:006D31BC                 mov     eax, [ebp+var_8]
  19. CODE:006D31BF                 call    sub_40419C
  20. ; Длина серийника должна быть не менее 0Ah символов
  21. CODE:006D31C4                 cmp     eax, 0Ah
  22. CODE:006D31C7                 jge     short loc_6D31D5
  23. ; Указатель на указатель на сообщение "Key is required"
  24. CODE:006D31C9                 mov     eax, ds:off_7D4294
  25. CODE:006D31CE                 mov     eax, [eax]
  26. CODE:006D31D0                 call    sub_6D30C0
  27. CODE:006D31D5 loc_6D31D5:
  28. CODE:006D31D5                 lea     edx, [ebp+var_20]
  29. CODE:006D31D8                 mov     eax, [ebx+2F8h]
  30. CODE:006D31DE                 call    sub_438218
  31. CODE:006D31E3                 mov     eax, [ebp+var_20]
  32. ; Вызвать первую функцию проверки
  33. CODE:006D31E6                 call    sub_6D2A38
  34. CODE:006D31EB                 test    eax, eax
  35. ; EAX=0 - правильный серийник
  36. CODE:006D31ED                 jz      short loc_6D31F9
  37. CODE:006D31EF                 mov     eax, offset aWrongKey_
  38. ; "Wrong key."
  39. CODE:006D31F4                 call    sub_6D30C0
  40. CODE:006D31F9 loc_6D31F9:
  41. CODE:006D31F9                 mov     eax, [ebp+var_8]
  42. CODE:006D31FC                 call    sub_6D2A98
  43. CODE:006D3201                 mov     edx, [ebx+308h]
  44. CODE:006D3207                 mov     eax, [ebp+var_8]
  45. ; Вызвать вторую функцию проверки
  46. CODE:006D320A                 call    sub_6D28C4
  47. CODE:006D320F                 test    eax, eax
  48. ; EAX=0 - правильный серийник
  49. CODE:006D3211                 jz      short loc_6D321D
  50. CODE:006D3213                 mov     eax, offset aWrongKeyForThi
  51. ; "Wrong key for this application."
  52. CODE:006D3218                 call    sub_6D30C0
  53. CODE:006D321D loc_6D321D:
  54. CODE:006D321D                 mov     dl, 1
  55. CODE:006D321F                 mov     eax, off_484260
  56. CODE:006D3224                 call    sub_484360
  57. CODE:006D3229                 mov     [ebp+var_10], eax
Итак, что тут происходит. Сперва проверяется факт наличия и длина серийника, она должна быть не менее 10 символов. Дальше поочередно вызываются две функции проверки, если каждая из них вернула EAX=0, то серийник считается правильным. При этом в первой проверяется формат серийника, а во второй - принадлежность его именно этому приложению. Первая функция выглядит следующим образом:
  1. CODE:006D2A38 sub_6D2A38      proc near
  2. CODE:006D2A38 var_4           = dword ptr -4
  3. CODE:006D2A38                 push    ebp
  4. CODE:006D2A39                 mov     ebp, esp
  5. CODE:006D2A3B                 push    ecx
  6. CODE:006D2A3C                 push    ebx
  7. CODE:006D2A3D                 push    esi
  8. CODE:006D2A3E                 mov     [ebp+var_4], eax
  9. CODE:006D2A41                 mov     eax, [ebp+var_4]
  10. CODE:006D2A44                 call    sub_404350
  11. CODE:006D2A49                 xor     eax, eax
  12. CODE:006D2A4B                 push    ebp
  13. CODE:006D2A4C                 push    offset loc_6D2A88
  14. CODE:006D2A51                 push    dword ptr fs:[eax]
  15. CODE:006D2A54                 mov     fs:[eax], esp
  16. ; Инициализация счетчика
  17. CODE:006D2A57                 xor     esi, esi
  18. ; Крутануть цикл 10 раз
  19. CODE:006D2A59                 mov     ebx, 0Ah
  20. CODE:006D2A5E loc_6D2A5E:
  21. CODE:006D2A5E                 mov     eax, [ebp+var_4]
  22. ; Вызвать подфункцию проверки
  23. CODE:006D2A61                 call    sub_6D27D0
  24. ; Прибавить к счетчику результат проверки
  25. CODE:006D2A66                 add     esi, eax
  26. CODE:006D2A68                 push    64h             ; dwMilliseconds
  27. CODE:006D2A6A                 call    Sleep
  28. CODE:006D2A6F                 dec     ebx
  29. ; Следующая итерация цикла
  30. CODE:006D2A70                 jnz     short loc_6D2A5E
  31. CODE:006D2A72                 xor     eax, eax
  32. CODE:006D2A74                 pop     edx
  33. CODE:006D2A75                 pop     ecx
  34. CODE:006D2A76                 pop     ecx
  35. CODE:006D2A77                 mov     fs:[eax], edx
  36. CODE:006D2A7A                 push    offset loc_6D2A8F
  37. CODE:006D2A7F loc_6D2A7F:
  38. CODE:006D2A7F                 lea     eax, [ebp+var_4]
  39. CODE:006D2A82                 call    sub_403F0C
  40. CODE:006D2A87                 retn
  41. CODE:006D2A88 ; --------------------------------------
  42. CODE:006D2A88 loc_6D2A88:
  43. CODE:006D2A88                 jmp     loc_403904
  44. CODE:006D2A8D ; --------------------------------------
  45. CODE:006D2A8D                 jmp     short loc_6D2A7F
  46. CODE:006D2A8F ; --------------------------------------
  47. CODE:006D2A8F loc_6D2A8F:
  48. ; Записать в EAX итоговый результат
  49. CODE:006D2A8F                 mov     eax, esi
  50. CODE:006D2A91                 pop     esi
  51. CODE:006D2A92                 pop     ebx
  52. CODE:006D2A93                 pop     ecx
  53. CODE:006D2A94                 pop     ebp
  54. CODE:006D2A95                 retn
  55. CODE:006D2A95 sub_6D2A38      endp
Прокомментирую, что тут происходит. 10 раз подряд в цикле вызывается еще какая-то вложенная функция проверки. Между итерациями цикла выполняется задержка, тоже частый трюк шароварных программ, с понтом типа гоняют какие-то мега-вычисления для проверки серийника. Результаты вызова вложенной функции суммируются в регистре ESI, он же является итоговым результатом первой проверки. А, как мы посмотрели ранее, этот результат должен быть равен нулю. Значит и вложенная функции должны всегда возвращать ноль. Патчить эту функцию проверки бесполезно, они вызываются только один раз. Зато вложенная функция вызываются как минимум из трех разных мест. В начало вложенной функции по адресу 006D27D0 вбиваем пару команд XOR EAX,EAX и RET. Вторая функция проверки напоминает вложенную функцию из первой проверки. Аналогично патчим ее по адресу 006D28C4 или заменяем условный переход по адресу 006D3211 на безусловный. Cохраняем изменения и пробуем зарегистрировать левыми данными, но с серийником подходящей длины.

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

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

Загружаем программу в отладчик и ставим первую точку останова по адресу 006D27D0, это начало функции проверки корректности серийника. Отпускаем на выполнение? но перед этим обратим внимание на интересную строку "2345679qwertyupadfghjkzxcvbnms", ссылки на которую встречаются в обеих функциях проверок. Можно предположить, что эти символы должны присутствовать в серийном номере. Хорошо, придумаем какой-нибудь серийник, например, "12345679abcd" и пробуем зарегистрировать им программу.
  1. CODE:006D27D0 sub_6D27D0      proc near
  2. CODE:006D27D0 var_C           = dword ptr -0Ch
  3. CODE:006D27D0 var_8           = dword ptr -8
  4. CODE:006D27D0 var_4           = dword ptr -4
  5. CODE:006D27D0                 push    ebp
  6. CODE:006D27D1                 mov     ebp, esp
  7. CODE:006D27D3                 add     esp, 0FFFFFFF4h
  8. CODE:006D27D6                 push    ebx
  9. CODE:006D27D7                 push    esi
  10. CODE:006D27D8                 xor     edx, edx
  11. CODE:006D27DA                 mov     [ebp+var_C], edx
  12. CODE:006D27DD                 mov     [ebp+var_4], eax
  13. CODE:006D27E0                 mov     eax, [ebp+var_4]
  14. CODE:006D27E3                 call    sub_404350
  15. CODE:006D27E8                 xor     eax, eax
  16. CODE:006D27EA                 push    ebp
  17. CODE:006D27EB                 push    offset loc_6D288B
  18. CODE:006D27F0                 push    dword ptr fs:[eax]
  19. CODE:006D27F3                 mov     fs:[eax], esp
  20. CODE:006D27F6                 xor     eax, eax
  21. CODE:006D27F8                 mov     [ebp+var_8], eax
  22. CODE:006D27FB                 lea     edx, [ebp+var_C]
  23. CODE:006D27FE                 mov     eax, [ebp+var_4]
  24. CODE:006D2801                 call    sub_6D2708
  25. CODE:006D2806                 mov     edx, [ebp+var_C]
  26. CODE:006D2809                 lea     eax, [ebp+var_4]
  27. CODE:006D280C                 call    sub_403FA4
  28. CODE:006D2811                 mov     eax, [ebp+var_4]
  29. CODE:006D2814                 call    sub_40419C
  30. CODE:006D2819                 mov     esi, eax
  31. ; Проверка длины серийника, не менее 7 символов
  32. CODE:006D281B                 cmp     esi, 7
  33. CODE:006D281E                 jge     short loc_6D2829
  34. CODE:006D2820                 mov     [ebp+var_8], 0Bh
  35. CODE:006D2827                 jmp     short loc_6D286D
  36. CODE:006D2829 ; --------------------------------------
  37. CODE:006D2829 loc_6D2829:
  38. CODE:006D2829                 xor     ebx, ebx
  39. CODE:006D282B                 mov     eax, [ebp+var_4]
  40. CODE:006D282E                 call    sub_40419C
  41. CODE:006D2833                 dec     eax
  42. CODE:006D2834                 sub     eax, 2
  43. CODE:006D2837                 jl      short loc_6D284D
  44. CODE:006D2839                 inc     eax
  45. ; XOR символов серийника со второго до предпоследнего
  46. CODE:006D283A                 mov     edx, 2
  47. CODE:006D283F loc_6D283F:
  48. CODE:006D283F                 mov     ecx, [ebp+var_4]
  49. CODE:006D2842                 movzx   ecx, byte ptr [ecx+edx-1]
  50. CODE:006D2847                 xor     ebx, ecx
  51. CODE:006D2849                 inc     edx
  52. CODE:006D284A                 dec     eax
  53. CODE:006D284B                 jnz     short loc_6D283F
  54. CODE:006D284D loc_6D284D:
  55. CODE:006D284D                 mov     eax, ebx
  56. CODE:006D284F                 mov     ecx, 1Eh
  57. CODE:006D2854                 cdq
  58. CODE:006D2855                 idiv    ecx
  59. CODE:006D2857                 inc     edx
  60. CODE:006D2858                 mov     eax, offset a2345679qwert_0
  61. ; "2345679qwertyupadfghjkzxcvbnms"
  62. CODE:006D285D                 mov     al, [eax+edx-1]
  63. CODE:006D2861                 mov     edx, [ebp+var_4]
  64. ; Сравнение последнего символа серийника с контрольным из строки
  65. CODE:006D2864                 cmp     al, [edx+esi-1]
  66. CODE:006D2868                 jz      short loc_6D286D
  67. ; Символы не совпали, увеличиваем счетчик
  68. CODE:006D286A                 inc     [ebp+var_8]
  69. CODE:006D286D loc_6D286D:
  70. CODE:006D286D                 xor     eax, eax
  71. CODE:006D286F                 pop     edx
  72. CODE:006D2870                 pop     ecx
  73. CODE:006D2871                 pop     ecx
  74. CODE:006D2872                 mov     fs:[eax], edx
  75. CODE:006D2875                 push    offset loc_6D2892
  76. CODE:006D287A loc_6D287A:
  77. CODE:006D287A                 lea     eax, [ebp+var_C]
  78. CODE:006D287D                 call    sub_403F0C
  79. CODE:006D2882                 lea     eax, [ebp+var_4]
  80. CODE:006D2885                 call    sub_403F0C
  81. CODE:006D288A                 retn
  82. CODE:006D288B ; --------------------------------------
  83. CODE:006D288B loc_6D288B:
  84. CODE:006D288B                 jmp     loc_403904
  85. CODE:006D2890 ; --------------------------------------
  86. CODE:006D2890                 jmp     short loc_6D287A
  87. CODE:006D2892 ; --------------------------------------
  88. CODE:006D2892 loc_6D2892:
  89. CODE:006D2892                 mov     eax, [ebp+var_8]
  90. CODE:006D2895                 pop     esi
  91. CODE:006D2896                 pop     ebx
  92. CODE:006D2897                 mov     esp, ebp
  93. CODE:006D2899                 pop     ebp
  94. CODE:006D289A                 retn
  95. CODE:006D289A sub_6D27D0      endp
Под отладчиком видно, что сперва выполняется простенькое XOR'ирование символов серийного номера, начиная со второго и до предпоследнего. Результат делится на 1Eh, остаток является позицией контрольного символа в строке. Этот символ сравнивается с последним символом серийника. И эта проверка выполняется 10 раз подряд. Нафига? Итак, последний символ у нас есть, подставляем его в тестовый серийник, перезапускаем программу, повторяем регистрацию. Поздравляю, первая проверка успешно пройдена. Переходим ко второй.
  1. CODE:006D28C4 sub_6D28C4      proc near
  2. CODE:006D28C4 var_14          = dword ptr -14h
  3. CODE:006D28C4 var_10          = dword ptr -10h
  4. CODE:006D28C4 var_C           = dword ptr -0Ch
  5. CODE:006D28C4 var_8           = dword ptr -8
  6. CODE:006D28C4 var_4           = dword ptr -4
  7. CODE:006D28C4                 push    ebp
  8. CODE:006D28C5                 mov     ebp, esp
  9. CODE:006D28C7                 xor     ecx, ecx
  10. CODE:006D28C9                 push    ecx
  11. CODE:006D28CA                 push    ecx
  12. CODE:006D28CB                 push    ecx
  13. CODE:006D28CC                 push    ecx
  14. CODE:006D28CD                 push    ecx
  15. CODE:006D28CE                 push    ebx
  16. CODE:006D28CF                 push    esi
  17. CODE:006D28D0                 mov     [ebp+var_8], edx
  18. CODE:006D28D3                 mov     [ebp+var_4], eax
  19. CODE:006D28D6                 mov     eax, [ebp+var_4]
  20. CODE:006D28D9                 call    sub_404350
  21. CODE:006D28DE                 mov     eax, [ebp+var_8]
  22. CODE:006D28E1                 call    sub_404350
  23. CODE:006D28E6                 xor     eax, eax
  24. CODE:006D28E8                 push    ebp
  25. CODE:006D28E9                 push    offset loc_6D29FF
  26. CODE:006D28EE                 push    dword ptr fs:[eax]
  27. CODE:006D28F1                 mov     fs:[eax], esp
  28. CODE:006D28F4                 xor     esi, esi
  29. CODE:006D28F6                 lea     edx, [ebp+var_10]
  30. CODE:006D28F9                 mov     eax, [ebp+var_4]
  31. CODE:006D28FC                 call    sub_6D2708
  32. CODE:006D2901                 mov     edx, [ebp+var_10]
  33. CODE:006D2904                 lea     eax, [ebp+var_4]
  34. CODE:006D2907                 call    sub_403FA4
  35. CODE:006D290C                 mov     eax, [ebp+var_4]
  36. CODE:006D290F                 call    sub_40419C
  37. CODE:006D2914                 cmp     eax, 7
  38. CODE:006D2917                 jge     short loc_6D2923
  39. CODE:006D2919                 mov     esi, 0Bh
  40. CODE:006D291E                 jmp     loc_6D29E4
  41. CODE:006D2923 ; --------------------------------------
  42. CODE:006D2923 loc_6D2923:
  43. CODE:006D2923                 cmp     [ebp+var_8], 0
  44. CODE:006D2927                 jz      loc_6D29E4
  45. CODE:006D292D                 xor     ebx, ebx
  46. CODE:006D292F                 mov     eax, [ebp+var_8]
  47. CODE:006D2932                 call    sub_40419C
  48. CODE:006D2937                 dec     eax
  49. CODE:006D2938                 test    eax, eax
  50. CODE:006D293A                 jle     short loc_6D294F
  51. CODE:006D293C                 mov     edx, 1
  52. CODE:006D2941 loc_6D2941:
  53. CODE:006D2941                 mov     ecx, [ebp+var_8]
  54. CODE:006D2944                 movzx   ecx, byte ptr [ecx+edx-1]
  55. CODE:006D2949                 add     ebx, ecx
  56. CODE:006D294B                 inc     edx
  57. CODE:006D294C                 dec     eax
  58. CODE:006D294D                 jnz     short loc_6D2941
  59. CODE:006D294F loc_6D294F:
  60. CODE:006D294F                 mov     eax, ebx
  61. CODE:006D2951                 mov     ecx, 1Eh
  62. CODE:006D2956                 cdq
  63. CODE:006D2957                 idiv    ecx
  64. CODE:006D2959                 inc     edx
  65. CODE:006D295A                 mov     eax, offset a2345679qwert_1
  66. ; "2345679qwertyupadfghjkzxcvbnms"
  67. CODE:006D295F                 mov     al, [eax+edx-1]
  68. CODE:006D2963                 mov     edx, [ebp+var_4]
  69. ; Сравнить третий символ серийника с контрольным
  70. CODE:006D2966                 cmp     al, [edx+1]
  71. CODE:006D2969                 jz      short loc_6D296C
  72. CODE:006D296B                 inc     esi
  73. CODE:006D296C loc_6D296C:
  74. CODE:006D296C                 lea     edx, [ebp+var_C]
  75. CODE:006D296F                 mov     eax, [ebp+var_8]
  76. CODE:006D2972                 call    sub_409814
  77. CODE:006D2977                 lea     eax, [ebp+var_14]
  78. CODE:006D297A                 mov     edx, [ebp+var_C]
  79. CODE:006D297D                 mov     dl, [edx]
  80. CODE:006D297F                 call    sub_4040B4
  81. CODE:006D2984                 mov     eax, [ebp+var_14]
  82. CODE:006D2987                 mov     edx, offset a2345679qwert_1
  83. ; "2345679qwertyupadfghjkzxcvbnms"
  84. CODE:006D298C                 call    sub_404488
  85. CODE:006D2991                 test    eax, eax
  86. CODE:006D2993                 jle     short loc_6D29A6
  87. CODE:006D2995                 lea     eax, [ebp+var_4]
  88. CODE:006D2998                 call    sub_40436C
  89. CODE:006D299D                 mov     edx, [ebp+var_C]
  90. CODE:006D29A0                 mov     dl, [edx]
  91. CODE:006D29A2                 mov     [eax], dl
  92. CODE:006D29A4                 jmp     short loc_6D29E4
  93. CODE:006D29A6 ; --------------------------------------
  94. CODE:006D29A6 loc_6D29A6:
  95. CODE:006D29A6                 xor     ebx, ebx
  96. CODE:006D29A8                 mov     eax, [ebp+var_8]
  97. CODE:006D29AB                 call    sub_40419C
  98. CODE:006D29B0                 dec     eax
  99. CODE:006D29B1                 test    eax, eax
  100. CODE:006D29B3                 jle     short loc_6D29C8
  101. CODE:006D29B5                 mov     edx, 1
  102. CODE:006D29BA loc_6D29BA:
  103. CODE:006D29BA                 mov     ecx, [ebp+var_8]
  104. CODE:006D29BD                 movzx   ecx, byte ptr [ecx+edx-1]
  105. CODE:006D29C2                 xor     ebx, ecx
  106. CODE:006D29C4                 inc     edx
  107. CODE:006D29C5                 dec     eax
  108. CODE:006D29C6                 jnz     short loc_6D29BA
  109. CODE:006D29C8 loc_6D29C8:
  110. CODE:006D29C8                 mov     eax, ebx
  111. CODE:006D29CA                 mov     ecx, 1Eh
  112. CODE:006D29CF                 cdq
  113. CODE:006D29D0                 idiv    ecx
  114. CODE:006D29D2                 inc     edx
  115. CODE:006D29D3                 mov     eax, offset a2345679qwert_1
  116. ; "2345679qwertyupadfghjkzxcvbnms"
  117. CODE:006D29D8                 mov     al, [eax+edx-1]
  118. CODE:006D29DC                 mov     edx, [ebp+var_4]
  119. ; Сравнить второй символ серийника с контрольным
  120. CODE:006D29DF                 cmp     al, [edx]
  121. CODE:006D29E1                 jz      short loc_6D29E4
  122. CODE:006D29E3                 inc     esi
  123. CODE:006D29E4 loc_6D29E4:
  124. CODE:006D29E4                 xor     eax, eax
  125. CODE:006D29E6                 pop     edx
  126. CODE:006D29E7                 pop     ecx
  127. CODE:006D29E8                 pop     ecx
  128. CODE:006D29E9                 mov     fs:[eax], edx
  129. CODE:006D29EC                 push    offset loc_6D2A06
  130. CODE:006D29F1 loc_6D29F1:
  131. CODE:006D29F1                 lea     eax, [ebp+var_14]
  132. CODE:006D29F4                 mov     edx, 5
  133. CODE:006D29F9                 call    sub_403F30
  134. CODE:006D29FE                 retn
  135. CODE:006D29FF ; --------------------------------------
  136. CODE:006D29FF loc_6D29FF:
  137. CODE:006D29FF                 jmp     loc_403904
  138. CODE:006D2A04 ; --------------------------------------
  139. CODE:006D2A04                 jmp     short loc_6D29F1
  140. CODE:006D2A06 ; --------------------------------------
  141. CODE:006D2A06 loc_6D2A06:
  142. CODE:006D2A06                 mov     eax, esi
  143. CODE:006D2A08                 pop     esi
  144. CODE:006D2A09                 pop     ebx
  145. CODE:006D2A0A                 mov     esp, ebp
  146. CODE:006D2A0C                 pop     ebp
  147. CODE:006D2A0D                 retn
  148. CODE:006D2A0D sub_6D28C4      endp
Тут выполняются очень похожие действия, но по итогу все сводится к такому же вычислению позиции контрольного символа в строке и сравнении сперва с третьим символом введенного серийника. Затем такой же расчет и проверка выполняется для второго символа серийника. В нашем случае это будут символы "v" и "3". Серийник принимает вид "13v45679abcd". Так как некоторые символы изменились, первую проверку такой серийник не пройдет, нам надо заново определить последний контрольный символ. Возвращаем точку останова на предыдущий шаг, перезапускаем программу и повторяем регистрацию. Для нового серийника последний символ будет "f".

Таким образом правильный серийник будет иметь вид "13v45679abcf". Закрываем отладчик, запускаем программу в обычном режиме и повторяем регистрацию.

Сообщение о правильной регистрации
Сообщение о правильной регистрации

Реакция такая же, как и в случае с пропатченной программой, это хороший знак. Как минимум это означает, что обе проверки успешно пройдены. В последний раз перезапускаем редактор после регистрации.

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
Rustamer (06.06.2023 в 12:14):
Один из десятка клонов редактора ArtIcons от AhaSoft. Встречается под разными названиями с почти идентичным сайтом и неизменным функционалом. Сам редактор хороший, им и пользовался во времена PNG/ICO. Но сейчас балом правит SVG, а для него встречал только тяжеловесные полноценные инструменты. А хотелось бы просто редактор иконок с поддержкой SVG (пусть даже и неполной).

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

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

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