Привет читатель! Я пишу первый раз статью, я один из членов команды 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.
Поделиться с друзьями
-->

Комментарии (37)


  1. VolCh
    05.03.2017 17:24
    +2

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


    1. staticlab
      05.03.2017 19:40
      +8

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


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


      1. dartraiden
        05.03.2017 22:11
        +5

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


        1. Infthi
          06.03.2017 10:45

          > которая никак в регистрации не участвует на самом деле

          Откуда такая уверенность? У них вполне может быть своя сборка кланга, дополненная бледжеком и функциями участия в процессе регистрации


          1. dartraiden
            06.03.2017 17:41

            Замечание верное, но, в данном случае, достаточно запустить кланг с указанной опцией, чтобы понять, что не он выносит вердикт о корректности рег. данных. Автор просто спутал exe-шники.


  1. abyrkov
    05.03.2017 17:32
    +7

    Так просто? А я уже чаек принес :(


    1. Kondra007
      05.03.2017 22:38
      +7

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


    1. dordzhiev
      05.03.2017 23:52

      С ildasm было бы хоть чуточку интереснее, dnSpy уже совсем ребячество…


  1. Scratch
    05.03.2017 17:38
    +9

    уже много месяцев есть даже рабочий кейген в сорцах. Сразу было понятно, что авторы особо не собираются бороться с халявщиками (как и jetbrains, например). Потому что это отнимет больше сил, чем хороший маркетинг


    1. dartraiden
      06.03.2017 17:47

      Скомпилил кейген — и правда, работает. Вот разбор алгоритма кейгена бы с удовольствием почитал.


  1. BubaVV
    05.03.2017 17:44
    +23

    Ждем «Анализ dnSpy средствами PVS Studio»


  1. crea7or
    05.03.2017 18:11
    -6

    Эй хакеры, подскажите как ключи распаковывать в ASProtect'e 1.2. А то я тоже хочу убрать защиту заменив формальной(глючит, зараза). А StarForce плохие люди — не говорят. Само собой все ключи у меня есть, я же сам её ставлю. Мне бы только информацию из ключа доставать.


  1. maaGames
    05.03.2017 18:44
    +2

    «А это вообще законно?»

    Учитывая политику лицензирования PVS-Studio, для них нет причин делать сильную защиту. Одинокие (грустно звучит) разработчики итак споконо могут использовать PVS, а корпоративные всё-равно купят лицензию, чтобы избежать попоболи. Так что не вижу особых проблем для разработчиков из-за столь простого взлома.


  1. ElectroGuard
    05.03.2017 19:10
    -5

    Я правильно понял, что минусы дотнета вылезли — простой реверсинг? Можно алгоритмы потащить )


    1. ElectroGuard
      07.03.2017 17:23
      -1

      Правда традиционно колет глаза :) Ничего, еще один акк заведу.


  1. x893
    05.03.2017 19:57
    +3

    Да что IL, что Java — защиту сделать трудно. Так — для формальности.
    Вот в нативном коде — это другое дело.
    Самый сложный алгоритм видел в Word 5.


    1. nckma
      05.03.2017 20:28

      А почему вы думаете, что в нативном коде легко сделать защиту? Или по другому, почему вы думаете, что в нативном коде трудно разобраться?


      1. x893
        05.03.2017 20:39
        +2

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


        1. yarosroman
          06.03.2017 02:18
          +1

          Ну да, интересное мнение основанное на том, смотрю иногда, что то. В С# например есть динамическая кодогенерация, вы даже не представляете, какие чудеса можно с ней сделать или думаете, что на управляемом коде нельзя свою VM написать? да без проблем.


  1. iga2iga
    05.03.2017 20:24

    Эм, не знаю как сейчас но года 2 назад смотрел интереса ради триалку для VS, имеющую ограниченное количество запусков. Там она просто в одной ветке реестра хранила счетчик запусков. Ушло минут 10 наверное на все про все.


    1. Jesting
      06.03.2017 07:47

      У решарпера, по крайней мере 9го так же.


  1. msin
    05.03.2017 20:25

    Я очень поверхностно представляю себе процесс реверса (я с другой стороны баррикады), но совершенно не понимаю, как можно реверсить код, выполняющийся на стековой виртуальной машине?
    Ну вот для примера микропрограмма из 2 строк — вычисление байтовой переменной _value (сумма) и присвоение значения другой переменной:
    _text = _value.ToString(«0x»);

    Как это можно реверснуть? Архив с консолькой выложил тут: https://yadi.sk/d/wyXH9LuH3F5hMw


    1. MisharPC-RET
      05.03.2017 20:26

      Для вашей программы требуется снять обуфскацию
      Есть в паблике утилита https://github.com/saneki/eazdevirt
      Она может вытащить код из виртуальной машины
      С Уважением Mishar


      1. qw1
        05.03.2017 21:06

        Фиг там. Скорее всего, новая версия обфускатора, которую утилита не знает.

        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)


        1. dartraiden
          05.03.2017 22:19

          А de4dot её не берёт? Стабильная версия, правда, давно не обновлялась, лучше собрать свежий из сорцов.


          1. qw1
            06.03.2017 00:34

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

            p.s. eazdevirt основан на dnlib, как и de4dot.


            1. MisharPC-RET
              06.03.2017 17:05

              Эта версия старая и она не брет новый обновленный протектор, я лишь дал ссылку на исходный код который можно дописать под новую версию, а с de4dot не справиться с этим


  1. dartraiden
    05.03.2017 21:39
    +2

    Выше в комментариях правильно заметили: автор статьи сделал, по сути, косметический кряк. Ограничения при этом наверняка остаются, поскольку необходимо ломать не GUI, а консольную PVS-Studio.exe, в которой и сидит реальная защита.

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

    Вопрос к автору: вы проверяли отсутствие триальных ограничений?


  1. dartraiden
    05.03.2017 22:10

    Разберем код запускается программа «clang.exe»

    Не clang.exe, а лежащая рядом с ним PVS-Studio.exe.


    1. MisharPC-RET
      06.03.2017 17:02
      -1

      На разных система запускаются разные файлы там есть архитектура для системы X64 — X86


      1. dartraiden
        06.03.2017 17:09

        Запустите в ком. строке clang.exe с аргументом --checkreg=yes. Потом PVS-Studio с таким же аргументом.


  1. jehy
    05.03.2017 22:23
    +8

    Ну фу же. Нашли дырку — сообщите автору. Как исправят или проигнорируют — публикуйте. Неужели так сложно?

    А тут — сломали гуй очевидным и скучным образом и побежали хвастаться тем, что сломали кусок необфусцированного кода… Детство какое-то.


    1. shushu
      06.03.2017 08:11
      +11

      Детство, не детство — а инвайт он походу за эту статью получил :)

      шутка по теме
      В магазин приходит маленький Мойше.
      — Мне три литра мёда, протягивает он банку продавщице. Та наливает полную банку.
      — А папа завтра придёт и заплатит.
      — Ну нет, — забирает у него банку продавщица и выливает обратно мёд.

      Мойше выходит на улицу и заглядывает в банку: — Папа был прав, тут хватит на два бутерброда.


  1. MisharPC-RET
    06.03.2017 17:01
    -3

    Здравствуйте отвечу сразу всем в одном комментарии
    1. Триал ограничения
    Они все сняты так как в самом коде программы есть проверки на наличия триала вот в таком виде
    image
    Как ранее я показывал что через патч присуждает LicenseInfo.RegistrationStates.Valid значит где есть такие проверки везде программа пройдет как валидная без каких либо нареканий
    На разных система запускаются разные файлы это я говорю про подпрограмму clang.exe там есть архитектура для системы X64 X86
    Спасибо за понимание с уважением Mishar


    1. dartraiden
      06.03.2017 17:11
      +1

      Настоящие проверки не в Standalone.exe. Настоящие проверки в PVS-Studio.exe, которая написана на С++

      программа пройдет как валидная без каких либо нареканий
      Только визуально.


      1. dartraiden
        06.03.2017 17:16
        +1

        Извините, я не знаю, как ещё более понятно объяснить.

        Вы взломали лишь один компонент программы, она теперь рапортует, что зарегистрирована, но триальные ограничения никуда не делись.


    1. dartraiden
      06.03.2017 17:35
      +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 не патчили, она при каждой своей работе (при анализе исходников) проверяет валидны ли сохранённые серийник и имя. А так как они не валидные, то она урезает свою функциональность.