
Исследование защиты программы Recover4all

Скриншот программы Recover4all
Recover4all - старая и хорошо известная пользователям программа для восстановления удаленных данных. Работает практически со всеми типами накопителей, в том числе с отформатированными дисками. Автоматически распознает документы разных форматов, изображения, видеофайлы, музыку и т.д. Не требует инсталляции, что хорошо, зато требует денег, что плохо.
Скачиваем с сайта дистрибутив, который по совместительству является RAR-SFX архивом, устанавливаем или просто распаковываем куда надо. Признаков триальности достаточно: окно с лицензией при старте программы, надпись "not registered" в главном окне, надпись в окне "О программе", окно регистрации после попытки восстановления данных, наверняка еще что-то где-то должно вылезать. А главное, что в программе имеется функциональное ограничение на восстановление только первого из найденных файлов некоторых типов.

Триальная версия программы
Поиск начнем с самой приметной строки - "Not registered", которая болтается в главном окне. Поиском по листингу выходим на следующий код:
Code (Assembler) : Убрать нумерацию
- .text:0047F348 mov ecx, dword_87E184
- .text:0047F34E push 0
- .text:0047F350 call sub_63BDA0
- .text:0047F355 mov eax, [esp+248h+var_234]
- .text:0047F359 mov ecx, dword_87CE38
- ; Проверить значение переменной
- .text:0047F35F cmp dword ptr [eax+74290h], 0
- .text:0047F366 push 0
- .text:0047F368 push 2
- ; Если оно не равно нулю, то вывести надпись о полной версии
- .text:0047F36A jnz short loc_47F380
- .text:0047F36C push offset aNotRegistered
- ; "Not registered"
- .text:0047F371 call sub_61B9A0
- .text:0047F376 push 1
- .text:0047F378 push dword_87DDAC
- .text:0047F37E jmp short loc_47F392
- .text:0047F380 ; ---------------------------------------------
- .text:0047F380 loc_47F380:
- .text:0047F380 push offset aFullVersion
- ; "Full Version"
- .text:0047F385 call sub_61B9A0
- .text:0047F38A push 1
- .text:0047F38C push dword_87DDA8
Code (Assembler) : Убрать нумерацию
- .text:00460176 mov eax, [edi+69304h]
- .text:0046017C cmp eax, 0Ah
- ; Проверка
- .text:0046017F jnz loc_46034E
- .text:00460185 push dword_87CE34
- .text:0046018B mov ecx, dword_87CE38
- .text:00460191 mov dword ptr [edi+69300h], 0
- ; Программа зарегистрирована
- .text:0046019B mov dword ptr [edi+74290h], 1
- .text:004601A5 call sub_61DE30
- .text:004601AA call sub_44A7E0
- .text:004601AF mov ecx, edi
Code (Assembler) : Убрать нумерацию
- .text:0048D508 mov dword ptr [ebx+400Ch], 0
- ; Проверка
- .text:0048D512 cmp dword ptr [ebx+69304h], 0Ah
- .text:0048D519 jnz short loc_48D525
- ; Программа зарегистрирована
- .text:0048D51B mov dword ptr [ebx+74290h], 1
- .text:0048D525 loc_48D525:
- .text:0048D525 cmp dword ptr [ebx+7180Ch], 0
Code (Assembler) : Убрать нумерацию
- .text:004A9666 mov eax, [edi+69304h]
- .text:004A966C cmp eax, 0Ah
- ; Проверка
- .text:004A966F jnz loc_4A983B
- .text:004A9675 push dword_87CE34
- .text:004A967B mov ecx, dword_87CE38
- .text:004A9681 mov dword ptr [edi+69300h], 0
- ; Программа зарегистрирована
- .text:004A968B mov dword ptr [edi+74290h], 1
- .text:004A9695 call sub_61DE30
- .text:004A969A call sub_44A7E0

