Blog. Just Blog

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

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

3StepIcon - простенький редактор для создания иконок из изображений. В принципе, делает то же самое, что и ворованный Photoshop или ворованный AWIcons Pro, даже меньше, так что интерес представляет исключительно в образовательных целях.

Забираем с сайта дистрибутив, устанавливаем. Сразу после запуска появляется триальное окно с предложением активировать программу или сходить в кассу и оплатить эту возможность. Касса пока подождет, попробуем активировать программу произвольными данными:

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

Теперь у нас есть текст сообщения о неправильной регистрации. Это хорошо. Основной файл ничем не упакован, отправляем его на разбор в дизассемблер и поищем строчку, которая выводится при неправильной регистрации.

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

Строчка найдена. Там же рядом находится строка, которая выводится при правильной регистрации. Это тоже может пригодиться. А пока посмотрим в листинге дизассемблера код, который отвечает за вывод обеих строк:
  1. .text:0041CA58                 mov     ecx, [ecx+18h]
  2. .text:0041CA5B                 call    esi ; QLineEdit::text(void)
  3. .text:0041CA5D                 push    ecx
  4. .text:0041CA5E                 mov     ecx, [edi+18h]
  5. .text:0041CA61                 push    esp
  6. .text:0041CA62                 mov     dword ptr [esp+3Ch], 4
  7. .text:0041CA6A                 mov     ecx, [ecx+24h]
  8. .text:0041CA6D                 call    esi ; QLineEdit::text(void)
  9. .text:0041CA6F                 mov     dword ptr [esp+38h], 0FFFFFFFFh
  10. .text:0041CA77                 mov     ecx, [edi+1Ch]
  11. ; Вызвать функцию проверки
  12. .text:0041CA7A                 call    sub_41B2B0
  13. .text:0041CA7F                 mov     esi, ds:?fromAscii_helper@QString
  14. ; Если она вернула AL=0, то введенный серийник неправильный
  15. .text:0041CA85                 test    al, al
  16. .text:0041CA87                 jz      loc_41CB12
  17. ; Вывести сообщение об успешной регистрации
  18. .text:0041CA8D                 push    28h
  19. .text:0041CA8F                 push    offset a3stepiconHasBe
  20. ; "3StepIcon has been activated. Thank you"...
  21. .text:0041CA94                 call    esi
  22. .text:0041CA96                 mov     [esp+1Ch], eax
  23. .text:0041CA9A                 push    0
  24. ...
  25. ...
  26. ...
  27. .text:0041CB0E                 add     esp, 24h
  28. .text:0041CB11                 retn
  29. .text:0041CB12 ; -------------------------------
  30. .text:0041CB12 loc_41CB12:
  31. ; Вывести сообщение о неуспешной регистрации
  32. .text:0041CB12                 push    5Eh
  33. .text:0041CB14                 push    offset aTheEmailAndLic
  34. ; "The email and license key you entered a"...
  35. .text:0041CB19                 call    esi
  36. .text:0041CB1B                 mov     [esp+28h], eax
  37. .text:0041CB1F                 push    0
  38. .text:0041CB21                 push    offset unk_425DCE
  39. .text:0041CB26                 mov     dword ptr [esp+40h], 7
У нас есть некая функция проверки и ее результат, в зависимости от которого выполняется или не выполняется условный переход. Тут нам делать больше нечего, идем в функцию проверки. Она, в свою очередь, тоже подвязана на одной единственной проверке, после которой или сохраняются введенные регистрационные данные, или выполняется выход с AL=0.
  1. .text:0041B2FC                 mov     ecx, esp
  2. .text:0041B2FE                 push    eax
  3. .text:0041B2FF                 call    ds:??0QString@@QAE@ABV0@@Z
  4. .text:0041B305                 mov     ecx, esi
  5. ; Вызывать функцию проверки
  6. .text:0041B307                 call    sub_41B440
  7. .text:0041B30C                 test    al, al
  8. ; AL=0 - вернуться из функции с ошибкой регистрации
  9. .text:0041B30E                 jz      loc_41B400
  10. .text:0041B314                 push    0
  11. .text:0041B316                 lea     ecx, [esp+38h+var_24]
  12. .text:0041B31A                 mov     byte ptr [esi+4], 1
Лезем глубже. Теперь нам надо посмотреть функцию проверки, от которой зависит результат предыдущей функции проверки. Ах, да, забыл упомянуть, программа написана на Qt, поэтому готовьтесь к "указателям на указатели на указатели", к "результатам функции проверки результатов функции проверки" и т.п. Мне тоже подобные обороты кажутся дикими, но ничего не поделать.

