Blog. Just Blog

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

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

Photos for Grandma - простенькая программа для пакетного изменения размера фотографий и последующей отправки их на указанный почтовый адрес. Как следует из названия, программа предназначена для отправки ваших семейных фото на деревню бабушке, которая до сих пор серфит на диалапе или жопорезе и не может сливать себе на хард тяжелые аттачи к мылу.

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

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

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

Диалоговое окно в ресурсах
Диалоговое окно в ресурсах

Окно найдено в ресурсах под номером 151, или 97h в шестнадцатеричной системе счисления. Поищем это значение в листинге дизассемблера. Будет найдено несколько участков кода, где используется это значение, поэтому точное место срабатывания отлавливается под отладчиком. Устанавливаем брейкпоинты на найденные по очереди куски кода, и после недолгой трассировки будет найдено точное место появления окна с сообщением об ошибочной регистрации:
  1. .text:00427FA4                 push    0
  2. ; Индекс диалогового окна в ресурсах
  3. .text:00427FA6                 push    97h
  4. .text:00427FAB                 lea     ecx, [esp+54h]
  5. ; Вывести диалоговое окно
  6. .text:00427FAF                 call    sub_440310
Теперь посмотрим место, откуда выполняется переход на этот код:
  1. ; Вызвать какую-то функцию проверки
  2. .text:00427DD5                 call    sub_4265E0
  3. ; Если она вернула AL=0, то введенный код неправильный
  4. .text:00427DDA                 test    al, al
  5. .text:00427DDC                 jz      loc_427FA4
Тоже все понятно. Вызывается функция проверки, по ее результату принимается решение о зарегистрированности программы. Минутное решение - патч MOV AL,1; RET 4 по адресу 004265E0. Обратите внимание на выравнивание стека. После патча программа с радостью примет любой серийник и будет считать его правильным.

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

Быстро, надежно, но опять же неспортивно. Попробуем разобрать алгоритм генерации серийного номера, тем более, что его формат мы уже знаем. Запускаем программу под отладчиком, ставим точку останова на начало функции проверки 004265E0, регистрируем программу с каким-нибудь левым ключом, но с соблюдением формата - три группы по 5 символов.
  1. .text:004265E0                 push    0FFFFFFFFh
  2. .text:004265E2                 push    offset loc_6262F8
  3. .text:004265E7                 mov     eax, large fs:0
  4. .text:004265ED                 push    eax
  5. .text:004265EE                 sub     esp, 8
  6. .text:004265F1                 push    ebx
  7. .text:004265F2                 push    ebp
  8. .text:004265F3                 push    esi
  9. .text:004265F4                 push    edi
  10. ; Здесь начинается проверка соответствия серийника нужному формату
  11. ; Ее можно пропустить, ведь его длину и формат мы уже знаем
  12. .text:004265F5                 mov     eax, dword_749D2C
  13. ...
  14. ...
  15. ...
  16. .text:00426700                 jnz     loc_426820
  17. ...
  18. ; Пропускаем аж до этого места
  19. ...
  20. .text:00426726                 mov     eax, [esp+28h+EndPtr]
  21. .text:0042672A                 add     eax, 6
  22. .text:0042672D                 mov     edx, eax
  23. .text:0042672F                 nop
  24. .text:00426730 loc_426730:
  25. .text:00426730                 mov     cx, [eax]
  26. .text:00426733                 add     eax, 2
  27. .text:00426736                 test    cx, cx
  28. .text:00426739                 jnz     short loc_426730
  29. .text:0042673B                 mov     edi, ebx
  30. .text:0042673D                 sub     eax, edx
  31. .text:0042673F                 add     edi, 0FFFFFFFEh
  32. .text:00426742 loc_426742:
  33. .text:00426742                 mov     cx, [edi+2]
  34. .text:00426746                 add     edi, 2
  35. .text:00426749                 test    cx, cx
  36. .text:0042674C                 jnz     short loc_426742
  37. .text:0042674E                 mov     ecx, eax
  38. .text:00426750                 shr     ecx, 2
  39. .text:00426753                 mov     esi, edx
  40. .text:00426755                 rep movsd
  41. .text:00426757                 push    10h             ; Radix
  42. .text:00426759                 lea     edx, [esp+2Ch+EndPtr]
  43. .text:0042675D                 mov     ecx, eax
  44. .text:0042675F                 push    edx             ; EndPtr
  45. .text:00426760                 and     ecx, 3
  46. .text:00426763                 add     ebp, 2
  47. .text:00426766                 push    ebp             ; Str
  48. .text:00426767                 rep movsb
  49. ; Вторая группа символов серийника преобразуется в шестнадцатеричное число
  50. .text:00426769                 call    _wcstoul
  51. .text:0042676E                 mov     edi, [esp+34h+var_10]
  52. .text:00426772                 push    10h             ; Radix
  53. .text:00426774                 mov     esi, eax
  54. ; Полученное число умножается на константу 64h
  55. .text:00426776                 imul    esi, [edi+74h]
  56. .text:0042677A                 push    0               ; EndPtr
  57. .text:0042677C                 push    ebx             ; Str
  58. ; В число преобразуется строка, состоящая из первой группы символов и
  59. ; последних трех символов третьей группы серийного номера
  60. .text:0042677D                 call    _wcstoul
  61. ; Полученное число складывается с константой 25B431EEh
  62. .text:00426782                 add     eax, [edi+7Ch]
  63. .text:00426785                 xor     ecx, ecx
  64. ; Затем результат сложения умножается на константу 28h
  65. .text:00426787                 imul    eax, [edi+78h]
  66. .text:0042678B                 add     esp, 18h
  67. ; Результат сравнивается с результатом умножения первой группы символов
  68. .text:0042678E                 cmp     esi, eax
  69. .text:00426790                 mov     eax, [esp+28h+Str]
  70. .text:00426794                 setz    cl
  71. ; Дальше уже не интересно, можно пропустить
  72. .text:00426797                 test    eax, eax
  73. ...
