Blog. Just Blog

Исследование защиты программы Daossoft ZIP Password Rescuer

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Темная сторона Силы | Автор: ManHunter
Скриншот программы Daossoft ZIP Password Rescuer
Скриншот программы Daossoft ZIP Password Rescuer

Программа Daossoft ZIP Password Rescuer предназначена для восстановления забытых паролей от ZIP-архивов. Восстановление производится прямым перебором по маске и известному набору символов, а также по словарю. Полезная в хозяйстве штуковина, но без регистрации может взломать пароли не более 3 символов. Регистрация, естественно, доступна за некоторую сумму денег, что мне категорически не нравится.

Скачиваем с офсайта дистрибутив, устанавливаем, запускаем. В комплекте есть тестовый архив с паролем "abc", на котором можно убедиться в работоспособности программы. А вот на более длинных паролях срабатывает ограничение:

Ограничение незарегистрированной программы
Ограничение незарегистрированной программы

Если при этом попробовать зарегистрировать программу какими-нибудь левыми данными, то появится следующее сообщение:

Сообщение о неправильной регистрации
Сообщение о неправильной регистрации

Теперь смотрим на основной исполняемый файл. Он упакован UPX, который прекрасно снимается самим же UPX командой upx -d ZIPPasswordRescuer.exe. И все бы хорошо, но после распаковки программа перестает запускаться. Теперь у нас есть аж четыре варианта решения: найти алгоритм генерации серийника; найти проверку на распакованность и деактивировать ее, а затем пропатчить файл; сделать лоадер или воспользоваться inline-патчем. Обычных патчей в этом разделе сайта уже много, давайте для разнообразия заинлайним UPX. Но для начала надо выяснить необходимый объем работы.

Распакованный файл хоть и не запускается, все равно нам пригодится для исследования. Отправляем его на разборку в дизассемблер. Когда тот закончит работу, найдем код, где выводится сообщение о неправильной регистрации:
  1. .text:00417C17                 call    sub_4158C0
  2. .text:00417C1C                 mov     byte ptr [esp+3Ch], 1
  3. .text:00417C21                 mov     eax, [esp+10h]
  4. .text:00417C25                 cmp     dword ptr [eax-0Ch], 0
  5. ; Неудачная регистрация
  6. .text:00417C29                 jl      short loc_417C82
  7. .text:00417C2B                 push    offset off_46A834
  8. .text:00417C30                 push    eax
  9. .text:00417C31                 call    _wcsstr
  10. .text:00417C36                 add     esp, 8
  11. .text:00417C39                 test    eax, eax
  12. ; Неудачная регистрация
  13. .text:00417C3B                 jz      short loc_417C82
  14. .text:00417C3D                 sub     eax, [esp+10h]
  15. .text:00417C41                 sar     eax, 1
  16. ; Неудачная регистрация
  17. .text:00417C43                 jnz     short loc_417C82
  18. .text:00417C45                 mov     ecx, ebx
  19. .text:00417C47                 push    ecx
  20. .text:00417C48                 call    sub_416E80
  21. .text:00417C4D                 test    al, al
  22. ; Неудачная регистрация
  23. .text:00417C4F                 jz      short loc_417C82
  24. .text:00417C51                 mov     edi, ebx
  25. .text:00417C53                 call    sub_417010
  26. .text:00417C58                 test    al, al
  27. ; Невозможно сохранить регистрационные данные
  28. .text:00417C5A                 jz      short loc_417C90
  29. .text:00417C5C                 call    ?AfxGetModuleState
  30. ; Сообщение об успешной регистрации
  31. .text:00417C61                 push    0
  32. .text:00417C63                 push    offset String2
  33. ; "Daossoft ZIP Password Rescuer"
  34. .text:00417C68                 push    offset aThankYouForReg
  35. ; "Thank you for registering!"
  36. .text:00417C6D                 mov     ecx, esi
  37. .text:00417C6F                 call    sub_41E6E6
  38. .text:00417C74                 mov     edx, [esi]
  39. .text:00417C76                 mov     eax, [edx+158h]
  40. .text:00417C7C                 mov     ecx, esi
  41. .text:00417C7E                 call    eax
  42. .text:00417C80                 jmp     short loc_417CA3
  43. .text:00417C82 ; ---------------------------------------
  44. .text:00417C82 loc_417C82:
  45. ; Сообщение о неправильной регистрации
  46. .text:00417C82                 push    30h
  47. .text:00417C84                 push    offset ValueName ; "Registration"
  48. .text:00417C89                 push    offset aTheCodeYouVeEn
  49. ; "The Code you've entered invalid!"
  50. .text:00417C8E                 jmp     short loc_417C9C
Куча проверок, множество условных переходов. В статике проанализировать это достаточно сложно, надо бы пройтись тут отладчиком и посмотреть, что тут и как происходит. Но предварительно надо в PE-заголовке исполняемого файла поставить флаг, что релоки не используются. Удобнее всего это сделать в программе PE Tools.

Устанавливаем флаг в заголовке
Устанавливаем флаг в заголовке

