Blog. Just Blog

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

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

Программа WinPatrol - монитор безопасности системы, показывающий связи файлов, сервисы, программы из автозапуска, скрытые файлы, указанные ключи реестра и некоторую другую информацию, которая якобы способствует лучшей защите вашего компьютера. Особого доверия я к этой программе не испытываю, так как предпочитаю пользоваться только проверенным инструментарием, поэтому интерес у меня к ней исключительно исследовательский.

Скачиваем дистрибутив, устанавливаем. Исполняемых файлов в папке с программой два, нас интересует только WinPatrolEx.exe, так как второй файл WinPatrol.exe, похоже, является сервисом мониторинга и для настроек вызывает именно WinPatrolEx.exe. Исполняемый файл ничем не упакован, отправим его в дизассемблер и, пока тот работает, посмотрим на поведение при неправильной регистрации и все такое. Часть функций доступна только в так называемой PLUS-версии, то есть после регистрации, а так WinPatrol прекрасно работает в бесплатном FREE-режиме. На ввод левого серийника программа реагирует следующим сообщением:

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

Юникодная строка сообщения находится в ресурсах файла WinPatrolEx.exe, пока никаких трудностей с исследованием у нас не возникает.

Нехорошая строка найдена
Нехорошая строка найдена

Строка в ресурсах имеет индекс 620, или 26Ch в шестнадцатеричной системе счисления. Поищем и дизассемблере то место, где используется этот индекс. Вот оно:
  1. ...
  2. .text:0041EC77                 push    offset byte_44D5C0 ; lpString
  3. .text:0041EC7C                 mov     byte_44D5C0[ecx], 0
  4. ; Вызвать функцию проверки регистрации
  5. .text:0041EC83                 call    sub_4086FE
  6. .text:0041EC88                 pop     ecx
  7. ; Если она вернула EAX=0, то регистрация неправильная
  8. .text:0041EC89                 test    eax, eax
  9. .text:0041EC8B                 jnz     short loc_41ECCC
  10. .text:0041EC8D                 lea     eax, [esp+668h+File]
  11. .text:0041EC94                 push    eax
  12. .text:0041EC95                 push    26Ch            ; int
  13. ; Загрузить строку сообщения из ресурсов
  14. .text:0041EC9A                 mov     ecx, 200h       ; cchBufferMax
  15. .text:0041EC9F                 call    sub_4089D7
  16. .text:0041ECA4                 movzx   eax, word_45619C
  17. .text:0041ECAB                 pop     ecx
  18. .text:0041ECAC                 pop     ecx
  19. .text:0041ECAD                 push    eax             ; wLanguageId
  20. .text:0041ECAE                 push    40040h          ; uType
  21. .text:0041ECB3                 push    offset Caption  ; lpCaption
  22. .text:0041ECB8                 lea     eax, [esp+674h+File]
  23. .text:0041ECBF                 push    eax             ; lpText
  24. .text:0041ECC0                 push    esi             ; hWnd
  25. ; Вывести сообщение на экран
  26. .text:0041ECC1                 call    ds:MessageBoxExA
  27. ...
Первый вариант решения - пропатчить функцию проверки, чтобы она всегда возвращала правильный результат. Пара команд MOV EAX,1 и RET по адресу 004086FE гарантированно решают проблему с регистрацией. Теперь программа работает в PLUS-режиме даже без ввода серийного номера. Но это слишком просто и неспортивно, поэтому лучше разберем алгоритм проверки серийного номера. Для этого в отладчике поставим точку останова по адресу 004086FE на начало функции проверки регистрации, а затем пройдем ее в пошаговом режиме.

Первая часть проверки. Длина серийного номера должна быть ровно 7 символов. Второй символ равен '@'+длина регистрационного имени.
  1. .text:00408710                 xor     edi, edi
  2. ; Первая проверка - считается длина введенного регистрационного имени
  3. .text:00408712                 call    esi ; lstrlenA
  4. .text:00408714                 mov     ecx, [ebp+lpString]
  5. ; К длины значению прибавляется 40h ('@')
  6. .text:00408717                 add     al, 40h
  7. ; Второй символ серийного номера должен быть '@'+(длина имени)
  8. .text:00408719                 cmp     [ecx+1], al
  9. .text:0040871C                 jnz     loc_408807
  10. .text:00408722                 push    ecx             ; lpString
  11. .text:00408723                 inc     edi
  12. ; Вторая проверка - длина серийного номера должна быть ровно 7 символов
  13. .text:00408724                 call    esi ; lstrlenA
  14. .text:00408726                 cmp     eax, 7
  15. .text:00408729                 jle     short loc_408730
  16. .text:0040872B                 xor     edi, edi
  17. .text:0040872D                 cmp     eax, 7
  18. .text:00408730 loc_408730:
  19. .text:00408730                 jge     short loc_408734
  20. .text:00408732                 xor     edi, edi
  21. .text:00408734 loc_408734:
