
Скриншот программы AttributeMagic Pro
Программа AttributeMagic Pro предназначена для пакетного изменения атрибутов файлов, даты создания, модификации и последнего изменения, переименования файлов на основании этих данных, а также изменения даты файла на основании EXIF-данных изображения (дата съемки). Польза от программы весьма сомнительная, особенно за эту цену, но сегодня нас интересует не программа, а поиск уязвимостей в ее защите.
Скачиваем дистрибутив, распаковываем, устанавливаем. Первичный осмотр файла показывает, что он вроде как ничем не упакован - все текстовые строчки в открытом виде, секции кода и ресурсов не сжаты и т.п. Но смущает наличие секций "upx0" и "upx1". Ни один компилятор не создает автоматически секции с такими именами, но и на сам UPX это совсем не похоже.

Названия секций PE-файла
Содержимое этих секций еще более подозрительное, сплошная мешанина из кода, а анализаторы исполняемых файлов молчат как партизаны. По опыту реверсинга могу с уверенностью сказать, что перед нами VMProtect, один из самых серьезных протекторов на сегодняшний день, а переименованием секций убираются ложные срабатывания некоторых антивирусов. Что ж, глаза боятся, а руки делают, поищем слабые места и ошибки в защите. Загоняем файл в дизассемблер, а параллельно посмотрим в программе как проявляется триал. При запуске показывается наг-скрин с предложением зарегистрироваться, а в окне "About" написано "Unregistered".

Окно "О программе"
Отлично, поищем эту строчку в файле и условия ее появления в дизассемблере. Поиск приводит нас вот к такому коду:
...
.text:006528F6 mov eax, off_67EDEC
.text:006528FB mov eax, [eax]
.text:006528FD xor edx, edx
.text:006528FF mov ecx, [eax]
.text:00652901 call dword ptr [ecx+6Ch]
; Вызвать функцию проверки регистрации
.text:00652904 call sub_5A8954
; Если она вернула взведенный бит, то программа не зарегистрирована
.text:00652909 test al, 2
.text:0065290B jnz short loc_652920
.text:0065290D mov eax, off_67EDEC
.text:00652912 mov eax, [eax]
.text:00652914 mov edx, offset aRegistered ; "Registered"
.text:00652919 call sub_6491A0
.text:0065291E jmp short loc_652931
.text:00652920 ; --------------------------------------------
.text:00652920 loc_652920:
.text:00652920 mov eax, off_67EDEC
.text:00652925 mov eax, [eax]
.text:00652927 mov edx, offset aUnregistered ; "Unregistered"
.text:0065292C call sub_6491A0
...
Вроде все понятно, есть какая-то функция проверки регистрации, и, если она вернула что-то типа EAX=0, то программа считается зарегистрированной. Посмотрим теперь на функцию проверки:
; Переход в секцию VMProtect
.text:005A8954 call sub_8582AF
.text:005A8959 db 67h
.text:005A8959 mov eax, eax
.text:005A895C push ebp
.text:005A895D mov ebp, esp
.text:005A895F push ecx
.text:005A8960 mov [ebp-4], eax
.text:005A8963 push offset dword_5A8984
; Переход в секцию VMProtect
.text:005A8968 jmp loc_87DA0A
...
Лютый кодо-фарш под виртуальной машиной протектора, и чем глубже - тем хуже и хуже. Разгребать это без специального инструментария нереально. Но нужно ли нам это? Вызовы функции проверки лежат в открытом виде, так что можно просто пропатчить их, или же прописать пару команд XOR EAX,EAX; RET в начало самой функции проверки. Это и есть главная ошибка аффтара, если не считать ошибок в ДНК и ошибки в выборе профессии. Ворота поставил, а забор забыл. Патчим функцию проверки, сохраняем изменения, запускаем.

Программа успешно "зарегистрирована"
Наг-окно пропало, пункт о регистрации в меню стал неактивным, а в окне "О программе" написано "Registered". Все прекрасно работает, наша цель достигнута. А любителям разных говнопротекторов я рекомендую пересмотреть свои взгляды на жизнь.