Патчинг софта, накрытого .NET Reactor’ом, на примере ActualSpamPro

В последнее время всё большее количество авторов “рекламного соц. софта” используют платформу .NET для разработки. Причем для того, чтобы защитить свой софт, они не гнушаются использовать платные протекторы (двойные стандарты в области интеллектуальной собственности так и прут), в том числе довольно известный .NET Reactor. Не знаю, с чем связан частый выбор данного протектора, но особой сложности для анализа внутренностей защищенной программы он не добавляет, так как существует множество вспомогательных инструментов для разбора такого софта, да и ручками всё или почти всё не так уж сложно сделать.

К чему это я? А к тому, что данный продукт также защищен этим протектором (как и, например, VIP). Определить протектор не составляет проблемы, так как давно уже существует множество разнообразных программ, помогающих в данном деле: PeID, DotNet Id, ProtectionID и т.п. Соответственно, если проанализировать исполняемый файл с помощью ProtectionID, то он сразу же выдаст следующее:

Сразу открыть такой файл в рефлекторе не получится, ибо:

.NET Reactor builds a native code wall between potential hackers and your .NET assemblies by producing a file which cannot be understood directly as CIL. Because the CIL in your assembly is emitted intact only at run time or design time (in a form in which the source is completely inaccessible), no tool is capable of decompiling .NET Reactor protected assemblies.

Проблема решается довольно просто:
1. Запускаем программу.
2. Качаем какой-нибудь .NET-дампер (если нет желания с помощью отладчика копаться в памяти процесса).
3. Дампим часть памяти процесса.
4. …
5. PROFIT!

Я обычно использую .NET Generic Unpacker или DotNet Dumper. Интерфейс интуитивный, всё запросто дампится.
После того, как отработает дампер, получаем .exe и кучу библиотек (которые неплохо бы переименовать в их оригинальные имена. Если используете DotNet Dumper, то он всё за вас сделает). Для того, чтобы открыть исполняемый файл в Рефлекторе придется совершить ещё одно нехитрое действие, а именно - исправить заголовки. Сделать это можно двумя способами:
1. Погуглить мануал по распаковке .NET Reactor за авторством CodeRipper'a и сделать всё руками.
2. Воспользоваться этим фиксером от dx'a.

Но после открытия получившегося файла в рефлекторе мы увидим "пустые" методы в самых интересных местах:

Чтобы не вникать в особенности (я ужасный лентяй), обратимся к ещё одному полезному инструменту CodeRipper'a - Reactor Decryptor. Соответственно открываем программу в нём, деобфусцируем приложение, а уже потом обрабатываем его фиксером заголовков. Полученный файл можно спокойно открыть в рефлекторе и посмотреть код интересующего нас метода.

Единственная неприятность - строки в нечитабельном виде. Но и это не составляет проблемы, просто открываем файл в программе Simple Assembly Explorer, переходим к интересующему методу и используем встроенный деобфускатор. Перед нами
искомые строки:

Сопоставив строки и код несложно понять, что софт делает GET-запрос вида:
http://actualspam.ru/getAuth.php?key=******

И если в ответе сервера содержится строка true, и IP сервера 195.211.101.8, то софт успешно активируется. Всего в коде два метода с проверкой активации: в классе frmActivation и в классе frmMain.
Таким образом, "активировать" программу можно, например, перехватив вызовы winapi-функций connect и recv, или просто поправив нужные опкоды (править следует экзешник, полученный после деобфускации с помощью Reactor Decryptor, но до применения фиксера заголовков).
Опкоды правятся с помощью любого удобного HEX-редактора. Места, которые необходимо править, можно по-быстрому найти с помощью IDA. Вот одна из проверок на наличие строки true в ответе сервера (проверки можно найти, вбив 0xb4fc и 0xcba в поиск):

Далее переключаемся на вкладку HexView, копируем последовательность байт, вбиваем в поиск в HEX-редакторе и находим нужное место (наверное, можно как-то проще сделать). В данном случае можно поменять в обеих функциях проверки опкод 0x39 (brfalse) на 0x3A (brtrue) или забить часть кода NOP'ами, или ещё как-нибудь извернуться (список опкодов CIL).
Теперь программа активируется при вводе произвольного кода.

Конечно, в .NET Reactor есть разные опции защиты, но разбор содержимого защищенного файла обычно не составляет проблемы.
P.S. А вообще весь этот софт "рекламной" направленности - зло. По мне уж лучше продавцом в магазине работать (кем я и работаю) и смотреть South Park и прочие мультики.

Патчинг софта, накрытого .NET Reactor’ом, на примере ActualSpamPro: 124 комментария

    1. Ужас, однако никто не мешает прочитать ещё несколько статей на краклабе и самостоятельно разобраться как поступать с новыми версиями.

  1. Да, метод тоже, но по представленному опкоду не ищет. Статья у тебя хорошая, но без отступов на возможные варианты. Там 'true', но опкод не катируется.

    1. Предполагается, что человек знаком с основами программирования и если видит в измененной версии каскад условий if, то догадается, что видимо нужно их все поменять.

  2. Боюсь, что человек, знакомый с основами программирования, не нуждался бы в данной статье. Аргумент весомый, так что прошу помощи)

    1. В чем именно помощи, сказать какие опкоды менять и на что? Так это не помощь уже будет, а почти аналог просьбы типа "сделай за меня".

      1. Возможно. Но учиться проще на примерах. И если делать по примеру и при этом у тебя что-то получится, проще будет дальше.

  3. Хорошо. Отступим от темы. Подскажи, с какой книги начать изучение C#?! Чтоб было проще и понятнее и чем еще можно воспользоваться для изучения.

        1. Я отвечаю за то, что говорю. По программированию я книг не читал. Хотя если "прочел десяток страниц книги, а потом забросил и больше не открывал" считается, то я прочел 10-15 страниц из самоучителя под названием "Занимательное программирование".

    1. И сайтов конкретных назвать не могу. У меня в закладках только небольшие справочные материалы, типа таблицы опкодов cil

  4. А втор статью конечно молодец,но эти номера давно не проходят с новыми версиями, кто не верит качаите демку реактора с оф сайта и убедитесь. Статья не актуальна.

    1. Не все поддерживают используемые протекторы в актуальном состоянии. А последние версии можно обсудить на тутсах или поспрашивать у CodeRipper'а про непонятные моменты.

  5. Если при анализе процесса активации с удаленным серваком вместо сниффера первым делом достается дизасм - это как минимум странно. Вместо часового боевика с патчингом и использованием множества чужих тулз, мог бы сделать все за пять минут, даже не патча бинарник(!). Мануалы по слому надо принимать к сведенью, а не заучивать юзкейсы.

  6. По ночам я бываю излишне резок, сорри.
    Чисто субъективно не вижу смысла _начинать_ с разгребания кода, который худо-бедно, но потрудились закрыть, если на поверхности лежит слабое место в виде нешифрованного соединения. Т.е. для того, чтобы хотя бы выйти на запрашиваемый урл, пришлось дампить, деобфусцировать и ваще вникать в код флов, хотя в конкретном случае половина дела решилась бы единственным запуском вайршарка. А ипшник подделать можно, и даже проверка hosts не спасет.

    1. И каким образом на базе винды подделать айпишник, сплайснуть функцию connect? Собственно весь смысл был в том, чтобы пропатчить проверку, мне не принципиально было куда обращается и обращается ли вообще этот файл.

  7. Если есть возможность залейте старую версию софта. Та ссыль,которая на первой странице битая уже. Спасибо

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *