Blog. Just Blog

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

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

Billion Chords - самая крупная база аккордов, содержащая тысячи различных аккордов и их вариантов. Вы можете составить любой аккорд, а главное, что вы сразу же можете прослушать выбранный аккорд. За все это добро автор просит около 15 вечнозеленых, но, по всей видимости, он уже давно забил на проект. Ссылка на закачку на сайте не работает, форму оплаты и покупки я даже не проверял. Да и вообще, я не вижу смысла покупать программы.

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

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

Однако если попытаться активировать программу через меню, то окно активации будет совершенно другим:

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

Кроме поля ввода нам еще показывается какой-то серийный номер, причем на разных компьютерах он будет разный. По всей видимости это HWID, то есть код привязки к конкретному компьютеру. На ввод левых данных программа реагирует сообщением "Invalid Activation Code", поищем ее в файле. Найдется два вхождения.

Нехорошая строка найдена
Нехорошая строка найдена

Теперь посмотрим условия срабатывания этих фрагментов кода. Первый блок проверки:
  1. .text:0041859F                 call    sub_480838
  2. .text:004185A4                 lea     edx, [ebp+var_1F4]
  3. .text:004185AA                 lea     eax, [ebp+var_4]
  4. ; Вызвать функцию проверки и сохранить ее результат EAX в стеке
  5. .text:004185AD                 call    sub_4B67FC
  6. .text:004185B2                 push    eax
  7. .text:004185B3                 dec     [ebp+var_218]
  8. .text:004185B9                 lea     eax, [ebp+var_1F4]
  9. .text:004185BF                 mov     edx, 2
  10. .text:004185C4                 call    sub_4B6700
  11. .text:004185C9                 dec     [ebp+var_218]
  12. .text:004185CF                 lea     eax, [ebp+var_1F0]
  13. .text:004185D5                 mov     edx, 2
  14. .text:004185DA                 call    sub_4B6700
  15. .text:004185DF                 dec     [ebp+var_218]
  16. .text:004185E5                 lea     eax, [ebp+var_1EC]
  17. .text:004185EB                 mov     edx, 2
  18. .text:004185F0                 call    sub_4B6700
  19. ; Прочитать сохраненное значение из стека в регистр ECX
  20. .text:004185F5                 pop     ecx
  21. ; Если ECX=0, то перепрыгнуть сообщение о неправильном коде
  22. .text:004185F6                 test    cl, cl
  23. .text:004185F8                 jz      loc_4186EC
  24. .text:004185FE                 push    0
  25. .text:00418600                 lea     eax, [ebp+var_246]
  26. .text:00418606                 call    unknown_libname_55
  27. .text:0041860B                 mov     dl, 2
  28. .text:0041860D                 call    sub_4189FC
  29. .text:00418612                 mov     cx, [eax]
  30. .text:00418615                 push    ecx
  31. .text:00418616                 mov     [ebp+var_224], 1DCh
  32. .text:0041861F                 mov     edx, offset aInvalidActivat
  33. ; "Invalid Activation Code."
  34. .text:00418624                 lea     eax, [ebp+var_1F8]
  35. .text:0041862A                 call    sub_4B6518
  36. .text:0041862F                 inc     [ebp+var_218]
  37. .text:00418635                 mov     eax, [eax]
  38. ...