Последняя функция проверки начинается с побайтовых преобразований строк, затем идет блок математики на SSE-регистрах и строковые операции.
  1. .text:0041B6DA                 call    ds:?toLower@QString@@QBE?AV1@XZ
  2. .text:0041B6E0                 push    eax
  3. .text:0041B6E1                 lea     ecx, [esp+94h+var_78]
  4. .text:0041B6E5                 call    ds:??4QString@@QAEAAV0@$$QAV0@@Z
  5. .text:0041B6EB                 lea     ecx, [esp+90h+var_7C]
  6. .text:0041B6EF                 call    ds:??1QString@@QAE@XZ
  7. .text:0041B6F5                 lea     eax, [esp+90h+var_78]
  8. .text:0041B6F9                 push    eax
  9. .text:0041B6FA                 lea     eax, [esp+94h+var_78+0Ch]
  10. .text:0041B6FE                 push    eax
  11. ; Сравнение двух строк
  12. .text:0041B6FF                 call    ds:??8@YA_NABVQString@@0@Z
  13. ; operator==(QString const &,QString const &)
  14. .text:0041B705                 add     esp, 8
  15. .text:0041B708                 mov     byte ptr [esp+90h+var_4], 2
  16. .text:0041B710                 lea     ecx, [esp+90h+var_78]
  17. .text:0041B714                 mov     bl, al
  18. .text:0041B716                 call    ds:??1QString@@QAE@XZ
  19. .text:0041B71C                 lea     ecx, [esp+90h+var_78+0Ch]
  20. .text:0041B720                 mov     byte ptr [esp+90h+var_4], 1
  21. .text:0041B728                 call    ds:??1QString@@QAE@XZ
  22. .text:0041B72E                 lea     ecx, [esp+90h+arg_0]
  23. .text:0041B735                 mov     byte ptr [esp+90h+var_4], 0
  24. .text:0041B73D                 call    ds:??1QString@@QAE@XZ
  25. .text:0041B743                 lea     ecx, [esp+90h+arg_4]
  26. .text:0041B74A                 mov     [esp+90h+var_4], 0FFFFFFFFh
  27. .text:0041B755                 call    ds:??1QString@@QAE@XZ
  28. .text:0041B75B                 mov     al, bl
  29. .text:0041B75D                 mov     ecx, [esp+90h+var_C]
  30. .text:0041B764                 mov     large fs:0, ecx
  31. .text:0041B76B                 pop     ecx
А заканчивается вся эта свистопляска (ТАДАМ!!!!) обычным сравнением строк. И результат этого сравнения уже является итоговым для принятия решения о корректной или некорректной регистрации. Отправляем программу в отладчик, ставим точку останова по адресу 0041B6FF, повторяем процесс регистрации с левыми данными. Когда сработает точка останова, на стеке будут находиться два указателя на указатели на сравниваемые строки. Посмотрим, что там такое.

Первая строка
Первая строка

Вторая строка
Вторая строка

Вот, по одному из указателей у нас находится введенный левый серийник, а по второму - юникодная строка "5e2ded618e0d3e498b0b". Несложно догадаться, что это и есть правильный серийный номер для введенного регистрационного имени. Итого у нас есть регистрационное имя "manhunter@pcl" и вычисленный для него серийник. Выходим из отладчика, повторяем регистрацию, но на этот раз с правильными данными. Программа благодарит за успешную активацию. Да всегда пожалуйста, нам не жалко, обращайтесь еще.

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

Для верности перезапускаем программу. Триальное окно при старте пропало, при повторной попытке активации программа сообщает, что уже активирована. Цель достигнута.

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

Комментарии

Отзывы посетителей сайта о статье
ManHunter (20.02.2018 в 07:12):
ЦитатаЧто касается строк, позволяет ли хиев найти их ВСЕ и сохранить в файл со смещениями, как это умеет делать 010 Editor скриптом DumpStrings?

Конечно умеет, и даже без скриптов. Alt+F6 - найти все строки. Затем F10 - сохранить в файл с адресами строк.
brute (20.02.2018 в 05:30):
я пойду другим путём. Не показывает мой хиев столбцы текста или показывает в ascii (лень искать клавишу переключения). Не нравится это консольное окно на физиологическом уровне: его маленький размер, отсутствие нормального диалога открытия файла, поиска юникодных строк (да, там есть какая-то хитрая комбинация клавиш, но почему бы не сделать ещё одно поле ввода или чекбокс?, отсутствие нормально мануала и примеров использования хотя бы на сайте (также тишина в инете, похоже, очень мало его используют). Если бы было обычное виндовое, то, возможно, даже купил хиев. Уж за столько лет можно было его сделать?). Не нравится "закрытость" программы - рассылка только лично в руки, полных версий не найти даже пятилетней давности. Ради популяризации и увеличения продаж, имхо,  просто необходимо выкладывать старые полные версии. Какой-то священный незаменимый грааль.. Что касается строк, позволяет ли хиев найти их ВСЕ и сохранить в файл со смещениями, как это умеет делать 010 Editor скриптом DumpStrings?
ManHunter (18.02.2018 в 10:31):
brute, не дофига ли движений, чтобы просто взять и найти строчку? IDR, map, PE Explorer, плагины какие-то. Зачем это все? Только чтобы принципиально не использовать HIEW? Ну да пожалуйста, не используй, никто же не принуждает. А я буду работать в привычном мне окружении с привычными мне инструментами.

