Процесс обфускация, его алгоритмы, процесс деобфускации [intro] Причиной создания сего топа заключается в том, что сам недавно столкнулся с таким термином, как обфускация...и на удивление, мало кто знает что это такое вовсе... Посему мною было принято решение опубликовать тему об этом, собранную из разных источников...к тому же на а4ате об это мало что написано...вернее почти ничего... Надеюсь, что все-таки правильно все "собрал"... [Что такое обфускация?] Обфускацией (от английского obfuscation — буквально «запутывание») называется совокупность методик и средств, направленных на затруднение анализа программного кода. Существуют различные типы обфускаторов: одни занимаются интерпретируемыми языками типа Perl или PHP и «корежат» исходные тексты (удаляют комментарии, дают переменным бессмысленные имена, шифруют строковые константы и т.д.), другие «перемалывают» байт-код виртуальных машин Java и .NET, что технически сделать намного труднее. Более развитые обфускаторы вламываются непосредственно в машинный код, «разбавляя» его мусорными инструкциями и выполняя целый ряд структурных (реже математических) преобразований, изменяющих программу до неузнаваемости. Фактически, это полиморфные генераторы, известные еще со времен царя Гороха. Проблема в том, что полиморфный генератор может за считанные секунды сгенерировать хоть миллиард бессмысленных команд, перемешав их с несколькими килобайтами полезного кода, что позволяют современные процессоры и жесткие диски. Пусть даже с потерей эффективности, но всем уже давно наплевать на эффективность. Дизассемблеры еще не научились [удалять «мусор»] в автоматическом режиме, а проанализировать мегабайты кода вручную нереально. Нужны передовые методики реконструкции потока управления, расплавляющие «замусоренный» код и разделяющие его на «полезные» и «бесполезные» фракции. Их нет даже на уровне «теоретического понимания». Хотя кое-какие идеи на этот счет имеются (например наложение маршрута трассировки на графы зависимостей по данным), до практической реализации еще далеко. Обфускация конкретно досаждает хакерам, препятствуя реконструкции алгоритмов и быстрому взлому защит, но эти проблемы меркнут перед ситуацией в антивирусной индустрии. Чтобы взломать программу, анализировать ее алгоритм в общем-то необязательно. Зато обнаружить зловредный код (он же malware) без этого уже не удастся! Приведем пример: Вот пример исходного метода (перед обфускацией): Code: private void CalcPayroll(SpecialList employeeGroup) { while(employeeGroup.HasMore()) { employee = employeeGroup.GetNext(true); employee.UpdateSalary(); DistributeCheck(employee); } } А вот результат (после): Code: private void _1(_1 _2) { while(_2._1()) { _1 = _2._1(true); _1._1(); _1(_1); } } Попробуйте поймите смысл алгоритма после обфускации. На это уйдет время – надо узнать, что за классы принимают участие, попробовать понять их назначение, в общем предстоит большой труд. В этом задача обфускации – затруднить для понимания исходный код, запутать и устранить логические связи в коде. [Плюсы и минусы] Плюсы: * Обфускаторы делают дизассемблированный код тяжелым для изучения, превращая IsLicensed() в x(). * Некоторые обфускаторы используют баги ILDASM для защиты от дизассемблинга в нем (Salamander). * Некоторые обфускаторы даже конвертируют код в native код, делая бесполезным дизассемблинг (Salamander). * Некоторые обфускаторы шифруют и пакуют ваш exe и иже с ним referenced сборки в один exe-файл, так что размер программы может уменьшиться 2-4 раза и не поддается дизассемблингу (Thinstall). Минусы: * Продукт остается дизассемблируемым. * Собрать сборку после дизассемблинга не составит труда. * IL код – доступный для чтения и понимания по сравнению c ассемблерным. * «Защита» обфускаторов, которые используют баги ILDASM будут бессильны перед дизассемблерами других разработчиков. [Алгоритмы процесса обфускации] Алгоритм обфускации в большинстве случаев рассматривается как алгоритм, которого должен придерживаться обфускатор (независимая программа, которая осуществляет процесс обфускации над переданным ей кодом). На данный момент существуют различные алгоритмы осуществления процесса обфускации, начиная от общих (абстрактных) алгоритмов процесса обфускации и заканчивая более продвинутыми. Эти алгоритмы создавались в соответствии с возможностями того или иного языка программирования, и на сегодня большинство из них адаптировано непосредственно под языки программирования высокого уровня. Ниже представлено короткое описание некоторых из них. Алгоритм Колберга ("Collberg`s algorithm"). Данный алгоритм оперирует следующими входными значениями: * программа "А" состоящая из исходных или объектных (двоичных) файлов "{С1,С2}". * стандартные библиотеки, используемые программой "{L1,L2}". * набор трансформирующих процессов "Т{Т1,Т2}". * определенный фрагмент кода "S", который извлекается из программы "А", и который непосредственно будет подвержен трансформации. * набор функций "Е{Е1,Е2}" которые будут определять эффективность применения определенных трансформирующих процессов "{Т1,Т2}" к фрагменту кода "S". * набор функций "I{I1,I2}" которые будут определять важность фрагмента кода "S", и в зависимости от этого будут задавать определенное значение переменной "RequireObfuscation" (чем "S" важнее тем эта переменная будет хранить большее значение). * две числовые переменные "AcceptCost" > 0, "RequireObfuscation" > 0, где первое хранит информацию о доступном максимальном увеличении системных ресурсов по требующихся программе "А" после того как она подвергнется обфускации, а вторая переменная будет хранить значение требуемого уровня осуществления обфускации (чем важнее фрагмент кода "S", тем это значение должно быть больше). Алгоритм Колберга имеет такую последовательность операций: 1. Загрузка элементов "{С1,С2}" программы "А". 2. Загрузка библиотек "{L1,L2}". 3. Осуществление обфускации над программой "А", путем выделения фрагмента кода "S" и определения наиболее эффективного процесса трансформации для него. Этот этап повторяется до тех пор, пока не будет, достигнут требуемый уровень обфускации "RequireObfuscation" или допустимое увеличение ресурсов "AcceptCost". 4. Генерация трансформируемой программы "А`". Алгоритм Колберга считается общим алгоритмом осуществления !процесса обфускации (то есть он не определяет, как именно должен осуществляться, тот или иной !метод обфускации), ниже будет рассмотрен более специализированный алгоритм, так как он описывает последовательность осуществления одного из методов обфускации, а именно обфускации управления. Chenxi Wang`s алгоритм. В качестве входных данных алгоритм принимает типичную процедуру, написанную на языке высокого уровня. Процесс обфускации каждой такой процедуры состоит из трех этапов: * создание графа потока управления этой процедуры (граф задаётся множеством блоков и множеством связей соединяющих их), после чего граф разбивается, путем замены циклических конструкций в нем на конструкции типа "if (условие) goto", (Рис. 0100). * нумерация всех блоков в графе, и добавление в код процедуры переменной (например "swVar") хранящей номер следующего выполняемого блока * приведение графа к однородному ("плоскому") виду (Рис. 0101) Выше описанный вариант алгоритма обфускации ("Chenxi Wang`s algorithm") является не сильно устойчивым, так как определить следующий выполняемый блок, нетрудно (он в нашем случае будет храниться в переменной "swVar"). Поэтому для повышения его устойчивости вводят массив (например "@gg"), содержащий помимо номеров блоков, не нужную информацию, в результате запись "$swVar = S6", можно заменить на нечто подобное "$swVar = $gg[$gg[1] + $gg[3]]". [Процесс деобфускации] Когда мы говорим о процессе обфускации, появляется вопрос: есть ли процесс обратный ему, который позволил бы злоумышленнику вернуть наиболее похожий первоначальный код программы, то есть код до обфускации? На этот вопрос трудно дать однозначный ответ, но такой процесс существует и носит он название деобфускация. Но другой не менее важный вопрос, это как его можно реализовать. С одной стороны к процессу деобфускации можно отнести процесс оптимизации программного кода, так как они оба, в той или иной степени, противоположны процессу обфускации. В процессе обфускации в программный код часто производиться добавление лишних операций, они обычно не коим образом не влияют на результаты работы самой программы, и предназначены для сбития с толку и усложнения процесса изучения кода программы потусторонними (BEYOND лицами. В свою очередь процесс оптимизации программного кода направлен на ликвидацию лишних операций, поэтому в частных случаях он может выступать в качестве квинтэссенции процесса деобфускации. Следует отметить, что большинство компиляторов в процессе компиляции исходного кода, автоматически осуществляют процесс оптимизации, поэтому если обфускация осуществляется над исходным кодом программы (обфускация высокого уровня), возникает определенная вероятность, того, что ее эффективность после, компиляции снизиться. Если же такой исходный код будет обрабатываться интерпретатором (то есть не будет подвержен компиляции), эффективность осуществленного процесса обфускации, не измениться. К процессу деобфускации, также можно отнести и процесс декомпиляции, который позволяет, имея двоичный код программы получить наиболее схожее исходное представление этого кода на языке высокого уровня, который более понятен человеку, это позволит упростить процесс реверсивной инженерии. (Следует отметить, что осуществление обфускации на низшем уровне, позволяет наиболее полно усложнить возможный процесс декомпиляции программного кода.) На сегодняшний день существует много материала касающегося как процесса оптимизации, так и процесса декомпиляции, поэтому он может быть использован для начального изучения процесса деобфускации. Ниже представлен простой образец классификации методов процесса деобфускации: * нахождение и оценка непрозрачных конструкций (предикатов), статический анализ, которых очень сложен. * сопоставление с образцом. Осуществляется различными способами, наиболее распространенны два из них. Первый, это когда берется несколько одних и тех же программ, прошедших процесс обфускации (так как процесс обфускации в большинстве случаев уникален, то их код также будет разный, хотя они и будут выполнять идентичные действия), и производиться сравнение фрагментов их кода, для выявления вставленного в процессе осуществления обфускации лишнего кода, который в последствии просто убирается. Второй способ сопоставления с образцом, осуществляется путем поиска в коде программы наиболее распространенных конструкций, применяемых в процессе обфускации. Такие конструкции могут, например, храниться и обновляться в соответствующей базе данных, или быть получены путем изучения работы самого обфускатора. * выделение в программе фрагментов кода, которые никоим образом не связанны с основными задачами, которые должна выполнять программа, то есть обнаружение ненужных (лишних) участков кода. * статистический анализ, заключается в динамическом анализе кода программы. Например, нахождение непрозрачных предикат может осуществляться путем выделения и дальнейшего изучения в анализируемом коде программы тех предикат, которые в процессе его выполнения возвращают всегда одно и тоже значение. Статистический анализ также может быть использован для оценки корректности осуществленного процесса деобфускации, для этого параллельно запускается программа "А" и программа, полученная в результате деобфускации "А`", им передаются эквивалентные входные данные, и происходит сравнение выходных. Если выходные данные одинаковы, то можно предположить, что процесс деобфускации был осуществлен правильно. * анализ потока данных, основывается на изучении того, как в процессе работы программы изменяются в ней данные (переменные, массивы). Cтатический анализ - это семейство технологий анализирования программ, где анализируемую программу фактически не требуется запускать, при этом требуемую информацию о ней получают при помощи специальных программ. Например, статический анализ программ, представленных в двоичном виде, можно осуществить, используя декомпилятор, а представленных в исходном виде, используя какой либо текстовый редактор. Технологии статического анализа отличаются от большинства существующих, ее основное качество заключается в том, что она является более комплексной, и базируется на семантике (определяет смысловое значение предложений алгоритмического языка) самого кода программы. Статический анализ позволяет исследовать программу, и выявить некоторые причины ее возможного поведения во время ее работы, то есть результаты статического анализа нельзя считать абсолютно точными. В свою очередь динамический анализ заключается в анализе/тестировании программы во время ее выполнения. Он считается точным, так как он исследует фактическое поведение программы, во время ее работы. Динамический анализ обычно осуществляется быстрее, чем статический, так как время его выполнения чаще всего зависит от скорости выполнения анализируемой программы. Статический же анализ обычно требует много вычислений и является длительным, особенно когда анализируются большие программы. Недостаток динамического анализа заключается в том, что полученные результаты могут не соответствовать результатам, получаемым при последующих запусках одной и той же программы. Основные проблемы деобфускации, связаны с требуемым количеством вычислений, и сложностью ее алгоритмов. Пример: Страница имеет след. исходный ход: Code: <html> <body> <script> var s = "Jgnnq\"Yqtnf#"; for(i = 0; i < s.length; i++) document.write(String.fromCharCode(s.charCodeAt(i)-2)); </script> </body> </html> Воспользовавшись программой Universal JavaScript Decoder от hunger.ru мы получаем следующее: Code: <html> <BODY> Hello World! </BODY></html> Это на примере обфускации HTML содержимого страницы и деобфускации [links] 1) _http://www.cyberguru.ru/dotnet/net-framework/net-obfuscation.html 2) _http://irc.uch.net/security/articles/obfus/ 3) _http://www.xakep.ru/magazine/xs/066/008/1.asp
это не статья, а копипастинг сплошной =/// лучше бы просто выложил статью LynX'а с которой ты скопировал большую часть материала...
Заметьте, поместил не в раздел "Наши статьи", это раз... Второе...сам недавно задался этим вопросом, и как можно было бы понять, сам еще только начинаю "плавать" в нем... Я просто-напросто попробовал собрать все самое нужное и основное в одну тему...о чем было написано в самом начале... Копипаст весь...ссылки откуда все брал привёл снизу...от себя практически ничего не добавлял, если ты это хотел услышать, но, повторюсь, посему тема и не в разделе "Наши статьи"...и поверь...на самом деле очень много народу не разу не слышали этого слова...
Напмнило местами статью Криса Касперски уж не помню какой давности. Все линки стоят, так что за сбор инфы в одну статью +
"научные" методы обфускации никогда не юзал, но более народные можно посмотреть тут: _https://forum.antichat.ru/thread31569.html
>> Заметьте, поместил не в раздел "Наши статьи", это раз... но и в чужие не поместил.. зачем вообще делать статью из кусков чужой статьи ? это вообще можно называть статьей ?? статья - это когда ты пишешь СВОИМИ словами тыкая пальцами в клавиши, а не делаешь копипаст двигая мышкой.. к тому же скопипастив кучу инфы из статьи Lynx'а, ты все же не вытащил оттуда самое интересное, из чего у меня сложилось впечатление, что ты сам не очень разобрался в этом вопросе.. >> Второе...сам недавно задался этим вопросом, и как можно было бы понять, сам еще только начинаю "плавать" в нем... скажи вот, зачем писать статьи о том, в чем сам еще не особо хорошо разбираешься? >> повторюсь, посему тема и не в разделе "Наши статьи"...и поверь...на самом деле очень много народу не разу не слышали этого слова... повторюсь и я - лучше бы ты взял статьи из тех ссылок, что ты привел, и поместил их в раздел "чужие статьи".. и познакомил бы таким образом обитателей ачата со значением слова "обфускация".. наполнять форум надо хорошим материалом...
Хоть и копипастинг но статейка хорошая + от меня. Но он же всё таки преложил хоть какие-то усилия, он всё нарезал, раскрасил и собрал всё в одно. Так что просто в статьях покатит
Совершенно ниипет кто это сделал, материал актуален - кому надо сохранил себе и положил болт на все разборки