Итого, что мы имеем. Серийный номер имеет три группы по 5 символов, разделенных черточкой. Например, "12345-67890-ABCDE". Первая группа символов преобразуется в шестнадцатеричное число и умножается на число 64h, получаем первое контрольное число. Затем из второй группы символов и трех последних символов третьей группы составляется строка, в этом примере получится "67890CDE". Полученная строка также преобразуется в шестнадцатеричное число, складывается с числом 25B431EEh и умножается на число 28h. Если полученный результат равен первому контрольному числу, то серийный номер правильный. Оставшиеся два символа третьей группы могут быть произвольными. Валидный серийник можно без труда подобрать простейшим брутфорсом, например, вот такой: DA54E-3A41A-1B853. Проверим его. Первое контрольное число: 3A41Ah * 64h = 016C1A28h. Вторая проверка: (DA54E853h + 25B431EEh) * 28h = 016C1A28h. Все совпало, серийный номер правильный. Регистрационное имя нигде не проверяется и может быть любым. Попробуем зарегистрировать программу с найденным серийником:

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

Вот теперь программа зарегистрирована по-настоящему. Таким нехитрым способом вы сэкономили немного денег на установку любимой бабушке нормального спутникового интернета.

Поделиться ссылкой ВКонтакте Поделиться ссылкой на Facebook Поделиться ссылкой на LiveJournal Поделиться ссылкой в Мой Круг Добавить в Мой мир Добавить на ЛиРу (Liveinternet) Добавить в закладки Memori Добавить в закладки Google
Просмотров: 3488 | Комментариев: 5

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (06.07.2013 в 18:51):
RETN - just return from function or procedure etc.
RETN [number] - return and remove [number] bytes from stack

for example:

  push eax     ; store some data (DWORD) to stack
  call loc_1

first case:

loc_1:
  ; do something...
  ret          ; return and do not change data on stack

or second case:

loc_1:
  ; do something...
  ret 4        ; return and remove one stored DWORD from stack
joe (06.07.2013 в 18:39):
Manhunter i got one question (maybe is stupid): tell me what mean instruction retn, retn 4 or retn 10?Thanks
ivann (01.11.2012 в 14:02):
Соглашусь: русские авторы злопамятны и жадны :-)
Еще раз спасибо!
ManHunter (01.11.2012 в 12:03):
Как говорится, будет день - будет пища. Отечественных аффтаров я стараюсь не трогать, а зарубежные тут не ходят. И я не трогаю всяких ссученных, которые исходят на говно после каждого релиза их поделий. Весь софт из моих статей уже десятки раз сломан разными крякерскими командами и выложен по всему интернету, и авторам на это пофиг. Так что пока все нормально, все остальные проблемы будем решать по мере их поступления. Тем более, что это не инструкция по взлому, а указание разрабам на слабые места в их защите. Я даже готов безвозмездно оказать им помощь, если кто-нибудь из них вдруг захочет что-то в ней доработать.
ivann (01.11.2012 в 11:59):
Забота о бабушках, что может быть добрее.
Спасибо, МанХантер за еще одну интересную статью. Здоровья тебе и вдохновения. В каждой статье частичка души, и как минимум полкило знаний))

Без лирики. Волнует вопрос. При установке программ на СВТ авторы пишут, что копаться в коде, дизассемблировать, реверсировать и проч проч -- низзя, мы даже аццепт нажимеам или ставим галочку аггри. Ведь в твоих статьях готовые рецепты "как это ломать". Так могут и прессануть, наверное, особенно если нет знакомых полицейских.
Кроме угроз авторов были ли наезды "другими людьми"?
Подозреваю, что новый закон о запрете запретного контента в РФ расширится... В недалеком будущем.

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

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

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