ЦитатаНе распознала "License Key"? Эта строка чем-то отличается от остальных.

Как бы это сказать помягче... Меня мало волнует, отличатся ли эта строка от других, не отличается ли, распознает IDA ее "из коробки" или придется шаманить с плагинами, я ПРОСТО ХОЧУ НАЙТИ СТРОКУ. HiEW позволяет мне это сделать со 100% (прописью: стопроцентной) гарантией всего лишь за несколько секунд. И меня это устраивает. Поэтому я буду ей пользоваться дальше.
brute (18.02.2018 в 09:40):
"комментарии излишни". Хотелось бы их услышать, что не так с Идой? Не распознала "License Key"? Эта строка чем-то отличается от остальных. Мне помог плагин "Cyrillic.plw" (без него действительно Ида эту строку не видела) и поиск по юникоду. Ещё лучше открыть в IDR, создать map и импортировать его в Иду. Порадовал PE Explorer..
http://i.prntscr.com/Jz7v59MrS...Soz0aWSQ.png
http://i.prntscr.com/302hVTHyQ...8ftB9NDQ.png
http://i.prntscr.com/FyZUSf8jT...vu-rTziw.png
http://i.prntscr.com/bae_Jlq0Q...5cwhsYVw.png
http://i.prntscr.com/TPq1MoL6R...6eerDzSQ.png
http://i.prntscr.com/3ee9UqokT...BaKRyzJQ.png
http://i.prntscr.com/wrdm-IfKR...qWsqrrjg.png
http://i.prntscr.com/qnv1q86IR...TRpsqOSw.png
voffka (05.02.2018 в 18:47):
Ну я допустим к IDA прибегаю в последний момент, когда нужно найти какую-то строчку непонятно как вызываемую, тут у нее мозгов побольше в плане анализа. hiew+IDA пользовался несколько раз сугубо для патча x64, пока не изобрели x64_dbg. Мессаджи привык "ловить" в ольке через Alt+F9->Call Back.
В общем реверсинг у всех разный.
ManHunter (02.02.2018 в 11:06):
Чтобы не быть голословным. Никаких постановок, абсолютно реальная ситуация на абсолютно реальном софте. Вот картинка из IDA:
http://i103.fastpic.ru/big/201...147b76b2.png
И это же место в файле в HiEW:
http://i99.fastpic.ru/big/2018...b2c41582.png
Комментарии, как говорится, излишни.
ManHunter (30.01.2018 в 21:30):
voffka, и все бы ничего, но слишком часто IDA ошибается в определении строк, подставляя вместо них, например, адреса. Это же касается и строк в юникоде. Hiew всегда ищет именно строку, без всякой самодеятельности. Искать строчки в отладчике тоже еще то удовольствие. Так что оставь людям привычный набор инструментов и последовательность действий с ними.
voffka (30.01.2018 в 21:17):
xussr, Категорически не согласен!
Hiew - ищем строку, нафига?
IDA - Shift+F12, Hiew  уже не нужен
ollydbg1.10 - ПКМ - Search for ...
xussr (29.01.2018 в 21:40):
IDA рулит Hiew тоже спасибо за пример!
Arttomov (27.01.2018 в 21:15):
ManHunter,друг посещая Ваш блог решил освоить Hiew.Но как часто у нас бывает
найти подробный GUID как пользоваться проблематично.Если Вас не затруднит добавьте несколько статей,как освоить Hiew.
Успехов Вам.
voffka (27.01.2018 в 14:30):
Новиков, Синий скриншот это hiew, Code (Assembler) - листинг от IDA, скриншот с ключем ollydbg.
Первые 2 программы сугубо на любителя и в исследовании данной программы абсолютно не нужны.
ManHunter (26.01.2018 в 22:24):
IDA
Новиков (26.01.2018 в 22:20):
А чем дизассемблируете? Извиняюсь, если уже спрашивали, я просто новенький)

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

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

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