Blog. Just Blog

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

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
BWMeter от DeskSoft - одна из лучших программ для подсчета трафика на локальном компьютере. При помощи BWMeter можно раздельно считать внутрисетевой или же исходящий/входящий интернет-трафик. Присутствуют настраиваемые фильтры, отчеты можно представлять как в цифровом, так и в графическом виде. Также BWMeter может служить в качестве ограничителя скорости при различных условиях.

Скриншот программы BWMeter
Скриншот программы BWMeter

Но при всех многочисленных достоинствах у программы есть один большой недостаток: она стоит $30 и работает в ознакомительном режиме 30 дней. Что ж, придется исправлять эту ошибку автора.

Дистрибутив последней на момент публикации версии BWMeter 4.0.8 можно скачать с офсайта (около 600 килобайт). Установим программу и приступим к изучению ее внутренностей. Когда-то давно в интернете выкладывали одну валидную лицензию, все данные регистрации в ней основаны на криптографических алгоритмах, так что про подбор и генерацию ключей можно сразу забыть. Придется вносить изменения в программный код. Файл лицензии имел расширение "dlc", попробуем поискать эту строчку в исполняемом файле. Найдется только одно вхождение.

Поиск строки расширения
Поиск строки расширения

Там же рядом видны строки, очень похожие на фрагменты из лицензии, но они нас не интересуют. Посмотрим в дизассемблере код, который ссылается на строку "dlc".
  1. .text:00425C90 ; int __cdecl sub_425C90(char ArgList)
  2. .text:00425C90 sub_425C90      proc near               ; CODE XREF: sub_425D80+2B
  3. .text:00425C90                                         ; sub_425D80+47
  4. .text:00425C90
  5. .text:00425C90 Dst             = byte ptr -464h
  6. .text:00425C90 var_10          = dword ptr -10h
  7. .text:00425C90 var_C           = dword ptr -0Ch
  8. .text:00425C90 var_4           = dword ptr -4
  9. .text:00425C90 ArgList         = byte ptr  4
  10. .text:00425C90
  11. .text:00425C90                 push    0FFFFFFFFh
  12. .text:00425C92                 push    offset loc_44B3CB
  13. .text:00425C97                 mov     eax, large fs:0
  14. .text:00425C9D                 push    eax
  15. .text:00425C9E                 sub     esp, 458h
  16. .text:00425CA4                 mov     eax, dword_477EA0
  17. .text:00425CA9                 xor     eax, esp
  18. .text:00425CAB                 mov     [esp+464h+var_10], eax
  19. .text:00425CB2                 mov     eax, dword_477EA0
  20. .text:00425CB7                 xor     eax, esp
  21. .text:00425CB9                 push    eax
  22. .text:00425CBA                 lea     eax, [esp+468h+var_C]
  23. .text:00425CC1                 mov     large fs:0, eax
  24. .text:00425CC7                 mov     eax, dword ptr [esp+468h+ArgList]
  25. .text:00425CCE                 push    offset aDlc     ; "dlc"
  26. .text:00425CD3                 push    eax             ; ArgList
  27. .text:00425CD4                 lea     eax, [esp+470h+Dst]
  28. .text:00425CD8                 push    offset aS_S     ; "%s\\*.%s"
  29. .text:00425CDD                 push    eax             ; Dst
  30. .text:00425CDE                 call    sub_42C920
  31. .text:00425CE3                 add     esp, 10h
  32. .text:00425CE6                 lea     ecx, [esp+468h+Dst] ; int
  33. .text:00425CEA                 mov     [esp+468h+var_4], 0
  34. .text:00425CF5                 call    sub_42CB00
  35. .text:00425CFA                 test    al, al
  36. .text:00425CFC                 jz      short loc_425D24
  37. .text:00425CFE                 mov     edi, edi
  38. .text:00425D00
  39. .text:00425D00 loc_425D00:                             ; CODE XREF: sub_425C90+92
  40. .text:00425D00                 lea     ecx, [esp+468h+Dst]
  41. .text:00425D04                 call    sub_42C9A0
  42. .text:00425D09                 push    eax             ; lpFileName
  43. .text:00425D0A                 call    sub_4258B0
  44. .text:00425D0F                 add     esp, 4
  45. .text:00425D12                 lea     ecx, [esp+468h+Dst] ; int
  46. .text:00425D16                 cmp     eax, 1
  47. .text:00425D19                 jz      short loc_425D5E
  48. .text:00425D1B                 call    sub_42CB00
  49. .text:00425D20                 test    al, al
  50. .text:00425D22                 jnz     short loc_425D00
  51. .text:00425D24
  52. .text:00425D24 loc_425D24:                             ; CODE XREF: sub_425C90+6C
  53. .text:00425D24                 lea     ecx, [esp+468h+Dst]
  54. .text:00425D28                 mov     [esp+468h+var_4], 0FFFFFFFFh
  55. .text:00425D33                 call    sub_42CA00
  56. .text:00425D38                 xor     al, al
  57. .text:00425D3A
  58. .text:00425D3A loc_425D3A:                             ; CODE XREF: sub_425C90+E0
  59. .text:00425D3A                 mov     ecx, [esp+468h+var_C]
  60. .text:00425D41                 mov     large fs:0, ecx
  61. .text:00425D48                 pop     ecx
  62. .text:00425D49                 mov     ecx, [esp+464h+var_10]
  63. .text:00425D50                 xor     ecx, esp
  64. .text:00425D52                 call    sub_435EAC
  65. .text:00425D57                 add     esp, 464h
  66. .text:00425D5D                 retn
  67. .text:00425D5E ; ---------------------------------------------------------------
  68. .text:00425D5E
  69. .text:00425D5E loc_425D5E:                             ; CODE XREF: sub_425C90+89
  70. .text:00425D5E                 mov     [esp+468h+var_4], 0FFFFFFFFh
  71. .text:00425D69                 call    sub_42CA00
  72. .text:00425D6E                 mov     al, 1
  73. .text:00425D70                 jmp     short loc_425D3A
  74. .text:00425D70 sub_425C90      endp
