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


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

Программа USBFlashCopy предназначена для автоматического создания резервных копий данных с Flash-накопителей при подключении их к компьютеру. Резервная копия создается в фоновом режиме, возможны настройки для копирования файлов только отдельного типа, например, картинки или документы. Блин, да кого я обманываю... Программа USBFlashCopy предназначена для скрытого копирования информации с чужих флешек при подключении их к вашему компьютеру, например, файлов с паролями, личных фотографий, документов и других данных на ваш выбор. В бесплатном режиме на экране показывается окно с прогрессом копирования, которое невозможно закрыть, а также при каждом подключении носителей выдается окно с запросом настроек копирования. Чтобы убрать все палево и работать в скрытом режиме, требуется регистрация. Естественно, не бесплатная.

Программа портативная, не требует установки, поэтому качаем с офсайта один исполняемый файл. Никаких навесных защит на нем нет, поэтому сразу отправляем его в дизассемблер, а сами смотрим, как программа ведет себя в бесплатном режиме, и какие основные отличия от платного. Одно из основных отличий - в меню, которое появляется при клике на иконку в трее, отключены пункты "Go Silent", который отвечает за переход программы в скрытный режим, и "Hide/show backup progress", который скрывает окно с процессом кражи копирования данных.


Пункт меню отключен

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


Описание меню в ресурсах

Интересующие нас значения - это 32798 (801Eh в шестнадцатеричной системе счисления) и 32795 (801Bh). Теперь поищем в листинге дизассемблера какие-нибудь действия, производимые с этими идентификаторами.
...
.text:00408AC0                 push    0
.text:00408AC2                 lea     ecx, [esp+538h+var_258] ; void *
; Вызвать какую-то функцию какой-то проверки
.text:00408AC9                 call    sub_4021B0
.text:00408ACE                 mov     esi, [esp+538h+hMenu]
.text:00408AD2                 add     esp, 4
; Если она вернула EAX=0, то переход
.text:00408AD5                 test    eax, eax
.text:00408AD7                 jz      short loc_408AF3
.text:00408AD9                 mov     edi, ds:EnableMenuItem
; Отключить пункт меню "Go Silent"
.text:00408ADF                 push    1               ; uEnable
.text:00408AE1                 push    801Bh           ; uIDEnableItem
.text:00408AE6                 push    esi             ; hMenu
.text:00408AE7                 call    edi ; EnableMenuItem
; Отключить пункт меню "Hide/show backup progress"
.text:00408AE9                 push    1               ; uEnable
.text:00408AEB                 push    801Eh           ; uIDEnableItem
.text:00408AF0                 push    esi             ; hMenu
.text:00408AF1                 call    edi ; EnableMenuItem
.text:00408AF3 loc_408AF3:
.text:00408AF3                 mov     eax, hWnd
.text:00408AF8                 mov     ecx, [esp+534h+Point.y]
.text:00408AFC                 mov     edx, [esp+534h+Point.x]
.text:00408B00                 push    0               ; LPTPMPARAMS
.text:00408B02                 push    eax             ; HWND
.text:00408B03                 push    ecx             ; int
.text:00408B04                 push    edx             ; int
.text:00408B05                 push    102h            ; UINT
.text:00408B0A                 push    esi             ; HMENU
.text:00408B0B                 call    ds:TrackPopupMenuEx
.text:00408B11                 mov     esi, eax
.text:00408B13                 cmp     esi, 8006h
...

Что получилось? Если процедура sub_4021B0 вернула EAX=0, то мы перепрыгиваем через код блокировки пунктов меню. Посмотрим, что же это за такая интересная процедура. Она достаточно объемная, поэтому я не буду приводить ее здесь целиком, только самые интересные участки кода:
...
; Инициализация хэша MD5
.text:00402351                 mov     [esp+3DCh+var_3B8], 67452301h
.text:00402359                 mov     [esp+3DCh+var_3B4], 0EFCDAB89h
.text:00402361                 mov     [esp+3DCh+var_3B0], 98BADCFEh
.text:00402369                 mov     [esp+3DCh+var_3AC], 10325476h
...
; Работа с временем системы
.text:00402487                 lea     ecx, [esp+3C8h+SystemTime]
.text:0040248B                 push    ecx             ; lpSystemTime
.text:0040248C                 call    ds:GetLocalTime
.text:00402492                 lea     edx, [esp+3C8h+FileTime]
.text:00402496                 push    edx             ; lpFileTime
.text:00402497                 lea     eax, [esp+3CCh+SystemTime]
.text:0040249B                 push    eax             ; lpSystemTime
.text:0040249C                 call    ds:SystemTimeToFileTime
.text:004024A2                 movzx   edx, word ptr [edi+2Eh]
.text:004024A6                 lea     ecx, [esp+3C8h+var_3B8]
.text:004024AA                 push    ecx             ; lpFileTime
.text:004024AB                 push    0               ; wFatTime
.text:004024AD                 push    edx             ; wFatDate
.text:004024AE                 call    ds:DosDateTimeToFileTime
...

Интуиция мне подсказывает, что считать MD5 от каких-то данных и проверять текущее время, а потом принимать решение об отключении пунктов меню - это самая натуральная функция проверки регистрации. Как мы уже выяснили ранее, она должна возвращать EAX=0, это и будет признак зарегистрированности программы. Нет ничего проще, патчим начало функции, записывая по адресу 4021B0 команды XOR EAX,EAX; RET. Сохраняем изменения, запускаем.


Пункт в окне выбора профиля активирован

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


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

Но поскольку мы не знаем точно ни формата легального ключа, ни какие данные в нем содержатся, ни как он шифруется или проверяется, то вместо них показываются какие-то странные значения. Для красоты можно найти и отредактировать юникодную строку с шаблоном регистрационных данных:


Шаблон регистрационных данных

Можно вписать вместо нее свое имя, или оставить как есть, это уже на ваш выбор. Также оставляю на вашей совести то, для чего вы будете использовать эту программу.
Теги:
защита, взлом
Добавлено: 17 Сентября 2013 07:18:32 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...