Этапы работы
1. Анализ программы
2. Подбор программы для Реверса
3. Анализ кода
4. Патч
1. Анализ программы
Возьмем программу Detect It Easy и проверим, на чем она написана и есть ли обфускация кода.
Видим, что программа чиста и без обфускации.
2. Подбор программы для Реверса
Для работы я выберу программу dnSpy.
3. Анализ кода
После запуска программы и ввода любого ключа выйдет сообщение об ошибке.
Открывает программы в dnSpy и ищем слово «Incorrect», находим много совпадений.
Нам нужен «InitFreeLicenseSourceFileHeaders» — нажмем 2 раза и перейдет в класс «LicenseInfo». Мы увидим там метод «GetLicenseInfo» — вот он нам и нужен, взглянем на код.
Поставим бряку на 17 строку и запускаем программу (нажмем наверху «Старт» и нажимаем «OK»)
Разберем код запускается программа «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, заменим код таким образом.
Сохраним изменения и пробуем запустить.
Это моя первая статья, прошу не судить строго.
С уважением, член команды PC-RET Mishar.
Комментарии (37)
Scratch
05.03.2017 17:38+9уже много месяцев есть даже рабочий кейген в сорцах. Сразу было понятно, что авторы особо не собираются бороться с халявщиками (как и jetbrains, например). Потому что это отнимет больше сил, чем хороший маркетинг
dartraiden
06.03.2017 17:47Скомпилил кейген — и правда, работает. Вот разбор алгоритма кейгена бы с удовольствием почитал.
crea7or
05.03.2017 18:11-6Эй хакеры, подскажите как ключи распаковывать в ASProtect'e 1.2. А то я тоже хочу убрать защиту заменив формальной(глючит, зараза). А StarForce плохие люди — не говорят. Само собой все ключи у меня есть, я же сам её ставлю. Мне бы только информацию из ключа доставать.
maaGames
05.03.2017 18:44+2«А это вообще законно?»
Учитывая политику лицензирования PVS-Studio, для них нет причин делать сильную защиту. Одинокие (грустно звучит) разработчики итак споконо могут использовать PVS, а корпоративные всё-равно купят лицензию, чтобы избежать попоболи. Так что не вижу особых проблем для разработчиков из-за столь простого взлома.
ElectroGuard
05.03.2017 19:10-5Я правильно понял, что минусы дотнета вылезли — простой реверсинг? Можно алгоритмы потащить )
x893
05.03.2017 19:57+3Да что IL, что Java — защиту сделать трудно. Так — для формальности.
Вот в нативном коде — это другое дело.
Самый сложный алгоритм видел в Word 5.nckma
05.03.2017 20:28А почему вы думаете, что в нативном коде легко сделать защиту? Или по другому, почему вы думаете, что в нативном коде трудно разобраться?
x893
05.03.2017 20:39+2Потому что возможностей больше в нативном коде.
Ну и примеры всякие смотрю иногда.yarosroman
06.03.2017 02:18+1Ну да, интересное мнение основанное на том, смотрю иногда, что то. В С# например есть динамическая кодогенерация, вы даже не представляете, какие чудеса можно с ней сделать или думаете, что на управляемом коде нельзя свою VM написать? да без проблем.
iga2iga
05.03.2017 20:24Эм, не знаю как сейчас но года 2 назад смотрел интереса ради триалку для VS, имеющую ограниченное количество запусков. Там она просто в одной ветке реестра хранила счетчик запусков. Ушло минут 10 наверное на все про все.
msin
05.03.2017 20:25Я очень поверхностно представляю себе процесс реверса (я с другой стороны баррикады), но совершенно не понимаю, как можно реверсить код, выполняющийся на стековой виртуальной машине?
Ну вот для примера микропрограмма из 2 строк — вычисление байтовой переменной _value (сумма) и присвоение значения другой переменной:
_text = _value.ToString(«0x»);
Как это можно реверснуть? Архив с консолькой выложил тут: https://yadi.sk/d/wyXH9LuH3F5hMwMisharPC-RET
05.03.2017 20:26Для вашей программы требуется снять обуфскацию
Есть в паблике утилита https://github.com/saneki/eazdevirt
Она может вытащить код из виртуальной машины
С Уважением Misharqw1
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)
dartraiden
05.03.2017 22:19А de4dot её не берёт? Стабильная версия, правда, давно не обновлялась, лучше собрать свежий из сорцов.
qw1
06.03.2017 00:34Берёт, деобфускация генерит именам классов читаемые названия. Но не расшифровывает строки и не восстанавливает виртуализированный код машины протектора. Всё-таки это универсальный тул, а не заточенный на снятие конкретного протектора.
p.s. eazdevirt основан на dnlib, как и de4dot.MisharPC-RET
06.03.2017 17:05Эта версия старая и она не брет новый обновленный протектор, я лишь дал ссылку на исходный код который можно дописать под новую версию, а с de4dot не справиться с этим
dartraiden
05.03.2017 21:39+2Выше в комментариях правильно заметили: автор статьи сделал, по сути, косметический кряк. Ограничения при этом наверняка остаются, поскольку необходимо ломать не GUI, а консольную PVS-Studio.exe, в которой и сидит реальная защита.
На ру-борде это и проделывают с каждой выходящей версией.
Вопрос к автору: вы проверяли отсутствие триальных ограничений?
dartraiden
05.03.2017 22:10Разберем код запускается программа «clang.exe»
Не clang.exe, а лежащая рядом с ним PVS-Studio.exe.MisharPC-RET
06.03.2017 17:02-1На разных система запускаются разные файлы там есть архитектура для системы X64 — X86
dartraiden
06.03.2017 17:09Запустите в ком. строке clang.exe с аргументом --checkreg=yes. Потом PVS-Studio с таким же аргументом.
jehy
05.03.2017 22:23+8Ну фу же. Нашли дырку — сообщите автору. Как исправят или проигнорируют — публикуйте. Неужели так сложно?
А тут — сломали гуй очевидным и скучным образом и побежали хвастаться тем, что сломали кусок необфусцированного кода… Детство какое-то.shushu
06.03.2017 08:11+11Детство, не детство — а инвайт он походу за эту статью получил :)
шутка по темеВ магазин приходит маленький Мойше.
— Мне три литра мёда, протягивает он банку продавщице. Та наливает полную банку.
— А папа завтра придёт и заплатит.
— Ну нет, — забирает у него банку продавщица и выливает обратно мёд.
Мойше выходит на улицу и заглядывает в банку: — Папа был прав, тут хватит на два бутерброда.MisharPC-RET
06.03.2017 17:01-3Здравствуйте отвечу сразу всем в одном комментарии
1. Триал ограничения
Они все сняты так как в самом коде программы есть проверки на наличия триала вот в таком виде
Как ранее я показывал что через патч присуждает LicenseInfo.RegistrationStates.Valid значит где есть такие проверки везде программа пройдет как валидная без каких либо нареканий
На разных система запускаются разные файлы это я говорю про подпрограмму clang.exe там есть архитектура для системы X64 X86
Спасибо за понимание с уважением Mishardartraiden
06.03.2017 17:11+1Настоящие проверки не в Standalone.exe. Настоящие проверки в PVS-Studio.exe, которая написана на С++
программа пройдет как валидная без каких либо нареканий
Только визуально.dartraiden
06.03.2017 17:16+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 не патчили, она при каждой своей работе (при анализе исходников) проверяет валидны ли сохранённые серийник и имя. А так как они не валидные, то она урезает свою функциональность.
VolCh
Ждём комментарии авторов. Интересно, такая слабая, можно сказать формальная, защита сознательный ход, типа всё равно сломают?
staticlab
С таким патчем программа будет принимать любой ключ, но работать всё равно не будет.
Там защита чуть глубже в PVS-Studio.exe. В прошлой статье уже объяснили.
dartraiden
Судя по тому, что у автора статус регистрации почему-то генерирует программа clang.exe (которая никак в регистрации не участвует на самом деле), до реальной защиты он даже не добрался.
Infthi
> которая никак в регистрации не участвует на самом деле
Откуда такая уверенность? У них вполне может быть своя сборка кланга, дополненная бледжеком и функциями участия в процессе регистрации
dartraiden
Замечание верное, но, в данном случае, достаточно запустить кланг с указанной опцией, чтобы понять, что не он выносит вердикт о корректности рег. данных. Автор просто спутал exe-шники.