Патчинг софта, накрытого .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. Kaimi, статья отлична. но но сложно разобраться начиная с HEX кода. отпиши поподробней пожалуйста.

  2. Kaimi, я разобрался. спасибо огромное. Мне кажется не стоит выкладывать исходники ибо кто хочет пользоваться софтом должен напрячь мозги.

  3. Очень познавательно, в принципе я подозревал что все эти платные мега-защиты, паганое средство =) Но не думал, что настолько.

      1. Каждый живёт чем может) Если поймают авторов софта- им светит условка, а если ты попадешься им (авторам софта) голову отвинтят, ломай буржусофт, а такс наживаешь врагов себе и только усиливаешь кол-во школоты, кидал и барыг распространяя все это...

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

        1. Если авторы готовы приехать в штаты, то пожалуйста. Не в курсе, конкретизируй о каком софте идет речь.
          Защита "вредоносного" софта законодательством не предусмотрена думается, а если тебя сам факт взлома такого распрекрасного софта смущает, то можешь считать, что мне за это Паша платит.

  4. Как по мне, Пуховому стало влом поддерживать своих клиентов и он красиво свалил... Помимо денег это дает еще кучу обязанностей

    1. Нет конечно. Я уже сказал - мне за это платят.
      А рассуждать о том кто прав, а кто нет можно бесконечно. Кстати, вы бы ещё бизнес на наркотиках построили, а потом возмущались, что кто-то его ломает.

  5. Вы придурки какого вы на Kaimi гоните?
    Если у автора ActualSpamPro нету мозгов и он поставил такую говно защиту, и он не может сделать нормальную защиту своего софта не йух вообще этот софт продавать.
    Не нравится нехуй вообще заходить на этот блог.

    И вообще пошли на йух.

    Kaimi молодец и не слушай этих придурков!

  6. кайми, ну хорош пилять то что ты буржуй - прокси поюзать штатные ведь забывал иногда, сам понимаешь где? (ну если сразу не дойдет - там где ты в бане) от себя - вот поймают тебя действительно. и там все как написано выше - ну словами CS

    1. Я не использую штатовские прокси. Пусть ловят если хотят. Пока что всё это напоминает пустые угрозы от школьников в уютном чатике.

  7. ЗЫ: а сломанного викинга че здесь не выкладываешь? или боишься что голове тогда на месте не удержаться?

    1. Любой каприз за ваши деньги.
      Дистрибутив + лог процесса авторизации действующей лицензии (из вайршарка) + деньги и будет тебе викинг.

  8. Слушай Каими, если нравится ломать то ломай калькулятор или блокнот.. проги токого рода должны бить только платными. От представь, ты живеш возле детского садика, а я каждому малишу дам по автомату и скажу атакуем "Пидара", тоисть тебя.. Вот и подумай нужно ли прогу делать доступной для всех... Мой тебе совет, не лезь куда не надо и будет тебе щастье

    1. Ага, а проги всего остального рода должны быть бесплатными, да? Чушь не надо говорить.
      Легкие деньги боитесь потерять и всё.

      И сравнение некорректно, автоматы на каждом шагу не продают. А вашим "крутым приватным" софтом пол-интернета торгует в открытую.

  9. С одной стороны жаль автора: он ведь долго работал над этим софтом.

    Но с другой стороны. Если прочитать комменты, то Kaimi против подобного софта. Но все таки зачем тогда взламывать этот софт или писать мануал по взлому, а затем выкладывать это в инет? Ведь данный софт становится еще более доступным для большего количества людей.

    Ну конечно автор теперь, наверное, будет пробовать делать защиту получше, как бы, благодаря Kaimi, он обретет новый опыт в написании защиты для своих прог.

    Лично я за написание подобного софта, не вижу ничего плохого в этом. Хрумер - это тоже софт, за который надо наказать авторов? Я считаю, что это уже больше относиться к людям, которые используют подобного рода софт. Например, реклама разнообразных лже-партнерок, подмен выдачи, фейковых антивирусов и т. д. Это уже настроящийй бред, который основан на кидке/вымогании денег.

    1. Фишка в том, что реализовать защиту для софта подобного рода, которую я бы не стал пробовать ломать, можно буквально за пару часов. По-крайней мере мне было бы впадлу копаться в защите как у вкбота, но с шифрованием.
      Да и протекторы типа WinLicense, Armadillo, VMProtect я бы тоже вряд ли стал ковырять.

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

  11. Тутов про взлом .NET Reactor куча, было бы интересно почитать про например - Inquartos Obfuscator, еще не видел ни одной статьи про его взлом.

        1. Так, а в чем проблема с ним?
          Запускаем прогу, дампим тем же Net Generic Unpacker. Получившийся дамп суем в Simple Assembly Explorer, смотрим содержимое метода
          TreeNode: 冚(): Boolean: System.Boolean g.g::冚()

          Читается содержимое файла key.txt, проверяется длина ключа(должна быть 64), один и тот же ключ должен быть в записан в двух строках в файле. Далее генерируется идентификатор железа в методе
          TreeNode: 军(): String: System.String g.g::军()

          А потом содержимое key.txt сравнивается с md5 от частей идентификатора железа. В коде все видно в общем то и всю проверку можно представить так:

          string str = read_file('key.txt');
          string str2 = generate_hwid();

          if(str == (md5(str2.Substring(1,10)) + md5(str2.Substring(9,9) + md5(str2.Substring(30,2))))
          {
          return true;
          }

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

    1. Там VMProtect вроде, а так, если есть лог удачной авторизации на сервере лицензий со снифера, то можно попробовать по-простому

  12. Уу тебя это, видео не открывается:
    "Это видео более недоступно из-за заявления о нарушении авторских прав"

  13. Я дошел до этого момента :
    "Чтобы не вникать в особенности (я ужасный лентяй), обратимся к ещё одному полезному инструменту CodeRipper’a – Reactor Decryptor. Соответственно открываем программу в нём, деобфусцируем приложение, а уже потом обрабатываем его фиксером заголовков. "

    Я деобфусцирувал приложение, а как обработать его фиксером заголовков ?
    Это уже отдельной прогой в пакете с Reactor_Decryptor ?
    Спасибо!

    1. По-идее не должна вылетать. В любом случае можно включить отображение листинга функции не в виде C#, а в виде IL и в нём разобраться.

  14. Вернее екзешник ActualSpam pro v1.0_patched_decrypted_patched.exe
    не открывается в режиме Class Editor, таже ошибка. что и на скрине

    1. Так и все открывается, оригинальный файл обрабатывается Reactor Decryptor'ом, потом фиксером и нормально открывается в SAE

      1. Я взял оргинал файла и через Reactor Decryptor дает ошибку "Not even a .NET assembly!" Наверное дамп нужно сначала снять потом фиксером и потом Reactor Decryptor ?

  15. Kaimi подскажи пожалуйста где можно почитать литературу чтоб понять в IDA коды на вкладке Hex View-A. А то много цифр и как их понять :(
    Спасибо!

  16. Можете в статье добавить одну картинку как это сделать: "Далее переключаемся на вкладку HexView, копируем последовательность байт, вбиваем в поиск в HEX-редакторе и находим нужное место"
    А то не совсем понятно как это сделать.
    Извините за тупость.

    1. А в чем проблема то? В IDA эта вкладка на видном месте, выделить кусок кода мышкой на вкладке IDA View, а потом нажать HexView - это сложно?

      1. Переключился на вкладку Hex-View A, Выделен такой текст 20 BA 0C 00 00,
        а как найти 0×39 (brfalse) и заменить на 0x3A (brtrue), там ж одни цифры..

  17. А как потом сохранить изменение в exe? а то нажимаю на сохранить а оно сохраняет файл .idb.
    Спасибо!

  18. Доброго времени суток, Kaimi.

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

  19. Kaimi может еще защита проверяется когда начинается рассылка, а то при составлении списка получателей, Сooke получает только один акк, а дальше просто висит.
    Большое спасибо за твои старания!

    1. А зачем общий деобфускатор использовать? Я в SAE открывал и отдельно деобфусцировал строки в интересующих меня процедурах и все.

    1. Вообще, если хочется что-то более фундаментальное узнать в этой области, то лучше почитать статьи на краклабе и васме

      1. Еще вопрос. Какой версии IDA используешь? (можно линк)
        Как я понял Hex-редакторе правим оригинальны ехе-шник, так?

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

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