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

Воскресенье, 7. Ноябрь 2010
Раздел: C#, Социальные сети, автор:

В последнее время всё большее количество авторов “рекламного соц. софта” используют платформу .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 и прочие мультики.

Также рекомендую почитать

 Обсудить на форуме


Получать обновления на почту:     

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


  1. Zaicev :

    Я ошибся, прога не совсем работает, как только нажимаю Старт, оно провиряет на валид только одного акка и чет висит..

    Kaimi можешь глянуть как обойти изменение в защите (новая версия) ?
    http://actualspam.ru/download.php?name=pro

    [Ответить]


  2. Zaicev :

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

    [Ответить]


  3. Random :

    Zaicev

    Как решил проблему с деобфускатором? У меня такая же вылетает ошибка :(

    [Ответить]

    Zaicev:

    Переустановил .NET Framework 3.5

    [Ответить]


  4. Random :

    В чем проблема???
    http://pixs.ru/showimage/1JPG_2484429_1248087.jpg

    *.Net переустановил

    [Ответить]

    Kaimi:

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

    [Ответить]

    Random:

    Kaimi

    А Вы деобфусцировали только те 5 строк(51-55) или еще какие то?

    [Ответить]

    Kaimi:

    Не помню уже. А разница? Это же только для того, чтобы разобраться в логике работы программы и всё


  5. Random :

    Kaimi

    Ну так хочется, самому разобраться, понять :)
    Пытаюсь совместить приятное с полезным :)

    [Ответить]

    Kaimi:

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

    [Ответить]

    Random:

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

    [Ответить]

    Kaimi:

    IDA 5.5, не помню откуда взял, поищи на руборде или рутрекере. Да


  6. Random :

    0xb4fc и 0xcba

    не находит IDA в коде

    что делать?

    [Ответить]

    Zaicev:

    Нужно искать с большими буквами 0xB4FC и 0xCBA

    [Ответить]


  7. Diplomat :

    Сразу скажу софт того не стоит. Взломал своим способом. Пустая трата времени.

    [Ответить]


  8. fly :

    Помогите взломать, в долгу не останусь, 207-3нуля-816

    [Ответить]


  9. grom :

    при открытии ехе в IDA ,вылазит ошибка Can not set the target processor type "cli" как решить проблему?

    [Ответить]

    Kaimi:

    Версия иды какая?

    [Ответить]


  10. grom :

    5.5 качал с кряком

    [Ответить]

    Kaimi:

    У меня с ней все нормально, никаких дополнительных манипуляций не проводил

    [Ответить]


  11. IT :

    Автор обновил, все поменял. Статья не актуальна...

    [Ответить]

    Kaimi:

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

    [Ответить]

    IT:

    Хм. А подсказку можно? Там изменился способ активации. И он ее к тому же спрятал.

    [Ответить]

    Kaimi:

    А поискать не?
    ActualSpam_pro_v1._0::frmAudiencesChecker::GetInviteHash()


  12. IT :

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

    [Ответить]

    Kaimi:

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

    [Ответить]


  13. IT :

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

    [Ответить]

    Kaimi:

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

    [Ответить]

    IT:

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

    [Ответить]

    Kaimi:

    Так в чем проблема? На первой странице в комментариях была ссылка на оригинальную версию.


  14. IT :

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

    [Ответить]

    Kaimi:

    Не знаю, я не читал книг по программированию. Обычно гуглю и всё

    [Ответить]

    IT:

    Да бред. Все так говорят. Книги развивают, все равно что-то читал, кроме гугля.

    [Ответить]

    Kaimi:

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


  15. IT :

    Допустим. Но на каком сайте будет проще и информативнее?

    [Ответить]

    Kaimi:

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

    [Ответить]


  16. prtya :

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

    [Ответить]

    Kaimi:

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

    [Ответить]


  17. 99th :

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

    [Ответить]

    Kaimi:

    Почему часового то? Конкретно тут все просто, да и вроде бы в коде есть то ли проверка IP-сервера, то ли hosts-файла

    [Ответить]


  18. 99th :

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

    [Ответить]

    Kaimi:

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

    [Ответить]


  19. xfrzx :

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

    [Ответить]


Оставьте ваш комментарий