Blog. Just Blog

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

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

WinNc - ущербная попытка приблизиться к эталонным файловым менеджерам типа Total Commander или FAR. Даже от великого Norton Commander'а кусочек себе в название оттяпали. Гибрид ужа с ежом, объединенный убогим интерфейсом. Но зато коммерческий, все дела, куда ж без этого. Сестра, готовьте операционную.

Забираем с офсайта дистрибутив, устанавливаем, смотрим. Главный исполняемый файл ничем не упакован, отправляем его на разбор в дизассемблер.

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

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

Строка в языковом файле
Строка в языковом файле

Строке "Unregistered" соответствует числовой индекс 40219 или 9D1Bh, если считать в шестнадцатеричной системе счисления. Поищем в листинге дизассемблера, где это число может использоваться. Обнаружится единственное вхождение:
  1. .text:009DC9D1                 lea     eax, [ebp+var_10]
  2. .text:009DC9D4                 call    sub_408D1C
  3. ; Получить адрес памяти с настройками
  4. .text:009DC9D9                 call    sub_9D371C
  5. ; Проверить байт в настройках
  6. .text:009DC9DE                 movzx   eax, byte ptr [eax+80h]
  7. .text:009DC9E5                 dec     eax
  8. .text:009DC9E6                 sub     al, 2
  9. ; Если он меньше 2, то программа зарегистрирована
  10. .text:009DC9E8                 jb      short loc_9DCA15
  11. .text:009DC9EA                 jz      short loc_9DCA68
  12. .text:009DC9EC                 dec     eax
  13. .text:009DC9ED                 sub     al, 2
  14. .text:009DC9EF                 jnb     loc_9DCA9B
  15. .text:009DC9F5                 lea     edx, [ebp+var_20]
  16. ; Загрузить строку "Unregistered" и вывести ее на форму
  17. .text:009DC9F8                 mov     eax, 9D1Bh
  18. .text:009DC9FD                 call    sub_638F00
  19. .text:009DCA02                 mov     edx, [ebp+var_20]
  20. .text:009DCA05                 lea     eax, [ebx+3B4h]
  21. .text:009DCA0B                 call    sub_4090FC
  22. .text:009DCA10                 jmp     loc_9DCA9B
  23. .text:009DCA15 ; --------------------------------------------------
  24. .text:009DCA15 loc_9DCA15:
  25. .text:009DCA15                 call    sub_9D371C
  26. .text:009DCA1A                 mov     edx, [eax+14h]
  27. .text:009DCA1D                 lea     eax, [ebx+3B4h]
  28. ...
  29. ...
Вроде все понятно. Проверяется байт во внутренних настройках программы, по результатам проверки или выводится строка "Unregistered", или нет. Попробуем заменить проверку инициализацией. По адресу 009DC9DE впечатываем команду аналогично длины MOV BYTE PTR [EAX+80h],1 и заменяем условный переход по адресу 009DC9E8 на безусловный. Сохраняем изменения, запускаем, смотрим. Триальное окно при старте программы все равно появляется, но потом происходит маленькое чудо и программа становится "зарегистрированной". Все нехорошие надписи пропали, все функциональные ограничения тоже, лишних элементов интерфейса тоже нет. Хороший результат, но этого недостаточно, ведь триальное окно все равно появляется. Значит поищем аналогичную проверку, которая выполняется раньше. Единственная возможная сигнатура для поиска - "+80h]". Первые же пару десятков ложных результатов поиска наводят на грустные мысли, но давайте задействуем логику. Перед проверкой вызывается функция для получения адреса настроек call sub_9D371C, значит можно предположить, что и в других проверках, относящихся к регистрации или к ее инициализации, должно вызываться что-то подобное. Еще пару минут поиска и у нас появляется следующий код:
  1. .text:00CCC4ED                 mov     [ebp+var_9], 0
  2. .text:00CCC4F1                 test    bl, bl
  3. .text:00CCC4F3                 jz      short loc_CCC50F
  4. ; Точно такая же конструкция, как и в предыдущей проверке
  5. .text:00CCC4F5                 call    sub_9D371C
  6. .text:00CCC4FA                 cmp     byte ptr [eax+80h], 0
  7. .text:00CCC501                 jnz     short loc_CCC50F
  8. .text:00CCC503                 call    sub_9D371C
  9. .text:00CCC508                 xor     edx, edx
  10. .text:00CCC50A                 call    sub_9D5ABC
  11. .text:00CCC50F loc_CCC50F:
  12. .text:00CCC50F                 call    sub_9D371C
  13. .text:00CCC514                 movzx   eax, byte ptr [eax+80h]
  14. .text:00CCC51B                 sub     al, 1
Для чистоты эксперимента откатываем все предыдущие изменения, затем по аналогии заменяем команду по адресу 00CCC4FA на MOV BYTE PTR [EAX+80h],1 и условный переход по адресу 00CCC501 на безусловный. Сохраняем изменения, запускаем программу.

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
gob (14.10.2023 в 16:08):
ссылка сдохла ( стянул через web.archive
Руслан (25.03.2022 в 12:38):
Сердечно благодарю за ответ!
ManHunter (21.03.2022 в 11:40):
Просмотр переключить на hex, поиск F7, табуляцией переключить фокус ввода на поле "Hex", там уже вводить hex-кодами нужную последовательность байт. Ну и не забываем про little-endian.
Руслан (21.03.2022 в 09:20):
Уважаемый автор блога!

Подскажите глупому новичку , как искать в HIEW значение 9D1Bh
Я нажимаю F7 , потом еще раз F7. Пробовал вводить какие-то комбинации , но ничего не находит. Как правильно задать маску для поиска этого значения? И извините заранее , что лезу с таким лузерским вопросом.
voffka (02.03.2022 в 01:40):
Для любителей лицезреть своё имя в абауте.
Тута смотрим серийник
009D5330   CALL <WinNc.DunesSerialCheck.TDunesSerialCheck.CreateCode_>
009D5335   MOV EAX,DWORD PTR SS:[EBP-1C]
009D5338   MOV EDX,DWORD PTR SS:[EBP-8]
009D533B   CALL <WinNc.System.@UStrEqual_0040A1FC
009D5340   JNZ SHORT WinNc.009D5344

Тута без онлайн проверки записываем [eax+80h],1
009D5B84   JMP WinNc.009D5C63 -> NOP

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

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

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