Исследование защиты программы Daossoft ZIP Password Rescuer
Скриншот программы Daossoft ZIP Password Rescuer
Программа Daossoft ZIP Password Rescuer предназначена для восстановления забытых паролей от ZIP-архивов. Восстановление производится прямым перебором по маске и известному набору символов, а также по словарю. Полезная в хозяйстве штуковина, но без регистрации может взломать пароли не более 3 символов. Регистрация, естественно, доступна за некоторую сумму денег, что мне категорически не нравится.
Скачиваем с офсайта дистрибутив, устанавливаем, запускаем. В комплекте есть тестовый архив с паролем "abc", на котором можно убедиться в работоспособности программы. А вот на более длинных паролях срабатывает ограничение:
Ограничение незарегистрированной программы
Если при этом попробовать зарегистрировать программу какими-нибудь левыми данными, то появится следующее сообщение:
Сообщение о неправильной регистрации
Теперь смотрим на основной исполняемый файл. Он упакован UPX, который прекрасно снимается самим же UPX командой upx -d ZIPPasswordRescuer.exe. И все бы хорошо, но после распаковки программа перестает запускаться. Теперь у нас есть аж четыре варианта решения: найти алгоритм генерации серийника; найти проверку на распакованность и деактивировать ее, а затем пропатчить файл; сделать лоадер или воспользоваться inline-патчем. Обычных патчей в этом разделе сайта уже много, давайте для разнообразия заинлайним UPX. Но для начала надо выяснить необходимый объем работы.
Распакованный файл хоть и не запускается, все равно нам пригодится для исследования. Отправляем его на разборку в дизассемблер. Когда тот закончит работу, найдем код, где выводится сообщение о неправильной регистрации:
Code (Assembler) : Убрать нумерацию
- .text:00417C17 call sub_4158C0
- .text:00417C1C mov byte ptr [esp+3Ch], 1
- .text:00417C21 mov eax, [esp+10h]
- .text:00417C25 cmp dword ptr [eax-0Ch], 0
- ; Неудачная регистрация
- .text:00417C29 jl short loc_417C82
- .text:00417C2B push offset off_46A834
- .text:00417C30 push eax
- .text:00417C31 call _wcsstr
- .text:00417C36 add esp, 8
- .text:00417C39 test eax, eax
- ; Неудачная регистрация
- .text:00417C3B jz short loc_417C82
- .text:00417C3D sub eax, [esp+10h]
- .text:00417C41 sar eax, 1
- ; Неудачная регистрация
- .text:00417C43 jnz short loc_417C82
- .text:00417C45 mov ecx, ebx
- .text:00417C47 push ecx
- .text:00417C48 call sub_416E80
- .text:00417C4D test al, al
- ; Неудачная регистрация
- .text:00417C4F jz short loc_417C82
- .text:00417C51 mov edi, ebx
- .text:00417C53 call sub_417010
- .text:00417C58 test al, al
- ; Невозможно сохранить регистрационные данные
- .text:00417C5A jz short loc_417C90
- .text:00417C5C call ?AfxGetModuleState
- ; Сообщение об успешной регистрации
- .text:00417C61 push 0
- .text:00417C63 push offset String2
- ; "Daossoft ZIP Password Rescuer"
- .text:00417C68 push offset aThankYouForReg
- ; "Thank you for registering!"
- .text:00417C6D mov ecx, esi
- .text:00417C6F call sub_41E6E6
- .text:00417C74 mov edx, [esi]
- .text:00417C76 mov eax, [edx+158h]
- .text:00417C7C mov ecx, esi
- .text:00417C7E call eax
- .text:00417C80 jmp short loc_417CA3
- .text:00417C82 ; ---------------------------------------
- .text:00417C82 loc_417C82:
- ; Сообщение о неправильной регистрации
- .text:00417C82 push 30h
- .text:00417C84 push offset ValueName ; "Registration"
- .text:00417C89 push offset aTheCodeYouVeEn
- ; "The Code you've entered invalid!"
- .text:00417C8E jmp short loc_417C9C
Устанавливаем флаг в заголовке
После такого исправления файл будет всегда грузиться по фиксированным адресам, что в дальнейшем пригодится нам для inline-патча. Загружаем файл в отладчик, запускаем, ставим точку останова где-нибудь по адресу 00417BFD или чуть дальше. Да, именно в такой последовательности, сперва запускаем, чтобы получить в памяти распакованный файл, а только потом ставим точку останова. Пытаемся зарегистрировать какими-нибудь левыми данными. После срабатывания точки останова переходим в пошаговый режим и смотрим. Сперва проверяется, что серийник вообще введен, затем выполняется первое сравнение со строкой "DAOSSOFT-ZIP-RESCUER". То есть серийный номер должен начинаться с этой строки. Отпускаем программу на выполнение, повторяем процесс регистрации со строкой "DAOSSOFT-ZIP-RESCUER" в качестве серийника. Проверка проходит успешно, но последняя проверка по адресу 00417C48 сводит на нет все усилия. Давайте посмотрим, что там происходит. Для удобства я сокращу код, оставив только важные участки.
Code (Assembler) : Убрать нумерацию
- .text:00416E80 push 0FFFFFFFFh
- .text:00416E82 push offset loc_45E1F8
- .text:00416E87 mov eax, large fs:0
- .text:00416E8D push eax
- .text:00416E8E sub esp, 8
- .text:00416E91 push ebx
- .text:00416E92 push esi
- .text:00416E93 push edi
- ...
- ...
- .text:00416F61 add esp, 4
- .text:00416F64 mov byte ptr [esp+24h+var_4], bl
- .text:00416F68 cmp eax, ebx
- .text:00416F6A mov eax, [esp+24h+var_14]
- .text:00416F6E mov edx, edi
- ; Переход в случае неправильной регистрации
- .text:00416F70 jle short loc_416FBF
- .text:00416F72 add eax, 0FFFFFFF0h
- ...
- ...
- ; Правильная регистрация
- .text:00416FA8 mov al, 1
- .text:00416FAA mov ecx, [esp+24h+var_C]
- .text:00416FAE mov large fs:0, ecx
- .text:00416FB5 pop ecx
- .text:00416FB6 pop edi
- .text:00416FB7 pop esi
- .text:00416FB8 pop ebx
- .text:00416FB9 add esp, 14h
- .text:00416FBC retn 4
- .text:00416FBF ; ---------------------------------------
- .text:00416FBF loc_416FBF:
- .text:00416FBF add eax, 0FFFFFFF0h
- .text:00416FC2 lea ecx, [eax+0Ch]
- .text:00416FC5 lock xadd [ecx], edx
- ...
- ...
- ; Неправильная регистрация
- .text:00416FF5 xor al, al
- .text:00416FF7 mov ecx, [esp+24h+var_C]
- .text:00416FFB mov large fs:0, ecx
- .text:00417002 pop ecx
- .text:00417003 pop edi
- .text:00417004 pop esi
- .text:00417005 pop ebx
- .text:00417006 add esp, 14h
- .text:00417009 retn 4
Для чистоты эксперимента переустанавливаем программу, убираем релоки из заголовка, затем делаем инлайн-патч упакованного файла. Переходим в самый конец кода распаковщика UPX и вместо команды перехода на OEP и следующих за ней нулевых байт пишем код для модификации условного перехода. Переход на OEP я сделал через связку PUSH-RET, но никто не запрещает сделать это через JMP, как было в исходном варианте.
Inline-патч UPX
Сохраняем изменения, запускаем. Открываем диалог регистрации и вводим в качестве серийника строку "DAOSSOFT-ZIP-RESCUER". Программа благодарит за регистрацию.
Программа успешно "зарегистрирована"
В окне "О программе" исчезла надпись о триальной версии. Теперь надо убедиться, что сняты функциональные ограничения. Ломаем ZIP-архив с длинным паролем.
Ограничения сняты
Никаких проблем, пароль успешно найден, значит программа работает в зарегистрированном режиме. В интерфейсе остались кнопки регистрации, но это на работу никак не влияет, мне кажется, так оно первоначально и задумано. Точно так же обходится защита остальных программ этой конторы.
Просмотров: 2044 | Комментариев: 4
Метки: исследование защиты
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
voffka
(30.11.2019 в 21:58):
Распаковал upx-3.95-win32, секция релоков обнулена, а relocation stripped не включена. Возможно в этом дело.
PE Explorer с релоками распаковал.
PE Explorer с релоками распаковал.
ManHunter
(30.11.2019 в 21:15):
Да чо с ним может быть не так. Обычный UPX, последняя версия с офсайта. А распакованный файл все равно уходит в несознанку.
voffka
(30.11.2019 в 20:49):
PE Explorer-ом прекрасно распаковывается и запускается, что-то с твоим upx не так.
Ну и чтоб с релоками не заморачиваться. Места хватает чтоб базу получить
004F2AFF PUSHAD
004F2B00 MOV EAX,DWORD PTR FS:[30]
004F2B06 MOV EAX,DWORD PTR DS:[EAX+8]
004F2B09 MOV BYTE PTR DS:[EAX+16F71],0
004F2B10 POPAD
004F2B11 JMP 0043CC68
Ну и чтоб с релоками не заморачиваться. Места хватает чтоб базу получить
004F2AFF PUSHAD
004F2B00 MOV EAX,DWORD PTR FS:[30]
004F2B06 MOV EAX,DWORD PTR DS:[EAX+8]
004F2B09 MOV BYTE PTR DS:[EAX+16F71],0
004F2B10 POPAD
004F2B11 JMP 0043CC68
Добавить комментарий
Заполните форму для добавления комментария
Вот так будет выглядеть настоящий ключ: DAOSSOFT-ZIP-RESCUER1234-45678 И что самое банальное, это работает на всех их продуктах, главное найти заветные строки типа "DAOSSOFT-xxx-xxxx" для каждого из их продукта эта "писюлька" будет разной, кроме 1234-45678. Серьёзная защита от школьников для школьников)))