[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 42e39da437c5421d8beff9196055dc9e.png Погружение. EXE №1 Нам рекомендуют установить .NET Reflector, и открыть в нем нашего подопытного. Так и сделаем.Скрин .NET Reflector’а b1d34dbebc394b8aa35406a8ca9be4f7.png Видим, что названия классов не обфусцированы, (выглядят нормально). Так же с кодом методов этих классов, если походить по ним. Делаем первый вывод: главный исполняемый файл никак не защищен. ОКей. Идем, дальше.Давайте найдем проверку лицензии и все, что с этим связано.Запустим PVS-Studio, зайдем в меню Tools → Options… → Registration. Попробуем ввести имя юзера и случайный ключ (к автору не обращался, ключ не спрашивал, поэтому формат их мне неизвестен):

Вводим случайные рег.данные 6654bc40a2b64f3fbcc04f5b28cbad0a.png 17fa416e2712451d832a54d99a77ff9d.png Теперь можно поискать по тексту сообщения об ошибке в .NET Reflector’е. Жмем F3 (Search), затем Ctrl+S (Search String or Constant). Вводим «Incorrect registration info». Получаем: Ищем Incorrect registration info 332e31ccc7784a1f9ddf3401c87dce68.png Двойным щелчком переходим по найденной ссылке, и получаем следующий код: Код метода get_LicenseType () b0d8854d3a154aa188536147193d1a1b.png Попробуем выяснить, откуда вызывается данный метод. Жмем Ctrl+R (Analyze), разворачиваем список, а в нем разворачиваем список Used By: Список ссылок на метод get_LicenseType () 5270f4ff604147bf8b53c76765bea867.png Жмем ПКМ по найденному методу, а там Go To Member.Код метода ResetRegistrationInformation () a740d218cacb4343b6e7c32798350ece.png На скрине я выделил место, где мы и получаем сообщение об ошибке. В условии оператора if видим проверку на тип лицензии Invalid. Значит этот тип был установлен где-то выше по коду. Будем просто по порядку заходить во все методы, пока не найдем что-то подозрительное… И, вот оно: Метод ProgramVerificationSystems.PVSStudio.LicenseInfo.Reload () a58b9da1b3a74c07b7120d94ec52f368.png Радостно заходим в метод GetLicenseInfo ()! Код метода GetLicenseInfo () 1b8ae3adbdd543cca6ef9174d1d33b90.png Что тут происходит? Похоже, запускается какой-то exe-файл, с аргументом --checkreg=yes, затем парсится его вывод в консоль, и на основе результатов дается информация о лицензии. Какой именно файл запускается? Выяснить легко: заходим в метод GetPVSStudioExePath () и видим: Код метода GetPVSStudioExePath () fc38e9f3d6724c148db545132b38139a.png Есть ехе-шник PVS-Studio.exe, который, похоже, лежит в каталогах x86 или x64. Порыскав в каталоге с программой, убеждаемся, что, да — такие папки, и такой исполняемый файл у нас имеется. Прекрасно! Значит он, при передаче ему спец-параметра о запросе лицензии (--checkreg=yes), должен выплевывать информацию о нашей с вами лицензии.Еще глубже. EXE №2 Попробуем запустить PVS-Studio.exe в отдельности через командную строку, передав ему наше желание узнать инфу о лицензии.Запрашиваем лицензию 976452698934462a974e2a66dfb5ce77.png Очень хорошая строчка для поиска: «Unknown license type». Будем ее искать через Olly Debugger v2. Открываем в «Ольке» PVS-Studio.exe, жмем ПКМ → Search for → All referenced strings: All Referenced Text Strings 63cd5d0cf292425f99c6b4441db96b5b.png Жмем Ctrl+F (Search for Text), вводим: Unknown license type. И, находим одну ссылку: Результаты поиска Unknown license type 112b446940914e2c9c885b25bfb24b3a.png Двойным кликом по ссылке мы попадаем в код: Интересный код 55af77d140cb42bf80b68a1e2318b232.png На скрине я выделил прямоугольником интересную, на мой взгляд функцию.Во-первых, сразу за ее вызовом идет проверка значения в регистре EAX на число от нуля до трех (0 — trial, 1 — invalid, 2 — timeout, 3 — valid).Затем, идет проверка байта под адресу BYTE PTR SS:[LOCAL.12+3] (так обозвала Олька) на значения от 0 до 3 (0 — Unknown license type, 1 — Single User License, 2 — Team License, 3 — Site License). Этот адрес подается на входе в функцию в регистре EAX.Где-то дальше еще есть вывод даты в консоль, но я не стал с этим разбираться, т.к. если тип лицензии — valid, то на дату ему все равно.Патчинг. EXE №1 Теперь самое интересное: нужно пропатчить код по адресу, на который указывает CALL (в моем случае — 0xA88570), на такой, чтобы выдавался нужный нам тип лицензии и режим. Давайте составлять код: Первым делом, «исправим» байт, отвечающий за тип лицензии. Я выбрал Site License (это число 3). Судя по имеющейся у нас информации, пишем в Ольке такой код (нажать Пробел на адресе 0xA88570):

mov byte ptr [eax], 3

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

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

Результаты работы 3bb3fcb1bb1247b8bcea7d481b6b487c.png Все! Сохраняем изменения в исполняемый файл, и радуемся полностью рабочей лицензии! Патчинг. EXE №2 На этот раз, исполняемый файл у нас 64-х битный, поэтому Олькой найти код не получится. Но, можно найти его с помощью x64dbg. Проявите немного усидчивости и вы сможете пропатчить и его! P.S. Как видим, от силы полчаса исследования, и нас ждет хороший результат.=)

Конец 01d2d71369a046868b38eaa64eefc76e.png Всем спасибо!

© Habrahabr.ru