Второй блок проверки:
  1. ...
  2. .text:0041B98A                 call    sub_4B6700
  3. .text:0041B98F                 lea     edx, [ebp+var_4]
  4. .text:0041B992                 mov     eax, [ebp+var_4C]
  5. .text:0041B995                 add     eax, 320h
  6. ; Вызвать функцию проверки регистрационных данных
  7. .text:0041B99A                 call    sub_4B67FC
  8. .text:0041B99F                 test    al, al
  9. ; Если она вернула EAX=0, то перепрыгнуть сообщение о неправильном коде
  10. .text:0041B9A1                 jz      short loc_41BA07
  11. .text:0041B9A3                 push    0
  12. .text:0041B9A5                 lea     eax, [ebp+var_52]
  13. .text:0041B9A8                 call    unknown_libname_55
  14. .text:0041B9AD                 mov     dl, 2
  15. .text:0041B9AF                 call    sub_4189FC
  16. .text:0041B9B4                 mov     cx, [eax]
  17. .text:0041B9B7                 push    ecx
  18. .text:0041B9B8                 mov     [ebp+var_38], 2Ch
  19. .text:0041B9BE                 mov     edx, offset aInvalidActiv_0
  20. ; "Invalid Activation Code."
  21. .text:0041B9C3                 lea     eax, [ebp+var_10]
  22. .text:0041B9C6                 call    sub_4B6518
  23. .text:0041B9CB                 inc     [ebp+var_2C]
  24. .text:0041B9CE                 mov     eax, [eax]
  25. .text:0041B9D0                 mov     dl, 1
  26. ...
В обеих случаях вызывается функция:
  1. .text:004B67FC                 push    ebp
  2. .text:004B67FD                 mov     ebp, esp
  3. .text:004B67FF                 push    ebx
  4. .text:004B6800                 mov     eax, [eax]
  5. .text:004B6802                 mov     edx, [edx]
  6. .text:004B6804                 call    @System@@LStrCmp$qqrv
  7. ; System::__linkproc__ LStrCmp(void)
  8. .text:004B6809                 setnz   al
  9. .text:004B680C                 and     eax, 1
  10. .text:004B680F                 pop     ebx
  11. .text:004B6810                 pop     ebp
  12. .text:004B6811                 retn
Сравниваются два значения, если они равны, то на выходе получаем заветное EAX=0. Если посмотреть по перекрестным ссылкам, то обнаружатся вызовы этой же функции и в других местах программы, ответственной за регистрацию, а именно добавление пунктов в меню, изменение заголовка окна и вывод наг-окон. Отлично, все симптомы известны, приступаем к лечению.

Первый вариант, самый простой - патч. Записываем в начало функции проверки по адресу 004B67FC команды XOR EAX,EAX; RET. Теперь программа будет всегда чувствовать себя зарегистрированной. Любителям "красивых" решений я могу сказать следующее: программа хранит свои регистрационные данные в реестре, и кроме того они привязаны к железу. После патча программа становится портативной и прекрасно работает на любой машине с любого носителя. Так что в этом случае патч более чем уместен.

Второй вариант, посложнее - сниффер серийника. Ставим в отладчике точку останова на начало функции проверки по адресу 004B67FC, затем запускаем программу. Брейкпоинт сработает несколько раз еще до появления главного окна программы, после этого можно попытаться активировать ее с любыми левыми данными. На следующем останове протрассируем функцию проверки в пошаговом режиме.

Правильные регистрационные данные
Правильные регистрационные данные

Видно, что в регистрах EAX и EDX сравниваются две строки - введенная нами неправильная строка и какая-то строка "E7A6E293191305390318B375". Перезапустим программу без отладчика и попробуем ввести эту строку в качестве кода активации. Как и ожидалось, все прошло гладко:

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

Но есть одно большое "но". Этот код подходит только для моего компьютера, так как был сгенерирован на основании данных моего серийного номера. Значит остался третий вариант лечения - генератор ключей активации для любого железа. Но вместо того, чтобы ковыряться в достаточно объемном алгоритме генерации, попробуем превратить в кейген саму программу. Для этого внимательно посмотрим на код:
  1. ; Перед сравнением строк записать в регистр EAX адрес указателя на
  2. ; строку с правильным регистрационным ключом
  3. .text:004185AA                 lea     eax, [ebp+var_4]
и вот сюда:
  1. ; Записать куда-то какие-то значение
  2. .text:00418616                 mov     [ebp+var_224], 1DCh
  3. ; Записать в регистр EDX указатель на строку сообщения
  4. .text:0041861F                 mov     edx, offset aInvalidActivat
  5. ; "Invalid Activation Code."
  6. .text:00418624                 lea     eax, [ebp+var_1F8]
  7. ; Вывести сообщение на экран
  8. .text:0041862A                 call    sub_4B6518
