
Скриншот программы Zip Password Tool
Zip Password Tool от FDRLab Data Recovery Centre - программа для подбора паролей к ZIP-архивам. Позволяет подбирать пароли прямым перебором (Brute-force attack) и по заранее созданному словарю. По скорости работы, конечно, уступает лидерам в этой области, но со своей задачей вполне справляется, так что в можно держать в запасе на всякий случай. В бесплатной версии не показывает пароли длиннее 4 символов и не позволяет перебирать пароли по словарю. Это плохо, попробуем устранить эти недостатки.
Сперва качаем дистрибутив, устанавливаем его, запускаем. Сразу же нам предлагают ввести регистрационный номер. Пропускаем этот диалог и смотрим на внешние признаки триальности. Исполняемый файл ничем не упакован, поищем в нем "нехорошие" текстовые строчки.

"Нехорошая строка"
Теперь в дизассемблере посмотрим код, который ссылается на эти строчки. Тут тоже ничего сложного нет, все очень наглядно.
CODE:004DEFF3 mov edx, [eax]
CODE:004DEFF5 call dword ptr [edx+0ECh]
CODE:004DEFFB mov eax, esi
; Вызвать функцию проверки регистрации
CODE:004DEFFD call sub_4DCB30
; Если она вернула 0, то программа не зарегистрирована
CODE:004DF002 test al, al
CODE:004DF004 jz short loc_4DF022
; Установить флажок "зарегистрировано" в значение TRUE
CODE:004DF006 mov ds:byte_4EA9AD, 1
CODE:004DF00D mov eax, [esi+338h]
CODE:004DF013 mov edx, 6
CODE:004DF018 call @Spin@TSpinEdit@SetValue$qqri
CODE:004DF01D jmp loc_4DF112
CODE:004DF022 ; ----------------------------------------
; Триальная ветка алгоритма
CODE:004DF022 loc_4DF022:
CODE:004DF022 mov eax, [esi+3CCh]
CODE:004DF028 mov dl, 1
CODE:004DF02A call @Controls@TControl@SetVisible$qqro
CODE:004DF02F mov ds:byte_4EA9AD, 0
CODE:004DF036 mov eax, [esi+338h]
CODE:004DF03C mov edx, 4
; .....
; Часть кода пропущена для экономии места
; .....
CODE:004DF09A mov edx, [eax+0Ch]
CODE:004DF09D lea eax, [ebp+var_10]
; Указатель на строку [unregistered]
CODE:004DF0A0 mov ecx, offset _str___unregistered_.Text
CODE:004DF0A5 call @System@@LStrCat3$qqrv
CODE:004DF0AA mov eax, [ebp+var_10]
CODE:004DF0AD push eax
CODE:004DF0AE mov eax, [esi+2F8h]
CODE:004DF0B4 mov eax, [eax+208h]
CODE:004DF0BA xor edx, edx
CODE:004DF0BC call sub_442F90
CODE:004DF0C1 pop edx
CODE:004DF0C2 call unknown_libname_742
CODE:004DF0C7 mov eax, [esi+340h]
CODE:004DF0CD mov eax, [eax+220h]
CODE:004DF0D3 mov edx, offset _str_________________6.Text
CODE:004DF0D8 mov ecx, [eax]
CODE:004DF0DA call dword ptr [ecx+38h]
CODE:004DF0DD call @Sysutils@Time$qqrv ; Sysutils::Time(void)
CODE:004DF0E2 add esp, 0FFFFFFF8h
CODE:004DF0E5 fstp [esp+1Ch+var_1C]
CODE:004DF0E8 wait
CODE:004DF0E9 lea eax, [ebp+var_14]
CODE:004DF0EC call unknown_libname_169
CODE:004DF0F1 lea eax, [ebp+var_14]
; Указатель на строку "Unregistered version is detected!"
CODE:004DF0F4 mov edx, offset _str___Unregistered_.Text
CODE:004DF0F9 call @System@@LStrCat$qqrv
CODE:004DF0FE mov edx, [ebp+var_14]
CODE:004DF101 mov eax, [esi+340h]
Чтобы не тратить время на разбор алгоритма генерации ключа, просто пропатчим процедуру, отвечающую за проверку регистрации, записав в ее начало команды MOV AL,1; RET:
Запускаем пропатченный файл. Окно регистрации пропало, внешние признаки триальности тоже.

Программа успешно "зарегистрирована"
Для проверки попробуем подобрать пароль из 5 символов и выполнить поиск по словарю. Все опции работают, значит мы все сделали правильно. В качестве дополнительного приятного бонуса Zip Password Tool после патча может работать с любого съемного носителя, например с флешки. Затраченное время на снятие защиты - меньше одной минуты :)