Blog. Just Blog

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

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

Программа PhotoRestorer предназначена для восстановления удаленных фотографий с цифровых носителей: SD-карт разных форматов, цифровых рамок, внутренней памяти фотоаппаратов и т.п. PhotoRestorer сканирует носитель на предмет наличия удаленных JPEG-файлов, показывает их в виде превьюшек, а затем предлагает сохранить восстановленные полноразмерные файлы на жесткий диск. В незарегистрированном режиме сохраняемые фотографии уменьшаются в 10 раз, что сводит полезность программы к нулю. А вот если к нулю свести стоимость программы, то по закону сохранения вареза, ее практическая ценность сразу увеличится до бесконечности. Этим мы сейчас и займемся.

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

Окно регистрации программы
Окно регистрации программы

Если посмотреть на содержимое папки с установленной программой, то станет ясно, что она поддерживает несколько языков, в том числе и русский. В языковом файле Languages\Russian.lng обнаруживается вот такой блок с текстовыми строками:

[Trial]
Message1=Эта программа не зарегистрирована!
Message2=Размер изображений будет как 1:10.
Message3=Приобрести PhotoRestorer!
Message4=Ввод лицензионого ключа
Message5=Пожалуйста введите регистрационную информацию ниже
Message6=посетите сайт
Message7=Вы должны набрать ваше имя!
Message8=Вы должны набрать ваш ключ!
Message9=Спасибо за регистрацию!
Message10=Неверная регистрационная информация!
Message11=Пожалуйста попытайтесь снова!
Name=Ваше имя
Key=Лицензионный ключ
Licensed=Зарегистрированно на:

Нас интересует следующее: "Trial" - название секции языкового файла, из которого загружаются строки, и пара "Message9" и "Message10" с сообщениями о правильной и неправильной регистрации. Нам надо найти в файле место, где рядом одновременно задействуются первая и любая из вторых строк. Надеюсь, что ко второй сотне статей мне уже не стоит упоминать, что сразу после установки надо отправить главный исполняемый файл в дизассемблер? Итак, поиском в дизассемблере обнаруживается следующий фрагмент кода:
  1. CODE:00475457                 mov     eax, ds:off_47EBB4
  2. CODE:0047545C                 mov     eax, [eax]
  3. CODE:0047545E                 push    eax
  4. CODE:0047545F                 mov     ecx, offset aUsername_0
  5. ; "UserName"
  6. CODE:00475464                 mov     edx, offset aSoftwareNtec_0
  7. ; "SOFTWARE\\NTechnologies\\PhotoRestorer"
  8. CODE:00475469                 mov     eax, 80000001h
  9. CODE:0047546E                 call    sub_473810
  10. CODE:00475473                 mov     eax, ds:off_47E8DC
  11. CODE:00475478                 mov     eax, [eax]
  12. CODE:0047547A                 push    eax
  13. CODE:0047547B                 mov     edx, offset aSoftwareNtec_0
  14. ; "SOFTWARE\\NTechnologies\\PhotoRestorer"
  15. CODE:00475480                 mov     ecx, offset aLicensekey_0
  16. ; "LicenseKey"
  17. CODE:00475485                 mov     eax, 80000001h
  18. CODE:0047548A                 call    sub_473810
  19. CODE:0047548F                 call    sub_473D1C
  20. ; Сохранить байт в ячейку памяти, затем сравнить его с нулем
  21. CODE:00475494                 mov     edx, ds:off_47EC94
  22. CODE:0047549A                 mov     [edx], al
  23. CODE:0047549C                 mov     eax, ds:off_47EC94
  24. CODE:004754A1                 cmp     byte ptr [eax], 0
  25. ; Если ноль, то регистрация не прошла
  26. CODE:004754A4                 jz      short loc_4754F8
  27. CODE:004754A6                 mov     eax, ebx
  28. ; Сообщение об успешной регистрации
  29. CODE:004754A8                 call    sub_457014
  30. CODE:004754AD                 push    offset aThankYouForReg
  31. ; "Thank you for registration!"
  32. CODE:004754B2                 lea     eax, [ebp+var_2C]
  33. CODE:004754B5                 push    eax
  34. CODE:004754B6                 mov     eax, ds:off_47ECCC
  35. CODE:004754BB                 mov     eax, [eax]
  36. CODE:004754BD                 mov     ecx, offset aMessage9 ; "Message9"
  37. CODE:004754C2                 mov     edx, offset aTrial_0 ; "Trial"
  38. CODE:004754C7                 mov     esi, [eax]
  39. CODE:004754C9                 call    dword ptr [esi]
  40. CODE:004754CB                 mov     edx, [ebp+var_2C]
  41. CODE:004754CE                 mov     eax, ds:off_47ECA8
  42. CODE:004754D3                 mov     eax, [eax]
  43. CODE:004754D5                 mov     eax, [eax+300h]
  44. CODE:004754DB                 call    sub_43AC84
  45. CODE:004754E0                 mov     eax, ds:off_47ECA8
  46. CODE:004754E5                 mov     eax, [eax]
  47. CODE:004754E7                 mov     edx, [eax]
  48. CODE:004754E9                 call    dword ptr [edx+0ECh]
  49. CODE:004754EF                 mov     eax, ebx
  50. CODE:004754F1                 call    sub_456E74
  51. CODE:004754F6                 jmp     short loc_475570
  52. CODE:004754F8 ; ------------------------------
  53. CODE:004754F8 loc_4754F8:
  54. ; Сообщение о неправильной регистрации
  55. CODE:004754F8                 push    offset aIncorrectRegis
  56. ; "Incorrect registration info!"
  57. CODE:004754FD                 lea     eax, [ebp+var_34]
  58. CODE:00475500                 push    eax
  59. CODE:00475501                 mov     eax, ds:off_47ECCC
  60. CODE:00475506                 mov     eax, [eax]
  61. CODE:00475508                 mov     ecx, offset aMessage10 ; "Message10"
  62. CODE:0047550D                 mov     edx, offset aTrial_0 ; "Trial"
  63. CODE:00475512                 mov     ebx, [eax]
  64. CODE:00475514                 call    dword ptr [ebx]
  65. CODE:00475516                 push    [ebp+var_34]
  66. CODE:00475519                 push    offset dword_475730
