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 надо блокировать на фаерволе. Вот такая не особо сложная, но, на мой взгляд, интересная защита. Кейген теперь вы можете написать самостоятельно.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 4884 | Комментариев: 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-2018
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.24 сек. / MySQL: 2 (0.0076 сек.) / Память: 4.75 Mb
Наверх