Пожертвуем двумя командами по адресу 00418616 и 0041861F (забьем их командами NOP), а вместо них запишем пару команд lea edx, [ebp+var_4] и mov edx,[edx]. В отладчике это выглядит следующим образом:

Патч программы под отладчиком
Патч программы под отладчиком

Теперь сохраняем изменения в исполняемый файл. Запускаем программу и попробуем ее зарегистрировать с любыми левыми данными. И о чудо :) Вместо сообщение об ошибке мы видим правильный регистрационный номер:

Программа работает как кейген
Программа работает как кейген

Вот и все, теперь Billion Chords сам будет подсказывать нам правильные ключи для своей же регистрации. Цинично, но ничего не поделаешь, мир реверсинга бывает очень жесток по отношению к шароварным программам.

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

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

Комментарии

Отзывы посетителей сайта о статье
Саша (01.01.2014 в 00:43):
Уважаемый ManHunter, я внимательно прочёл Вашу инструкцию о том, как установить эту программу, но так и не понял, уж больно сложный процесс вы описали на мой взгляд. Можно как-нибудь коротко и ясно как её активировать, пожалуйста....??
ManHunter (09.10.2012 в 11:46):
Ага, и потом еще отвечать на 100500 камментов "а как ими пользоваться?"
Есть специальные сайты, там энтузиасты ломают любой софт или за бесплатно, или за деньги. Гугл в помощь.
ApTucTka (09.10.2012 в 11:44):
А можно тогда спросить какие программы по мимо дизассемблера нужны?
ManHunter (09.10.2012 в 11:36):
Нет. Я ничего не делаю на заказ.
ApTucTka (09.10.2012 в 11:36):
ManHunter чесно говоря я в этом ни черта не понимаю.Можно ли попросить Вашей помощи в этом?
ManHunter (09.10.2012 в 11:23):
Сделай, разве я против? Если спросят - скажи, что я разрешил :)
ApTucTka (09.10.2012 в 11:20):
ManHunter,а долго ли всё это делается?Мне нужно сделать подобное,но только та программа не триальная и при запуске появляется лишь окно для ввода ключа.
ManHunter (21.03.2012 в 16:02):
Да там привязка к серийному номеру жесткого диска, на котором записана прога. Скопировал на другой диск даже в пределах одного компа - звездец, давай новую регистрацию. Нафиг такое счастье, только патч и ничего кроме патча. Получается вполне себе портативная программа.
Isaev (21.03.2012 в 15:57):
Приветствую =))
Милое решение... У тебя хорошо срабатывает сигнал на экономию времени!
а кейген могу приложить делал когда-то, но скорее это противоречит данному блогу.
unix3d (21.12.2011 в 19:06):
К теме программа самма себя кейгенит можно по адресу 004185F8 сменить

0F84 EE000000 
на
0F85 EE000000 

Ну и по адресу 0048051C (Функция показа окна "Enter Activation Code") вместо 55 (PUSH EBP) ставим  С3 (RET) для возврата можно вызов функции целиком занопить.


И если нажать  на Activate Billion Chords -> Enter Activation Code программа сама себя зарегит  :D
Musika (18.12.2011 в 00:56):
Приветствую,

замечательное решение.
Нетривиально и ловко :)
AyTkACT (16.12.2011 в 22:01):
>>>> Цинично, но ничего не поделаешь, мир реверсинга бывает очень жесток по отношению к шароварным программам.
:) есть такое дело!
ManHunter (16.12.2011 в 15:41):
Новичкам как раз лучше учиться на простых примерах. А тем, кто и так разбирается, буквари с картинками нафиг не нужны.
DimitarSerg (16.12.2011 в 15:25):
Согласен, красиво, но очень просто.
Never (16.12.2011 в 11:10):
Красиво.

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

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

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