Как раз то, что нам надо. Из реестра читаются значения ключей с характерными именами - "UserName" и "LicenseKey", затем выполняются какие-то функции проверки, после чего загружаются строки из языковых файлов и выводится сообщение о правильной или неправильной регистрации. Четыре строчки чудесатых чудес по адресу 00475494 я оставлю на совести компилятора. А вот по адресу 0047548F вызывается функция проверки, которую стоит изучить более внимательно.
  1. ; Прочитать регистрационные данные из реестра
  2. CODE:00473D32                 lea     eax, [ebp+var_4]
  3. CODE:00473D35                 push    eax
  4. CODE:00473D36                 mov     ecx, offset aUsername ; "UserName"
  5. CODE:00473D3B                 mov     edx, offset aSoftwareNtechn
  6. ; "SOFTWARE\\NTechnologies\\PhotoRestorer"
  7. CODE:00473D40                 mov     eax, 80000001h
  8. CODE:00473D45                 call    sub_473744
  9. CODE:00473D4A                 mov     edx, [ebp+var_4]
  10. CODE:00473D4D                 mov     eax, offset unk_47FBF0
  11. CODE:00473D52                 call    sub_404488
  12. CODE:00473D57                 lea     eax, [ebp+var_8]
  13. CODE:00473D5A                 push    eax
  14. CODE:00473D5B                 mov     edx, offset aSoftwareNtechn
  15. ; "SOFTWARE\\NTechnologies\\PhotoRestorer"
  16. CODE:00473D60                 mov     ecx, offset aLicensekey ; "LicenseKey"
  17. CODE:00473D65                 mov     eax, 80000001h
  18. CODE:00473D6A                 call    sub_473744
  19. CODE:00473D6F                 mov     edx, [ebp+var_8]
  20. CODE:00473D72                 mov     eax, offset dword_47FBF4
  21. CODE:00473D77                 call    sub_404488
  22. ; Строка серийного номера
  23. CODE:00473D7C                 mov     edx, ds:dword_47FBF4
  24. ; Искомая подстрока "17A2"
  25. CODE:00473D82                 mov     eax, offset a17a2 ; "17A2"
  26. CODE:00473D87                 call    sub_404A48
  27. CODE:00473D8C                 test    eax, eax
  28. ; Подстрока найдена?
  29. CODE:00473D8E                 jle     short loc_473D94
  30. ; Введенный серийник правильный
  31. CODE:00473D90                 mov     bl, 1
  32. CODE:00473D92                 jmp     short loc_473D96
  33. CODE:00473D94 ; --------------------------------------
  34. CODE:00473D94 loc_473D94:
  35. ; Введенный серийник неправильный
  36. CODE:00473D94                 xor     ebx, ebx
  37. CODE:00473D96 loc_473D96:
  38. CODE:00473D96                 xor     eax, eax
  39. CODE:00473D98                 pop     edx
  40. CODE:00473D99                 pop     ecx
А тут все гораздо интереснее. Все так же из реестра считываются строки с регистрационным именем и серийным номером, а затем выполняется какая-то манипуляция со строкой "17A2". Если прошерстить этой участок кода под отладчиком, то получится, что берется строка серийного номера, а затем в ней ищется вхождение подстроки "17A2". Если она найдена, то серийник считается правильным. И это единственное условие, достаточное для получения валидного серийного номера! То есть совершенно правильный серийник может быть, например, "FUCK-SHAREWARE-17A2", а регистрационное имя вообще любое. Проверяем:

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

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

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

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

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

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

Комментарии

Отзывы посетителей сайта о статье
user (20.09.2015 в 10:05):
У этой бригады вообще весь софт производит странное впечатление.
Проверил, как работает их NTFileRestore - восстанавливает мало файлов, в "восстановленных" файлах грязь.
Доверия не внушает короче.

Эти прожки (PhotoRestorer и ImageSign) ,похоже, только и работают более-менее.
В общем, пацаны пришли к успеху.
brute (20.09.2015 в 06:38):
прога в оле не отлаживается (у меня) - в начале стоят мьютексы и брекпойнты вываливают исключения. Можно только сразу патчить и смотреть результат. Вообще, об эту школьную поделку даже мышку пачкать не хочется - не хватает этой проге только протектора и цены в сотню баксов.. Не стоит она 2000р, бесплатных универсальных undelete'ров полно!
user (18.09.2015 в 21:34):
Там ещё намекают, что обязательно надо скачать программу IMAGESIGN.
Пришлось скачать...
Обе программы патчатся поиском и заменой байтов:
OLD: 85,C0,7E,04,B3,01,EB
NEW: 85,C0,7E,00,B3,01,EB

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

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

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