Едем дальше. Вторая часть проверки - регистрационное имя не должно быть в "черном списке". Похоже, что крякерская команда BRD (Black Riders) напрягала авторов особенно сильно.
  1. ; Проверки на запрещенные регистрационные имена. Привет крякерам :)
  2. .text:00408734                 mov     esi, [ebp+lpString]
  3. .text:00408737                 mov     edx, offset asc_446AB8 ; "-"
  4. .text:0040873C                 mov     ecx, esi        ; lpString
  5. .text:0040873E                 call    sub_4326C2
  6. .text:00408743                 test    eax, eax
  7. .text:00408745                 jz      short loc_408749
  8. .text:00408747                 xor     edi, edi
  9. .text:00408749 loc_408749:
  10. .text:00408749                 mov     edx, offset aFlintstone ; "Flintstone"
  11. .text:0040874E                 mov     ecx, ebx        ; lpString
  12. .text:00408750                 call    sub_4326C2
  13. .text:00408755                 test    eax, eax
  14. .text:00408757                 jz      short loc_40875B
  15. .text:00408759                 xor     edi, edi
  16. .text:0040875B loc_40875B:
  17. .text:0040875B                 mov     edx, offset aRadikalModds ; "Radikal Modds"
  18. .text:00408760                 mov     ecx, ebx        ; lpString
  19. .text:00408762                 call    sub_4326C2
  20. .text:00408767                 test    eax, eax
  21. .text:00408769                 jz      short loc_40876D
  22. .text:0040876B                 xor     edi, edi
  23. .text:0040876D loc_40876D:
  24. .text:0040876D                 mov     edx, offset aBrdCult ; "BRD Cult"
  25. .text:00408772                 mov     ecx, ebx        ; lpString
  26. .text:00408774                 call    sub_4326C2
  27. .text:00408779                 test    eax, eax
  28. .text:0040877B                 jz      short loc_40877F
  29. .text:0040877D                 xor     edi, edi
  30. .text:0040877F loc_40877F:
  31. .text:0040877F                 mov     edx, offset aTeam ; "Team"
  32. .text:00408784                 mov     ecx, ebx        ; lpString
  33. .text:00408786                 call    sub_4326C2
  34. .text:0040878B                 test    eax, eax
  35. .text:0040878D                 jz      short loc_408791
  36. .text:0040878F                 xor     edi, edi
  37. .text:00408791 loc_408791:
