...

вторник, 14 апреля 2015 г.

[recovery mode] Исследование защиты PVS-Studio

PVS-Studio



Приветствую! Это мой первый пост на Хабре в принципе, но не первая статья о взломе ПО вообще, поэтому навык писать все с начала и по шагам, для начинающих крякеров, у меня есть. В данной статье я расскажу о том, как был отучен от триальности PVS-Studio.



Подготовка



Прежде, чем начинать, помните: все действия вы выполняете на свой страх и риск. Уважайте работу программистов!

Первым делом, качаем и устанавливаем программу. Тут все просто.


С чем мы имеем дело?



Давайте выясним, на чем написана программа, и что нам придется "лечить". Старперы для этого используют PEiD, но он очень уж старый теперь, базы не обновляются, да и многие компиляторы он просто не понимает. Обычно, я пользуюсь программой ExeInfo PE.

Заходим в каталог с программой, и "на глаз" решаем, что первым подопытным файлом станет PVSStudioStandalone.exe . Его запуск также говорит о том, что это главный исполняемый файл. Натравливаем на него ExeInfo PE и получаем:



Microsoft Visual C# / Basic.NET | Explore, browse, and analyze .NET assemblies with .NET Reflector



Окно ExeInfo PE







Погружение. EXE №1



Нам рекомендуют установить .NET Reflector, и открыть в нем нашего подопытного. Так и сделаем.

Скрин .NET Reflector'а







Видим, что названия классов не обфусцированы, (выглядят нормально). Так же с кодом методов этих классов, если походить по ним. Делаем первый вывод: главный исполняемый файл никак не защищен. ОКей. Идем, дальше.

Давайте найдем проверку лицензии и все, что с этим связано.

Запустим PVS-Studio , зайдем в меню Tools -> Options… -> Registration. Попробуем ввести имя юзера и случайный ключ (к автору не обращался, ключ не спрашивал, поэтому формат их мне неизвестен):


Вводим случайные рег.данные










Теперь можно поискать по тексту сообщения об ошибке в .NET Reflector'е . Жмем F3 (Search), затем Ctrl+S (Search String or Constant). Вводим "Incorrect registration info". Получаем:

Ищем Incorrect registration info







Двойным щелчком переходим по найденной ссылке, и получаем следующий код:

Код метода get_LicenseType()







Попробуем выяснить, откуда вызывается данный метод. Жмем Ctrl+R (Analyze), разворачиваем список, а в нем разворачиваем список Used By:

Список ссылок на метод get_LicenseType()







Жмем ПКМ по найденному методу, а там Go To Member.

Код метода ResetRegistrationInformation()







На скрине я выделил место, где мы и получаем сообщение об ошибке. В условии оператора if видим проверку на тип лицензии Invalid . Значит этот тип был установлен где-то выше по коду. Будем просто по порядку заходить во все методы, пока не найдем что-то подозрительное… И, вот оно:

Метод ProgramVerificationSystems.PVSStudio.LicenseInfo.Reload()





Радостно заходим в метод GetLicenseInfo() !

Код метода GetLicenseInfo()







Что тут происходит? Похоже, запускается какой-то exe-файл, с аргументом --checkreg=yes , затем парсится его вывод в консоль, и на основе результатов дается информация о лицензии. Какой именно файл запускается? Выяснить легко: заходим в метод GetPVSStudioExePath() и видим:

Код метода GetPVSStudioExePath()







Есть ехе-шник PVS-Studio.exe, который, похоже, лежит в каталогах x86 или x64. Порыскав в каталоге с программой, убеждаемся, что, да — такие папки, и такой исполняемый файл у нас имеется. Прекрасно!

Значит он, при передаче ему спец-параметра о запросе лицензии (--checkreg=yes ), должен выплевывать информацию о нашей с вами лицензии.
Еще глубже. EXE №2



Попробуем запустить PVS-Studio.exe в отдельности через командную строку, передав ему наше желание узнать инфу о лицензии.

Запрашиваем лицензию







Очень хорошая строчка для поиска: "Unknown license type". Будем ее искать через Olly Debugger v2. Открываем в "Ольке" PVS-Studio.exe, жмем ПКМ -> Search for -> All referenced strings:

All Referenced Text Strings







Жмем Ctrl+F (Search for Text), вводим: Unknown license type. И, находим одну ссылку:

Результаты поиска Unknown license type







Двойным кликом по ссылке мы попадаем в код:

Интересный код







На скрине я выделил прямоугольником интересную, на мой взгляд функцию.

Во-первых, сразу за ее вызовом идет проверка значения в регистре EAX на число от нуля до трех (0trial, 1invalid, 2timeout, 3valid).

Затем, идет проверка байта под адресу BYTE PTR SS:[LOCAL.12+3] (так обозвала Олька) на значения от 0 до 3 (0Unknown license type, 1Single User License, 2Team License, 3Site License). Этот адрес подается на входе в функцию в регистре EAX.

Где-то дальше еще есть вывод даты в консоль, но я не стал с этим разбираться, т.к. если тип лицензии — valid, то на дату ему все равно.
Патчинг. EXE №1



Теперь самое интересное: нужно пропатчить код по адресу, на который указывает CALL (в моем случае — 0xA88570 ), на такой, чтобы выдавался нужный нам тип лицензии и режим. Давайте составлять код:

Первым делом, "исправим" байт, отвечающий за тип лицензии. Я выбрал Site License (это число 3). Судя по имеющейся у нас информации, пишем в Ольке такой код (нажать Пробел на адресе 0xA88570 ):



mov byte ptr [eax], 3





Затем, исправим возвращаемое в EAX значение. Я так же выбрал 3 (valid):


mov eax, 3





Ну и, напоследок, выйти из функции:


retn





Результаты работы







Все! Сохраняем изменения в исполняемый файл, и радуемся полностью рабочей лицензии!
Патчинг. EXE №2



На этот раз, исполняемый файл у нас 64-х битный, поэтому Олькой найти код не получится. Но, можно найти его с помощью x64dbg . Проявите немного усидчивости и вы сможете пропатчить и его!

P.S. Как видим, от силы полчаса исследования, и нас ждет хороший результат.=)


Конец





Всем спасибо!


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий