Blog. Just Blog

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

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

Recover4all - старая и хорошо известная пользователям программа для восстановления удаленных данных. Работает практически со всеми типами накопителей, в том числе с отформатированными дисками. Автоматически распознает документы разных форматов, изображения, видеофайлы, музыку и т.д. Не требует инсталляции, что хорошо, зато требует денег, что плохо.

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

Триальная версия программы
Триальная версия программы

Поиск начнем с самой приметной строки - "Not registered", которая болтается в главном окне. Поиском по листингу выходим на следующий код:
  1. .text:0047F348                 mov     ecx, dword_87E184
  2. .text:0047F34E                 push    0
  3. .text:0047F350                 call    sub_63BDA0
  4. .text:0047F355                 mov     eax, [esp+248h+var_234]
  5. .text:0047F359                 mov     ecx, dword_87CE38
  6. ; Проверить значение переменной
  7. .text:0047F35F                 cmp     dword ptr [eax+74290h], 0
  8. .text:0047F366                 push    0
  9. .text:0047F368                 push    2
  10. ; Если оно не равно нулю, то вывести надпись о полной версии
  11. .text:0047F36A                 jnz     short loc_47F380
  12. .text:0047F36C                 push    offset aNotRegistered
  13. ; "Not registered"
  14. .text:0047F371                 call    sub_61B9A0
  15. .text:0047F376                 push    1
  16. .text:0047F378                 push    dword_87DDAC
  17. .text:0047F37E                 jmp     short loc_47F392
  18. .text:0047F380 ; ---------------------------------------------
  19. .text:0047F380 loc_47F380:
  20. .text:0047F380                 push    offset aFullVersion
  21. ; "Full Version"
  22. .text:0047F385                 call    sub_61B9A0
  23. .text:0047F38A                 push    1
  24. .text:0047F38C                 push    dword_87DDA8
Отлично, у нас есть адрес переменной и ее сравнение с нулевым значением, по результатам которого выводится или надпись о полной версии, или же о незарегистрированной. Теперь поищем в коде, где и при каких условиях эта переменная инициализируется тем или иным значением. Искать будем по сигнатуре "+74290h],". Помимо проверок значения, обнаружатся несколько участков кода, где после условного перехода переменная инициализируется правильным для нас значением.
  1. .text:00460176                 mov     eax, [edi+69304h]
  2. .text:0046017C                 cmp     eax, 0Ah
  3. ; Проверка
  4. .text:0046017F                 jnz     loc_46034E
  5. .text:00460185                 push    dword_87CE34
  6. .text:0046018B                 mov     ecx, dword_87CE38
  7. .text:00460191                 mov     dword ptr [edi+69300h], 0
  8. ; Программа зарегистрирована
  9. .text:0046019B                 mov     dword ptr [edi+74290h], 1
  10. .text:004601A5                 call    sub_61DE30
  11. .text:004601AA                 call    sub_44A7E0
  12. .text:004601AF                 mov     ecx, edi
  1. .text:0048D508                 mov     dword ptr [ebx+400Ch], 0
  2. ; Проверка
  3. .text:0048D512                 cmp     dword ptr [ebx+69304h], 0Ah
  4. .text:0048D519                 jnz     short loc_48D525
  5. ; Программа зарегистрирована
  6. .text:0048D51B                 mov     dword ptr [ebx+74290h], 1
  7. .text:0048D525 loc_48D525:
  8. .text:0048D525                 cmp     dword ptr [ebx+7180Ch], 0
  1. .text:004A9666                 mov     eax, [edi+69304h]
  2. .text:004A966C                 cmp     eax, 0Ah
  3. ; Проверка
  4. .text:004A966F                 jnz     loc_4A983B
  5. .text:004A9675                 push    dword_87CE34
  6. .text:004A967B                 mov     ecx, dword_87CE38
  7. .text:004A9681                 mov     dword ptr [edi+69300h], 0
  8. ; Программа зарегистрирована
  9. .text:004A968B                 mov     dword ptr [edi+74290h], 1
  10. .text:004A9695                 call    sub_61DE30
  11. .text:004A969A                 call    sub_44A7E0
В принципе, можно было бы перейти на предыдущий уровень проверок и поискать, где проверяемая переменная "+69304h]" инициализируется значением 0Ah, но по объему работы получается примерно то же самое. Так что просто забиваем командами NOP все условные переходы в этих трех фрагментах кода. Теперь при любых раскладах программа должна чувствовать себя зарегистрированной. Сохраняем изменения, запускам, проверяем.

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

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