Дальше проверяется каждый символ серийного номера. В листинге не совсем очевидно, но под отладчиком все становится понятно. 4-й и 7-й символы должны быть цифрами, а остальные - буквами от 'A' до 'Z'.
  1. ; Первый символ должен быть буквой 'A'-'Z'
  2. .text:00408791                 movsx   eax, byte ptr [esi]
  3. .text:00408794                 push    eax
  4. .text:00408795                 call    sub_4016F2
  5. .text:0040879A                 pop     ecx
  6. .text:0040879B                 test    eax, eax
  7. .text:0040879D                 jz      short loc_4087A1
  8. .text:0040879F                 xor     edi, edi
  9. .text:004087A1 loc_4087A1:
  10. ; Второй символ должен быть буквой 'A'-'Z'
  11. .text:004087A1                 movsx   eax, byte ptr [esi+1]
  12. .text:004087A5                 push    eax
  13. .text:004087A6                 call    sub_4016F2
  14. .text:004087AB                 pop     ecx
  15. .text:004087AC                 test    eax, eax
  16. .text:004087AE                 jz      short loc_4087B2
  17. .text:004087B0                 xor     edi, edi
  18. .text:004087B2 loc_4087B2:
  19. ; Третий символ должен быть буквой 'A'-'Z'
  20. .text:004087B2                 movsx   eax, byte ptr [esi+2]
  21. .text:004087B6                 push    eax
  22. .text:004087B7                 call    sub_4016F2
  23. .text:004087BC                 pop     ecx
  24. .text:004087BD                 test    eax, eax
  25. .text:004087BF                 jz      short loc_4087C3
  26. .text:004087C1                 xor     edi, edi
  27. .text:004087C3 loc_4087C3:
  28. ; Четвертый символ НЕ должен быть буквой 'A'-'Z'
  29. .text:004087C3                 movsx   eax, byte ptr [esi+3]
  30. .text:004087C7                 push    eax
  31. .text:004087C8                 call    sub_4016F2
  32. .text:004087CD                 pop     ecx
  33. .text:004087CE                 test    eax, eax
  34. .text:004087D0                 jnz     short loc_4087D4
  35. .text:004087D2                 xor     edi, edi
  36. .text:004087D4 loc_4087D4:
  37. ; Пятый символ должен быть буквой 'A'-'Z'
  38. .text:004087D4                 movsx   eax, byte ptr [esi+4]
  39. .text:004087D8                 push    eax
  40. .text:004087D9                 call    sub_4016F2
  41. .text:004087DE                 pop     ecx
  42. .text:004087DF                 test    eax, eax
  43. .text:004087E1                 jz      short loc_4087E5
  44. .text:004087E3                 xor     edi, edi
  45. .text:004087E5 loc_4087E5:
  46. ; Шестой символ должен быть буквой 'A'-'Z'
  47. .text:004087E5                 movsx   eax, byte ptr [esi+5]
  48. .text:004087E9                 push    eax
  49. .text:004087EA                 call    sub_4016F2
  50. .text:004087EF                 pop     ecx
  51. .text:004087F0                 test    eax, eax
  52. .text:004087F2                 jz      short loc_4087F6
  53. .text:004087F4                 xor     edi, edi
  54. .text:004087F6 loc_4087F6:
  55. ; Седьмой символ НЕ должен быть буквой 'A'-'Z'
  56. .text:004087F6                 movsx   eax, byte ptr [esi+6]
  57. .text:004087FA                 push    eax
  58. .text:004087FB                 call    sub_4016F2
  59. .text:00408800                 pop     ecx
  60. .text:00408801                 test    eax, eax
  61. .text:00408803                 jnz     short loc_408807
  62. .text:00408805                 xor     edi, edi
  63. .text:00408807 loc_408807:
  64. ; Код возврата после всех проверок
  65. .text:00408807                 mov     eax, edi
  66. .text:00408809                 pop     edi
  67. .text:0040880A                 pop     esi
  68. .text:0040880B                 pop     ebx
  69. .text:0040880C                 pop     ebp
  70. .text:0040880D                 retn
Вот и весь алгоритм проверки. Так, к примеру, правильной регистрационной парой будут имя "ManHunter / PCL" и серийный номер "AOA7AA7". После ввода программа благодарит за регистрацию:

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

Но обратите внимание, что программа лезет сверять серийный номер на свой сайт (если интересно, то это функция по адресу 00434797, сразу же перед сообщением о правильной регистрации), поэтому в обязательном порядке WinPatrol надо блокировать на фаерволе. Вот такая не особо сложная, но, на мой взгляд, интересная защита. Кейген теперь вы можете написать самостоятельно.

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

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (22.04.2016 в 20:51):
Autoruns, RkUnhooker и GMER работают на порядок лучше.
Александр (22.04.2016 в 18:38):
Цитата: «Особого доверия я к этой программе не испытываю, так как предпочитаю пользоваться только проверенным инструментарием».
Если можно, расскажи, пожалуйста, о своём проверенном инструментарии, весьма интересует.
Grey (30.09.2013 в 09:43):
извиняюсь
ManHunter (27.09.2013 в 14:16):
Невнимательно читаешь

; Вызвать функцию проверки регистрации
.text:0041EC83 call    sub_4086FE

а дальше проверяется ее результат.
Grey (27.09.2013 в 12:48):
За кадром осталось как ты вышел на 004086FE ???? Она внутри sub_4089D7 или наоборот из нее вызов на 0041EC8D ???
Сергей (13.01.2013 в 09:45):
Какие вы умные!
Для меня всё тёмный лес, я начинающий...
     "Профессионал тоже когда-то был начинающим"
                      ЛСН
Марк (19.12.2012 в 17:01):
Если это просто, что же сложно? Приятно что не перевелись умы на руси. Респект  и всего наилучшего.
ManHunter (21.05.2012 в 14:44):
Новичкам лучше учиться на примере таких простых программ. А их в природе еще немеряно, ломать не переломать :)
AyTkACT (21.05.2012 в 10:23):
В очередной раз поражаюсь умению наковырять софт вроде этого.
Мэн как обычно чёток и последователен.

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

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

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