Под отладчиком можно протрассировать эту процедуру и выяснить, что здесь ищутся все файлы с расширением *.dlc, и в случае если такие файлы будут найдены, то с ними последовательно выполняются какие-то проверки. Из процедуры при разных условиях в регистре AL возвращается два значения - 0 в случае если не найдено ни одной валидной лицензии и 1 в случае если программа зарегистрирована. Не будем мудрить и просто пропишем в начало функции по адресу 00425C90 две последовательные ассемблерные команды MOV AL,1 и RET. Теперь при любом раскладе программа будет считать себя зарегистрированной и это подтверждается окном "About".

Программа считает себя зарегистрированной
Программа считает себя зарегистрированной

То, что нет имени и типа лицензии вполне логично, ведь мы даже не проверяли ни одного файла с регистрационными данными. Но это нас волновать не должно, ведь программа работает почти без нареканий. Почему почти? Потому что, несмотря на внешнюю "зарегистрированность", ровно через 30 дней при старте BWMeter мы получим вот такое неприятное окно:

Лицензия закончилась
Лицензия закончилась

Попытки найти эту строку в файле терпят неудачу, автор предусмотрительно зашифровал все текстовые строки, так или иначе сигнализирующие о состоянии регистрации программы. Ничего страшного, запускаем отладчик. Пошаговой трассировкой добираемся до места, где расшифровывается строка и выводится окно. Перед ним выполняется очень интересная проверка:
  1. 00422893   |.  C687 42020000 00        MOV BYTE PTR DS:[EDI+242],0
  2. 0042289A   |.  84DB                    TEST BL,BL
  3. 0042289C   |.  75 0A                   JNZ SHORT 004228A8
  4.                                        ; 1Eh = 30 в десятичной системе
  5. 0042289E   |.  837D 00 1E              CMP DWORD PTR SS:[EBP],1E
  6.                                        ; Переход если меньше или равно
  7. 004228A2       0F86 79010000           JBE 00422A21
  8.                                        ; Этот код выводит "нехорошее" окно
  9. 004228A8   |>  68 04010000             PUSH 104
  10. 004228AD   |.  8D5424 68               LEA EDX,DWORD PTR SS:[ESP+68]
  11. 004228B1   |.  52                      PUSH EDX
  12. 004228B2   |.  6A 00                   PUSH 0
То есть выполняется сравнение какого-то счетчика с числом 30, а это и есть количество дней триального срока. Если счетчик превысил это значение, то выводится окно. Чтобы обойти проверку достаточно изменить условный переход JBE по адресу 004228A2 на безусловный переход JMP. Сохраняем изменения, запускаем, все работает как часики. Именно это нам и требовалось. Этот способ снятия защиты работает на всех версиях BWMeter, но естественно, что в разных версиях программы все адреса памяти будут отличаться. А на сэкономленную тридцатку баксов идем пить пиво.

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

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

Комментарии

Отзывы посетителей сайта о статье
xussr (02.12.2017 в 17:26):
как в нынешней версии 7  пропачить rsa?
gosha (23.12.2008 в 19:39):
Мне тоже Web нравится. Очень. Но пока на Авире сижу, вроде функционала больше, да поистеричнее. Веселее как-то. :) Всё хочу с  Look 'n' Stop-ом хорошо разобраться и на доктора перелезть.
А по теме - вроде к DU Metr уже привык... Хоть это и совсем не по теме! :)
ManHunter (23.12.2008 в 19:28):
gosha, они уже давно помирились, я пользуюсь обоими
gosha (23.12.2008 в 19:26):
Очень понравился эпилог про пиво! :)
А вообще, BWMeter с Dr.Web дрались, даже на форуме Web_а обсуждалось. Потому с него и убёг в соё время.
Nutscracker (20.12.2008 в 02:02):
Кряк для избранных ^_^

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

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

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