В процессе ковыряния также было выяснено, что при попытке переименовать исполняемый файл во что-то, отличное от "Recover4all-Professional.exe", программа начинает ругаться и отказывается работать. Похоже, какие-то рудименты с древних времен, когда одну из прошлых версий защиты программы крякеры пробивали с помощью лоадера. Код проверки, мягко говоря, мрачноватый.
  1. .text:0048AA02                 add     esp, 8
  2. .text:0048AA05                 cmp     eax, 1F4h
  3. .text:0048AA0A                 jge     short loc_48AA16
  4. .text:0048AA0C                 xor     edx, edx
  5. .text:0048AA0E                 mov     [ebx+eax*2+184h], dx
  6. .text:0048AA16 loc_48AA16:
  7. .text:0048AA16                 add     ecx, 2
  8. .text:0048AA19                 mov     dword ptr [ebx+71810h], 1
  9. .text:0048AA23                 mov     edx, ecx
  10. .text:0048AA25                 mov     esi, offset aRecover4allP_0
  11. ; "Recover4all-Professional.exe"
  12. .text:0048AA2A                 mov     ebx, 34h
  13. .text:0048AA2F                 nop
  14. .text:0048AA30 loc_48AA30:
  15. .text:0048AA30                 mov     eax, [edx]
  16. .text:0048AA32                 cmp     eax, [esi]
  17. .text:0048AA34                 jnz     short loc_48AA4C
  18. .text:0048AA36                 add     edx, 4
  19. .text:0048AA39                 add     esi, 4
  20. .text:0048AA3C                 sub     ebx, 4
  21. .text:0048AA3F                 jnb     short loc_48AA30
  22. .text:0048AA41                 mov     ebx, [ebp+var_16A0]
  23. .text:0048AA47                 jmp     loc_48AADA
  24. .text:0048AA4C ; ---------------------------------------
  25. .text:0048AA4C loc_48AA4C:
  26. .text:0048AA4C                 mov     edx, ecx
  27. .text:0048AA4E                 mov     esi, offset aRecover4allP_1
  28. ; "RECOVER4ALL-PROFESSIONAL.EXE"
  29. .text:0048AA53                 mov     ebx, 34h
  30. .text:0048AA58 loc_48AA58:
  31. .text:0048AA58                 mov     eax, [edx]
  32. .text:0048AA5A                 cmp     eax, [esi]
  33. .text:0048AA5C                 jnz     short loc_48AA71
  34. .text:0048AA5E                 add     edx, 4
  35. .text:0048AA61                 add     esi, 4
  36. .text:0048AA64                 sub     ebx, 4
  37. .text:0048AA67                 jnb     short loc_48AA58
  38. .text:0048AA69                 mov     ebx, [ebp+var_16A0]
  39. .text:0048AA6F                 jmp     short loc_48AADA
  40. .text:0048AA71 ; ---------------------------------------
  41. .text:0048AA71 loc_48AA71:
  42. .text:0048AA71                 mov     edx, ecx
  43. .text:0048AA73                 mov     esi, offset aRecover4allP_2
  44. ; "Recover4all-Professional.EXE"
  45. .text:0048AA78                 mov     ebx, 34h
  46. .text:0048AA7D                 lea     ecx, [ecx+0]
  47. .text:0048AA80 loc_48AA80:
  48. .text:0048AA80                 mov     eax, [edx]
  49. .text:0048AA82                 cmp     eax, [esi]
  50. .text:0048AA84                 jnz     short loc_48AA99
  51. .text:0048AA86                 add     edx, 4
  52. .text:0048AA89                 add     esi, 4
  53. .text:0048AA8C                 sub     ebx, 4
  54. .text:0048AA8F                 jnb     short loc_48AA80
  55. .text:0048AA91                 mov     ebx, [ebp+var_16A0]
  56. .text:0048AA97                 jmp     short loc_48AADA
  57. .text:0048AA99 ; ---------------------------------------
  58. .text:0048AA99 loc_48AA99:
  59. .text:0048AA99                 mov     edx, offset aRecover4allP_3
  60. ; "RECOVER4ALL-PROFESSIONAL.exe"
  61. .text:0048AA9E                 mov     esi, 34h
  62. .text:0048AAA3 loc_48AAA3:
  63. .text:0048AAA3                 mov     eax, [ecx]
  64. .text:0048AAA5                 cmp     eax, [edx]
  65. .text:0048AAA7                 jnz     short loc_48AABC
  66. .text:0048AAA9                 add     ecx, 4
  67. .text:0048AAAC                 add     edx, 4
  68. .text:0048AAAF                 sub     esi, 4
  69. .text:0048AAB2                 jnb     short loc_48AAA3
  70. .text:0048AAB4                 mov     ebx, [ebp+var_16A0]
  71. .text:0048AABA                 jmp     short loc_48AADA
  72. .text:0048AABC ; --------------------------------------------
  73. .text:0048AABC loc_48AABC:
  74. .text:0048AABC                 push    0               ; int
  75. .text:0048AABE                 push    30h             ; uType
  76. .text:0048AAC0                 push    offset aErrorProgramNa
  77. ; "Error: Program name must be \"Recover4al"...
  78. .text:0048AAC5                 call    sub_4BEC42
  79. .text:0048AACA                 mov     ebx, [ebp+var_16A0]
  80. .text:0048AAD0                 mov     dword ptr [ebx+71810h], 0
  81. .text:0048AADA
То есть вместо единственной регистронезависимой проверки имени файла последовательно выполняются проверки на различные варианты его написания. Причем варианты далеко не все. Похоже, автор программы в эту часть исходника больше не заглядывал с момента его создания. Забиваем NOP'ами последний условный переход по адресу 0048AAA7, сохраняем изменения. Теперь после переименования главного исполняемого файла во что угодно программа работает как ни в чем не бывало. Вот сейчас все поставленные цели окончательно достигнуты. Спасибо автору за нужную и полезную программу.

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

Комментарии

Отзывы посетителей сайта о статье
user (11.08.2023 в 00:31):
Нет, паковать его не получится
и проверку патчить, соответственно, не нужно.

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

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

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

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