После такого исправления файл будет всегда грузиться по фиксированным адресам, что в дальнейшем пригодится нам для inline-патча. Загружаем файл в отладчик, запускаем, ставим точку останова где-нибудь по адресу 00417BFD или чуть дальше. Да, именно в такой последовательности, сперва запускаем, чтобы получить в памяти распакованный файл, а только потом ставим точку останова. Пытаемся зарегистрировать какими-нибудь левыми данными. После срабатывания точки останова переходим в пошаговый режим и смотрим. Сперва проверяется, что серийник вообще введен, затем выполняется первое сравнение со строкой "DAOSSOFT-ZIP-RESCUER". То есть серийный номер должен начинаться с этой строки. Отпускаем программу на выполнение, повторяем процесс регистрации со строкой "DAOSSOFT-ZIP-RESCUER" в качестве серийника. Проверка проходит успешно, но последняя проверка по адресу 00417C48 сводит на нет все усилия. Давайте посмотрим, что там происходит. Для удобства я сокращу код, оставив только важные участки.
  1. .text:00416E80                 push    0FFFFFFFFh
  2. .text:00416E82                 push    offset loc_45E1F8
  3. .text:00416E87                 mov     eax, large fs:0
  4. .text:00416E8D                 push    eax
  5. .text:00416E8E                 sub     esp, 8
  6. .text:00416E91                 push    ebx
  7. .text:00416E92                 push    esi
  8. .text:00416E93                 push    edi
  9. ...
  10. ...
  11. .text:00416F61                 add     esp, 4
  12. .text:00416F64                 mov     byte ptr [esp+24h+var_4], bl
  13. .text:00416F68                 cmp     eax, ebx
  14. .text:00416F6A                 mov     eax, [esp+24h+var_14]
  15. .text:00416F6E                 mov     edx, edi
  16. ; Переход в случае неправильной регистрации
  17. .text:00416F70                 jle     short loc_416FBF
  18. .text:00416F72                 add     eax, 0FFFFFFF0h
  19. ...
  20. ...
  21. ; Правильная регистрация
  22. .text:00416FA8                 mov     al, 1
  23. .text:00416FAA                 mov     ecx, [esp+24h+var_C]
  24. .text:00416FAE                 mov     large fs:0, ecx
  25. .text:00416FB5                 pop     ecx
  26. .text:00416FB6                 pop     edi
  27. .text:00416FB7                 pop     esi
  28. .text:00416FB8                 pop     ebx
  29. .text:00416FB9                 add     esp, 14h
  30. .text:00416FBC                 retn    4
  31. .text:00416FBF ; ---------------------------------------
  32. .text:00416FBF loc_416FBF:
  33. .text:00416FBF                 add     eax, 0FFFFFFF0h
  34. .text:00416FC2                 lea     ecx, [eax+0Ch]
  35. .text:00416FC5                 lock xadd [ecx], edx
  36. ...
  37. ...
  38. ; Неправильная регистрация
  39. .text:00416FF5                 xor     al, al
  40. .text:00416FF7                 mov     ecx, [esp+24h+var_C]
  41. .text:00416FFB                 mov     large fs:0, ecx
  42. .text:00417002                 pop     ecx
  43. .text:00417003                 pop     edi
  44. .text:00417004                 pop     esi
  45. .text:00417005                 pop     ebx
  46. .text:00417006                 add     esp, 14h
  47. .text:00417009                 retn    4
Итак, здесь проверятся, чтобы после строки "DAOSSOFT-ZIP-RESCUER" были какие-то данные, и затем эти данные тоже каким-то образом проверяются. По результатам проверки выполняется или не выполняется условный переход по адресу 00416F70. То есть это единственное место, отвечающее за результат. Вот его и будем патчить. Нам надо модифицировать код таким образом, чтобы условный переход не сработал. Причем не забываем про инлайн, поэтому сделать это надо самым компактным способом. Самый простой способ в один байт, надо просто заменить адрес условного перехода на следующую команду. Байт 4Dh по адресу 00416F71 надо заменить на 00h.

Для чистоты эксперимента переустанавливаем программу, убираем релоки из заголовка, затем делаем инлайн-патч упакованного файла. Переходим в самый конец кода распаковщика UPX и вместо команды перехода на OEP и следующих за ней нулевых байт пишем код для модификации условного перехода. Переход на OEP я сделал через связку PUSH-RET, но никто не запрещает сделать это через JMP, как было в исходном варианте.

Inline-патч UPX
Inline-патч UPX

Сохраняем изменения, запускаем. Открываем диалог регистрации и вводим в качестве серийника строку "DAOSSOFT-ZIP-RESCUER". Программа благодарит за регистрацию.

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

В окне "О программе" исчезла надпись о триальной версии. Теперь надо убедиться, что сняты функциональные ограничения. Ломаем ZIP-архив с длинным паролем.

Ограничения сняты
Ограничения сняты

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

Поделиться ссылкой ВКонтакте
Просмотров: 1953 | Комментариев: 4

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Жека (24.02.2020 в 22:06):
Как писал voffka, PE Explorer-ом прекрасно распаковывается и запускается... что позволило изучить эту защиту и обнаружилась полная лажа. Заветная строка "DAOSSOFT-ZIP-RESCUER" + добавляешь ещё заветные числа "1234-45678" и получаете настоящий лицензионный ключ.
Вот так будет выглядеть настоящий ключ: DAOSSOFT-ZIP-RESCUER1234-45678  И что самое банальное, это работает на всех их продуктах, главное найти заветные строки типа  "DAOSSOFT-xxx-xxxx" для каждого из их продукта эта "писюлька" будет разной, кроме 1234-45678. Серьёзная защита от школьников для школьников)))
voffka (30.11.2019 в 21:58):
Распаковал upx-3.95-win32, секция релоков обнулена, а relocation stripped не включена. Возможно в этом дело.
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

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.005 сек.) / Память: 4.5 Mb
Наверх