
Скриншот программы 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. Сохраняем изменения, запускаем.

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

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

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