Что такое обфускация я уже писал вкратце в статье Отключение обновления темы в WordPress, цитирую — проще говоря, это запутанный код, написанный на JavaScript, функциональность которого очень сложно/невозможно проанализировать без деобфускации — «разпутывания». Здесь же расскажу, как обфускацию опознать среди другого кода, для чего применяется и стоит ли ее использовать начинающим, но считающим себя матерыми программистам.
И так, теперь подробнее. Что такое обфускация? Как подсказывает Википедия:
Обфуска́ция (от лат obfuscare — затенять, затемнять; и англ obfuscate — делать неочевидным,запутанным, сбивать с толку) или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
«Запутывание» кода может осуществляться на уровне алгоритма, исходного текста и/или ассемблерного текста. Для создания запутанного ассемб- лерного текста могут использоваться специализированные компиляторы, использующие неочевидные или недокументированные возможности среды исполнения программы. Существуют также специальные программы, производящие обфускацию, называемые обфускаторами (англ. Obfuscator).
Обычно обфускацию в JavaScript-коде довольно легко определить. Она может выглядеть примерно так:
<script language=»javascript» type=»text/javascript»>var OII=’=sTKpUGchN2cl9FKlBXYjNXZuVHKlRXaydnL05WZtV3YvR2OpETSshCZslGaDRmb
lBHch5yTJxmC70FMblyJkFWZodCKl1WYOdWYUlnQzRnbl1WZsVEdldmL05WZtV3YvR
GI9AyTJxGIyFmdKsTKMJVVuQnbl1Wdj9GZoQnbl52bw12bDlkUVVGZvNmbltyJ9wmc1
ZyJrkiclJnclZWZy5CduVWb1N2bkhCduVmbvBXbvNUSSVVZk92YuV2Kn0jZlJnJnsyJr9
WPjJ3c0V2Z/8SbvNmLlRXYjNXdmJ2b51mLpBXYv8iOwRHdodCI9AyYyNnLxkEbKsT
KnQHcpJ3YzdCK05WZtVGbFVGdhVmcj5CduVWb1N2bkBSPgETSsBichZ3OnU0MlQHc
pJ3Yz9yQzUSRzUidpR2QzUSRzUCdwlmcjN3QzUyJ9UGchN2cl9FIyFmd’;var _0x84de=[«ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=»,»»,
«charAt»,»indexOf»,»fromCharCode»,»length»];function _1OO(data){var _1l0lOI=_0x84de[0];var o1,o2,o3,h1,h2,h3,h4,bits,i=0,enc=_0x84de[1];do{h1=_1l0lOI[_0x84de[3]](data[_0x84de[2]](i++));h2=_1l0lOI[_0x84de[3]](data[_0x84de[2]](i++));h3=_1l0lOI[_0x84de[3]](data[_0x84de[2]](i++));h4=_1l0lOI[_0x84de[3]](data[_0x84de[2]](i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64){enc+=String[_0x84de[4]](o1);} else {if(h4==64){enc+=String[_0x84de[4]](o1,o2);} else {enc+=String[_0x84de[4]](o1,o2,o3);} ;} ;} while(i<data[_0x84de[5]]);;return enc;} ;function _1l0(string){var ret=_0x84de[1],i=0;for(i=string[_0x84de[5]]-1;i>=0;i—){ret+=string[_0x84de[2]](i);} ;return ret;} ;eval(_1OO(_1l0(OII)));</script>
хотя в оригинале это всего лишь тег <div>. Согласитесь, так сразу и не скажешь :) Так же, часто перед абракадаброй пишут write.(абракадабра). Я такое нередко встречаю в коде бесплатных шаблонов, где ссылки зашифрованы с помощью алгоритма base64. Например,
write.(PGEgcmVsPeKAiyJub2ZvbGxvdyIgaHJlZj3igIsiaHR0cDrigIsv4oCLL+KAi2Rpc2MtYy5ydS/ig IthLnBocCIgdGFyZ2V0PeKAiyJfYmxhbmsiPuKAi9CQ0L3QtdC60LTQvtGC0YvigIs8L2E+4oCL)
Расшифровать его можно, например, через онлайн-дешифратор http://base64.ru
Но бывают и совсем извращенные методы обфускации, например, такой (взято с хабрахабр):
([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]])(+[])
Если Вы пришли на блог, чтобы научиться обфускации и обфусцировать какой-то код, проще воспользоваться готовыми средствами, например, воспользоваться этим сайтом.
Если же Вы хотите научиться ручной деобфускации, могу посоветовать вроде и не плохую, но довольно сложную для понимания статью на секьюритилаб.
Итого: Обфускацию используют для того, чтобы затруднить изменение и понимание работы кода. Например, в части кода, которая отвечает за безопасность. Но практически любой обфусцированный код можно деобфусцировать, если «долго мучиться», поэтому — обфускация далеко не всегда оправдана. Особенно, если Вы потом сами, по прошествии долгого времени, решите свой код видоизменить (не думайте, что если этот код писали Вы, то всегда вспомните, как он устроен — он довольно быстро забывается, именно поэтому матерые программисты всегда пишут подсказки в комментариях к своему коду, а не для того, чтобы новички программирования потом смеялись над ними, мол, даже свой код разобрать не могут).
Обфускация действительно оправдана, например, в бесплатных шаблонах, ведь каждый программист (да и любой человек, в принципе) хочет, чтобы его труд был хоть как-то оплачен, пусть даже ссылками с никому не известного сайта/блога — и то хлеб, как говориться…