Blog. Just Blog

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

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

Программа JPGToPDF предназначена для создания PDF-файла из отдельных изображений. Представляет собой полный набор антипаттернов для софта: ставится в корень диска C:\, использует попугайские скины, хранит регистрацию в фейковой dll в системной папке, на любой чих открывает свой сайт и всякое такое. Но, при всем этом, со своей основной задачей справляется неплохо. А с регистрацией сейчас быстренько разрулим, потому что в триальном режиме создаваемые файлы портятся вставкой мусорных страниц.

Забираем с сайта дистрибутив, устанавливаем. Главный исполняемый файл написан на бейсике и ничем не упакован, отправляем его на разбор в дизассемблер. Кода там совсем немного, весь процесс займет буквально несколько секунд. Теперь давайте попробуем зарегистрировать программу какими-нибудь левыми данными.

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

У нас есть текст сообщения, который выводится при неправильной регистрации. Поищем его в файле. Найдется единственная юникодная строка:

Строка сообщения в файле
Строка сообщения в файле

Чуть ниже по тексту лежит ответочка от аффтара. Ну-ну, посмотрим. Перефразируя известную поговорку, "Не говори фак, пока не перепрыгнешь".

Строка сообщения в файле
Строка сообщения в файле

Вернемся в дизассемблерный листинг и посмотрим, где и как используется строка о неправильной регистрации. Будет найден вот такой кусочек кода:
  1. .text:0052BFD0                 push    ecx
  2. .text:0052BFD1                 lea     edx, [ebp-90h]
  3. .text:0052BFD7                 push    edx
  4. ; Перевести строку в верхний регистр
  5. .text:0052BFD8                 call    ds:rtcUpperCaseVar
  6. .text:0052BFDE                 lea     eax, [ebp-70h]
  7. .text:0052BFE1                 push    eax
  8. .text:0052BFE2                 lea     ecx, [ebp-90h]
  9. .text:0052BFE8                 push    ecx
  10. ; Сравнить две строки
  11. .text:0052BFE9                 call    ds:__vbaVarTstEq
  12. ; Сохранить результат проверки
  13. .text:0052BFEF                 mov     [ebp-0E4h], ax
  14. .text:0052BFF6                 lea     edx, [ebp-90h]
  15. .text:0052BFFC                 push    edx
  16. .text:0052BFFD                 lea     eax, [ebp-70h]
  17. .text:0052C000                 push    eax
  18. .text:0052C001                 lea     ecx, [ebp-80h]
  19. .text:0052C004                 push    ecx
  20. .text:0052C005                 push    3
  21. .text:0052C007                 call    ds:__vbaFreeVarList
  22. .text:0052C00D                 add     esp, 10h
  23. ; Загрузить результат проверки
  24. .text:0052C010                 movsx   edx, word ptr [ebp-0E4h]
  25. .text:0052C017                 test    edx, edx
  26. ; Если строки ранее не совпали, то 
  27. .text:0052C019                 jz      loc_52C17F
  28. .text:0052C01F                 mov     dword ptr [ebp-4], 9
  29. .text:0052C026                 mov     dword ptr [ebp-98h], 80020004h
  30. .text:0052C030                 mov     dword ptr [ebp-0A0h], 0Ah
  31. .text:0052C03A                 mov     dword ptr [ebp-88h], 80020004h
  32. .text:0052C044                 mov     dword ptr [ebp-90h], 0Ah
  33. .text:0052C04E                 mov     dword ptr [ebp-0B8h], offset aInvaild
  34. ; "Invaild"
  35. .text:0052C058                 mov     dword ptr [ebp-0C0h], 8
  36. .text:0052C062                 lea     edx, [ebp-0C0h]
  37. .text:0052C068                 lea     ecx, [ebp-80h]
  38. .text:0052C06B                 call    ds:__vbaVarDup
  39. .text:0052C071                 mov     dword ptr [ebp-0A8h], offset aInvaildSeri
  40. ; "Invaild Serial Code."
  41. .text:0052C07B                 mov     dword ptr [ebp-0B0h], 8
  42. .text:0052C085                 lea     edx, [ebp-0B0h]
  43. .text:0052C08B                 lea     ecx, [ebp-70h]
Раз выполняются сравнения строк, значит надо посмотреть, что и с чем сравнивается. Отправляем программу в отладчик, ставим точку останова на функции сравнения строк по адресу 0052BFE9. Запускаем программу на выполнение. После нескольких сотен или тысяч брошенных исключений наконец появится окно программы, где можно повторить регистрацию с левыми данными. Когда сработает точка останова, на стеке будут находиться следующие указатели на строки:

Указатели на строки в стеке
Указатели на строки в стеке

Это введенный неправильный серийник и юникодная строка 8HRDUOG0WV8Q963, с которой он сравнивается. Кстати, она прописана в файле и не меняется, то есть для регистрации используется один единственный серийный номер. Закрываем отладчик, запускаем программу и повторяем регистрацию с найденным серийником.

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

Программа сперва сообщает, что серийный номер неправильный, но следующим сообщением благодарит за регистрацию и просит перезапуститься. Не проблема, перезапускаем. Кнопка регистрации пропала, при сохранении PDF-файлы не портятся. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
Noobie (26.09.2019 в 11:19):
Гм, прога от того же разработчика, что и куча подобных поделок. Давно было установлено, что никакие серийники, патчи и прочие умственные усилия не нужны. Достаточно добавить в самый конец текстового файла фейковой дллки (в данном случае это jpsound.dll) две буквы kk и желаемая рега будет достигнута.
voffka (24.09.2019 в 13:56):
Про mov eax,1 тут столько статей, что зная где проверяется серийник, найти куда влепить mov eax,1 особого труда не составит.
Метод mov eax,1 нравится сектантам из церкви пришествия первого портабля. Серийник всегда интереснее.
ManHunter (23.09.2019 в 22:49):
Вас, блин, граждане, не поймешь. Топишь за mov eax,1 - сразу "а где алгоритм генерации серийника??!111одинодин", выкладывешь как добыть серийник - "так проще mov eax,1". Ну елы-палы.
Vnv (23.09.2019 в 19:20):
xussr,
А по мне, так лучше как можно меньше вмешиваться в приложение. Лодырь для нахождения серийника или кейген намного лучше, чем патч.
xussr (23.09.2019 в 18:29):
По мне так проще пропатчить начало процедуры командой xor eax,eax и ret  для чего столько много писать про серийники )))!!!

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

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

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