Программа успешно "зарегистрирована"
Преображение заметно сразу. В главном окне красуется надпись "full version", в окне "О программе" сообщение о лицензионном статусе, пусть и без регистрационного имени. Но главное, что при попытке восстановить удаленные файлы больше нет никаких ограничений, все восстанавливается в полном объеме. Первая цель достигнута, едем дальше.
В процессе ковыряния также было выяснено, что при попытке переименовать исполняемый файл во что-то, отличное от "Recover4all-Professional.exe", программа начинает ругаться и отказывается работать. Похоже, какие-то рудименты с древних времен, когда одну из прошлых версий защиты программы крякеры пробивали с помощью лоадера. Код проверки, мягко говоря, мрачноватый.
Code (Assembler) : Убрать нумерацию
- .text:0048AA02 add esp, 8
- .text:0048AA05 cmp eax, 1F4h
- .text:0048AA0A jge short loc_48AA16
- .text:0048AA0C xor edx, edx
- .text:0048AA0E mov [ebx+eax*2+184h], dx
- .text:0048AA16 loc_48AA16:
- .text:0048AA16 add ecx, 2
- .text:0048AA19 mov dword ptr [ebx+71810h], 1
- .text:0048AA23 mov edx, ecx
- .text:0048AA25 mov esi, offset aRecover4allP_0
- ; "Recover4all-Professional.exe"
- .text:0048AA2A mov ebx, 34h
- .text:0048AA2F nop
- .text:0048AA30 loc_48AA30:
- .text:0048AA30 mov eax, [edx]
- .text:0048AA32 cmp eax, [esi]
- .text:0048AA34 jnz short loc_48AA4C
- .text:0048AA36 add edx, 4
- .text:0048AA39 add esi, 4
- .text:0048AA3C sub ebx, 4
- .text:0048AA3F jnb short loc_48AA30
- .text:0048AA41 mov ebx, [ebp+var_16A0]
- .text:0048AA47 jmp loc_48AADA
- .text:0048AA4C ; ---------------------------------------
- .text:0048AA4C loc_48AA4C:
- .text:0048AA4C mov edx, ecx
- .text:0048AA4E mov esi, offset aRecover4allP_1
- ; "RECOVER4ALL-PROFESSIONAL.EXE"
- .text:0048AA53 mov ebx, 34h
- .text:0048AA58 loc_48AA58:
- .text:0048AA58 mov eax, [edx]
- .text:0048AA5A cmp eax, [esi]
- .text:0048AA5C jnz short loc_48AA71
- .text:0048AA5E add edx, 4
- .text:0048AA61 add esi, 4
- .text:0048AA64 sub ebx, 4
- .text:0048AA67 jnb short loc_48AA58
- .text:0048AA69 mov ebx, [ebp+var_16A0]
- .text:0048AA6F jmp short loc_48AADA
- .text:0048AA71 ; ---------------------------------------
- .text:0048AA71 loc_48AA71:
- .text:0048AA71 mov edx, ecx
- .text:0048AA73 mov esi, offset aRecover4allP_2
- ; "Recover4all-Professional.EXE"
- .text:0048AA78 mov ebx, 34h
- .text:0048AA7D lea ecx, [ecx+0]
- .text:0048AA80 loc_48AA80:
- .text:0048AA80 mov eax, [edx]
- .text:0048AA82 cmp eax, [esi]
- .text:0048AA84 jnz short loc_48AA99
- .text:0048AA86 add edx, 4
- .text:0048AA89 add esi, 4
- .text:0048AA8C sub ebx, 4
- .text:0048AA8F jnb short loc_48AA80
- .text:0048AA91 mov ebx, [ebp+var_16A0]
- .text:0048AA97 jmp short loc_48AADA
- .text:0048AA99 ; ---------------------------------------
- .text:0048AA99 loc_48AA99:
- .text:0048AA99 mov edx, offset aRecover4allP_3
- ; "RECOVER4ALL-PROFESSIONAL.exe"
- .text:0048AA9E mov esi, 34h
- .text:0048AAA3 loc_48AAA3:
- .text:0048AAA3 mov eax, [ecx]
- .text:0048AAA5 cmp eax, [edx]
- .text:0048AAA7 jnz short loc_48AABC
- .text:0048AAA9 add ecx, 4
- .text:0048AAAC add edx, 4
- .text:0048AAAF sub esi, 4
- .text:0048AAB2 jnb short loc_48AAA3
- .text:0048AAB4 mov ebx, [ebp+var_16A0]
- .text:0048AABA jmp short loc_48AADA
- .text:0048AABC ; --------------------------------------------
- .text:0048AABC loc_48AABC:
- .text:0048AABC push 0 ; int
- .text:0048AABE push 30h ; uType
- .text:0048AAC0 push offset aErrorProgramNa
- ; "Error: Program name must be \"Recover4al"...
- .text:0048AAC5 call sub_4BEC42
- .text:0048AACA mov ebx, [ebp+var_16A0]
- .text:0048AAD0 mov dword ptr [ebx+71810h], 0
- .text:0048AADA
Просмотров: 1210 | Комментариев: 3
Метки: исследование защиты, HDD

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

user
(10.08.2023 в 12:31):
Там ещё есть проверка на целостность,
срабатывает после запаковки UPX'ом на выходе.
Не знаю, не проверял, насколько она там нужна.
Вот:
;--------------------------------------->8
Recover4all-Pro 12.03
;;; Note: After repacking writes "Corrupted"...
03) Dont write "Corrupted"
Recover4all-Professional.exe
.0047F982: 74 EB ;0007ED82:
.0047F99A: 74 EB ;0007ED9A:
;--------------------------------------->8
срабатывает после запаковки UPX'ом на выходе.
Не знаю, не проверял, насколько она там нужна.
Вот:
;--------------------------------------->8
Recover4all-Pro 12.03
;;; Note: After repacking writes "Corrupted"...
03) Dont write "Corrupted"
Recover4all-Professional.exe
.0047F982: 74 EB ;0007ED82:
.0047F99A: 74 EB ;0007ED9A:
;--------------------------------------->8

Grey
(06.07.2023 в 12:14):
Читать вступление к этой категории на этом сайте - особое удовольствие. Ни одного одинакового текста по обличению алчности не замечено.
По моему автор давно переплюнул Якубовича (с его рекламными паузами), в итоге дядя Лёня выдохся, и просто их объявляет.
По моему автор давно переплюнул Якубовича (с его рекламными паузами), в итоге дядя Лёня выдохся, и просто их объявляет.

Добавить комментарий
Заполните форму для добавления комментария

и проверку патчить, соответственно, не нужно.
Так что прошлый пост неактуален