Патчинг софта, накрытого .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. Если есть возможность залейте старую версию софта. Та ссыль,которая на первой странице битая уже. Спасибо

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

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