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

Привет читатель! Я пишу первый раз статью, я один из членов команды PC-RET, я изучил статью и решил подойти с другой стороны

Этапы работы

1. Анализ программы
2. Подбор программы для Реверса
3. Анализ кода
4. Патч

1. Анализ программы

Возьмем программу Detect It Easy и проверим, на чем она написана и есть ли обфускация кода.

Скриншот из анализатора
image

Видим, что программа чиста и без обфускации.

2. Подбор программы для Реверса

Для работы я выберу программу dnSpy.

3. Анализ кода

После запуска программы и ввода любого ключа выйдет сообщение об ошибке.

Скриншот ошибки
image

Открывает программы в dnSpy и ищем слово «Incorrect», находим много совпадений.

Скриншот поиска
image

Нам нужен «InitFreeLicenseSourceFileHeaders» — нажмем 2 раза и перейдет в класс «LicenseInfo». Мы увидим там метод «GetLicenseInfo» — вот он нам и нужен, взглянем на код.

Скриншот GetLicenseInfo
image

Поставим бряку на 17 строку и запускаем программу (нажмем наверху «Старт» и нажимаем «OK»)

Скриншот запуска в отладке
image

Разберем код запускается программа «clang.exe» с аргументами "--checkreg=yes" и получили ответ
invalid\r\nUnknown license type\r\n-1\r\n" дальше строку делим по "\n" и получаем массив строк
1- invalid 2- Unknown license type 3- -1

4. Патч

Мы не будем вызывать программу с аргументами, мы просто отдадим программе то, что нам надо. А нам нужно дать программе нашу строку «valid\r\nEnterprise License\r\n365\r\n»

Это мы и сделаем, нажмем правой кнопкой в функции GetLicenseInfo и выберем EditMetod, заменим код таким образом.

Скриншот замены
image

Сохраним изменения и пробуем запустить.

Скриншот Лицензии
image

Это моя первая статья, прошу не судить строго.
С уважением, член команды PC-RET Mishar.
Share post

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 37

    +2
    Ждём комментарии авторов. Интересно, такая слабая, можно сказать формальная, защита сознательный ход, типа всё равно сломают?
      +8

      С таким патчем программа будет принимать любой ключ, но работать всё равно не будет.


      Там защита чуть глубже в PVS-Studio.exe. В прошлой статье уже объяснили.

        +5
        Судя по тому, что у автора статус регистрации почему-то генерирует программа clang.exe (которая никак в регистрации не участвует на самом деле), до реальной защиты он даже не добрался.
          0
          > которая никак в регистрации не участвует на самом деле

          Откуда такая уверенность? У них вполне может быть своя сборка кланга, дополненная бледжеком и функциями участия в процессе регистрации
            0
            Замечание верное, но, в данном случае, достаточно запустить кланг с указанной опцией, чтобы понять, что не он выносит вердикт о корректности рег. данных. Автор просто спутал exe-шники.
      +7
      Так просто? А я уже чаек принес :(
        +7

        Бедные чайки, отпустите их.

          0
          С ildasm было бы хоть чуточку интереснее, dnSpy уже совсем ребячество…
          +9
          уже много месяцев есть даже рабочий кейген в сорцах. Сразу было понятно, что авторы особо не собираются бороться с халявщиками (как и jetbrains, например). Потому что это отнимет больше сил, чем хороший маркетинг
            0
            Скомпилил кейген — и правда, работает. Вот разбор алгоритма кейгена бы с удовольствием почитал.
            +23
            Ждем «Анализ dnSpy средствами PVS Studio»
              –6
              Эй хакеры, подскажите как ключи распаковывать в ASProtect'e 1.2. А то я тоже хочу убрать защиту заменив формальной(глючит, зараза). А StarForce плохие люди — не говорят. Само собой все ключи у меня есть, я же сам её ставлю. Мне бы только информацию из ключа доставать.
                +2
                «А это вообще законно?»

                Учитывая политику лицензирования PVS-Studio, для них нет причин делать сильную защиту. Одинокие (грустно звучит) разработчики итак споконо могут использовать PVS, а корпоративные всё-равно купят лицензию, чтобы избежать попоболи. Так что не вижу особых проблем для разработчиков из-за столь простого взлома.
                  –5
                  Я правильно понял, что минусы дотнета вылезли — простой реверсинг? Можно алгоритмы потащить )
                    –1
                    Правда традиционно колет глаза :) Ничего, еще один акк заведу.
                    +3
                    Да что IL, что Java — защиту сделать трудно. Так — для формальности.
                    Вот в нативном коде — это другое дело.
                    Самый сложный алгоритм видел в Word 5.
                      0
                      А почему вы думаете, что в нативном коде легко сделать защиту? Или по другому, почему вы думаете, что в нативном коде трудно разобраться?
                        +2
                        Потому что возможностей больше в нативном коде.
                        Ну и примеры всякие смотрю иногда.
                          +1
                          Ну да, интересное мнение основанное на том, смотрю иногда, что то. В С# например есть динамическая кодогенерация, вы даже не представляете, какие чудеса можно с ней сделать или думаете, что на управляемом коде нельзя свою VM написать? да без проблем.
                      0
                      Эм, не знаю как сейчас но года 2 назад смотрел интереса ради триалку для VS, имеющую ограниченное количество запусков. Там она просто в одной ветке реестра хранила счетчик запусков. Ушло минут 10 наверное на все про все.
                        0
                        У решарпера, по крайней мере 9го так же.
                        0
                        Я очень поверхностно представляю себе процесс реверса (я с другой стороны баррикады), но совершенно не понимаю, как можно реверсить код, выполняющийся на стековой виртуальной машине?
                        Ну вот для примера микропрограмма из 2 строк — вычисление байтовой переменной _value (сумма) и присвоение значения другой переменной:
                        _text = _value.ToString(«0x»);

                        Как это можно реверснуть? Архив с консолькой выложил тут: https://yadi.sk/d/wyXH9LuH3F5hMw
                          0
                          Для вашей программы требуется снять обуфскацию
                          Есть в паблике утилита https://github.com/saneki/eazdevirt
                          Она может вытащить код из виртуальной машины
                          С Уважением Mishar
                            0
                            Фиг там. Скорее всего, новая версия обфускатора, которую утилита не знает.

                            C:\2017-03-05>C:\2017-03-05\eazdevirt-master\bin\Debug\eazdevirt.exe -d TestConsole.exe
                            
                                                     .___          .__         __
                              ____ _____  ________ __| _/_______  _|__|_______/  |_
                            _/ __ \\__  \ \___   // __ |/ __ \  \/ /  \_  __ \   __\
                            \  ___/ / __ \_/    // /_/ \  ___/\   /|  ||  | \/|  |
                             \___  >____  /_____ \____ |\___  >\_/ |__||__|   |__|
                                 \/     \/      \/    \/    \/
                            
                            
                            
                            Unhandled Exception: System.Exception: Number of found subsequences (DictionaryAddPattern) 0 != 203 (expected value)
                              0
                              А de4dot её не берёт? Стабильная версия, правда, давно не обновлялась, лучше собрать свежий из сорцов.
                                0
                                Берёт, деобфускация генерит именам классов читаемые названия. Но не расшифровывает строки и не восстанавливает виртуализированный код машины протектора. Всё-таки это универсальный тул, а не заточенный на снятие конкретного протектора.

                                p.s. eazdevirt основан на dnlib, как и de4dot.
                                  0
                                  Эта версия старая и она не брет новый обновленный протектор, я лишь дал ссылку на исходный код который можно дописать под новую версию, а с de4dot не справиться с этим
                          +2
                          Выше в комментариях правильно заметили: автор статьи сделал, по сути, косметический кряк. Ограничения при этом наверняка остаются, поскольку необходимо ломать не GUI, а консольную PVS-Studio.exe, в которой и сидит реальная защита.

                          На ру-борде это и проделывают с каждой выходящей версией.

                          Вопрос к автору: вы проверяли отсутствие триальных ограничений?
                            0
                            Разберем код запускается программа «clang.exe»

                            Не clang.exe, а лежащая рядом с ним PVS-Studio.exe.
                              –1
                              На разных система запускаются разные файлы там есть архитектура для системы X64 — X86
                                0
                                Запустите в ком. строке clang.exe с аргументом --checkreg=yes. Потом PVS-Studio с таким же аргументом.
                              +8
                              Ну фу же. Нашли дырку — сообщите автору. Как исправят или проигнорируют — публикуйте. Неужели так сложно?

                              А тут — сломали гуй очевидным и скучным образом и побежали хвастаться тем, что сломали кусок необфусцированного кода… Детство какое-то.
                                +11
                                Детство, не детство — а инвайт он походу за эту статью получил :)
                                шутка по теме
                                В магазин приходит маленький Мойше.
                                — Мне три литра мёда, протягивает он банку продавщице. Та наливает полную банку.
                                — А папа завтра придёт и заплатит.
                                — Ну нет, — забирает у него банку продавщица и выливает обратно мёд.

                                Мойше выходит на улицу и заглядывает в банку: — Папа был прав, тут хватит на два бутерброда.
                                –3
                                Здравствуйте отвечу сразу всем в одном комментарии
                                1. Триал ограничения
                                Они все сняты так как в самом коде программы есть проверки на наличия триала вот в таком виде
                                image
                                Как ранее я показывал что через патч присуждает LicenseInfo.RegistrationStates.Valid значит где есть такие проверки везде программа пройдет как валидная без каких либо нареканий
                                На разных система запускаются разные файлы это я говорю про подпрограмму clang.exe там есть архитектура для системы X64 X86
                                Спасибо за понимание с уважением Mishar
                                  +1
                                  Настоящие проверки не в Standalone.exe. Настоящие проверки в PVS-Studio.exe, которая написана на С++

                                  программа пройдет как валидная без каких либо нареканий
                                  Только визуально.
                                    +1
                                    Извините, я не знаю, как ещё более понятно объяснить.

                                    Вы взломали лишь один компонент программы, она теперь рапортует, что зарегистрирована, но триальные ограничения никуда не делись.
                                    +2
                                    Продублирую тут свой ответ вам в личку, мне кажется, что читателям будет полезно:

                                    Standalone.exe — С#, GUI-ёвая графическая обвязка вокруг консольной С++-ной PVS-Studio.exe.

                                    Когда мы вводим имя и серийник в Standalone.exe, она просто их отправляет в консольную PVS-Studio.exe. Она их не проверяет на валидность. Не высчитывает, соответствует ли имя серийнику. В консольной части происходит реальная проверка, после чего консольная PVS-Studio.exe отправляет Standalone.exe ответ в духе «всё ок» или «всё плохо, серийник не валидный». И Standalone.exe просто проверяет, какой ответ ей пришёл: хороший или плохой. Чтобы показать статус регистрации. Т.е., можно провести такую параллель: Standalone.exe это что-то типа About, где выводится имя юзера. А вот консольную PVS-Studio.exe не патчили, она при каждой своей работе (при анализе исходников) проверяет валидны ли сохранённые серийник и имя. А так как они не валидные, то она урезает свою функциональность.

                                  Only users with full accounts can post comments. Log in, please.