Интересная задачка:)

Статус
Закрыто для дальнейших ответов.

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
тут недавно друг скинул интересную статейку по XSS.
так вот предлагаю решить и объяснить мой код на JS:
Код:
<script>u=~[];u={$:!(![])+"",$_:u.$_$--,_:(![])+"",_$:u.$_$,$_$:(![])*!(!([])),_$_:-~-~u.$_$,$$ : function(){},};
u.__=!(u);u.__+="";u.$_;u._$;u.$$$$ = u.$$$$+"";
_=(u.__)[++u.$_$]+(u._)[u._$_]+(!(![])+"")[(++u._$_)] + (u.$)[u.$_$] + (u.$)[(![])*(![])];__ = ((![]+"")[(u._$_)])
+"o"+(u.$)[u.$_$]+(u.$)[(![])*(![])];(c=[][__])()[_](!(![])+"!");</script>
Можете запустить, ничего страшного он не делает:) Но пропалить его сложновато-то как хсску:)

А когда решите, скажите, какие еще интересные возможности метапрограммирования на JS вам еще знакомы?
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Интересно:) А чем он зажат?

И ссылочку на статью в студию) Интересно ознакомиться)
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Нечем не сжат))) Код вручную написан))) Просто убрал переводы строк:)
Со статьей не интересно будет:( Я дам подсказки:

Код:
alert( !(![])+'o'); // выведет trueo
alert( (a=[]['sort']) ); // А вот эти строки две уже интереснее, сами посмотрите:)
alert( (a=[]['sort'])() );
Суть в том что конструктор функции это объект Window,
А так же все объекты в JS предоставляют доступ к своим элементам в виде массива:

Код:
k = {
  a : function(){
    alert('in a!');
  }
}
r = new k();
r['a'](); // in a!
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Придется немного раскрыть секрет:)
Код:
<script>
u=~[];
u={ //объект
 $:!(![])+"", //   ![] = false(boolean),    !(![]) = true (boolean), !(![])+"" = "true" (string)
 $_:u.$_$--,
 _:(![])+"", // так же как U.$ но возвращает строку "false"
 _$:u.$_$,
 $_$:(![])*!(!([])),
 _$_:-~-~u.$_$,
 $$ : function(){},
};
u.__=!(u);
u.__+="";
u.$_;
u._$;
u.$$$$ = u.$$$$+"";
_=(u.__)[++u.$_$]+(u._)[u._$_]+(!(![])+"")[(++u._$_)] + (u.$)[u.$_$] + (u.$)[(![])*(![])]; // тут получаем строку alert
__ = ((![]+"")[(u._$_)])+"o"+(u.$)[u.$_$]+(u.$)[(![])*(![])];// здесь мы собираем строку sort получая буквы так:
// u.$ = "true"; (u.$)[(![])*(![])] = (u.$)[ 0 ] = "t";
(c=[][__])()[_](!(![])+"!"); // (c=[][__])() = это объект window. window['alert']() = это вызов функции alert()
</script>
 

Ritsuka

Новичок
Регистрация
05.01.2010
Сообщения
4
Забавная задачка... Подсказки пропустил, ибо так не интересно :)

Код:
(c=[][__])()[_](!(![])+"!");

Это явно вызов alert, судя хотя бы по поведению скрипта.
Отладчик докладывает:
__ = "sort"
_ = "alert"

Получаем:

(c=[]["sort"])()["alert"](!(![])+"!");

![] = false
!(![]) = !(false) = true

Получаем:

(c=[]["sort"])()["alert"]("true!");

Что такое "(c=[]["sort"])()"? Это "object Window". Сама вселенная. Как мы до нее добрались через такую конструкцию? Пока опустим этот вопрос :)

Имеем:

window["alert"]("true!");

Тут мы имеем вызов по дереву оъектов - window["alert"] = alert(), т.е. это равноценно:

alert("true!");

Теперь посмотрим выше:

_=(u.__)[++u.$_$]+(u._)[u._$_]+(!(![])+"")[(++u._$_)] + (u.$)[u.$_$] + (u.$)[(![])*(![])]; // = alert

__ = ((![]+"")[(u._$_)])+"o"+(u.$)[u.$_$]+(u.$)[(![])*(![])]; // sort

Что это? Это хитрая посимвольная генерация двух слов. Опущу реверсинг каждой из переменных, просто приведу их значения:

u.__ = "false"
u._ = "false"
u.$ = "true"
u.$_$ = 0
u._$_ = 2

Еще задействован прием (!(![])+"" = "true"), уже описанный выше.

Так же важно учитывать, что инкремент "++" изменяет всю переменную, т.е. если при генерации буквы "a" u.$_$ было = 0, но после ++u.$_$ имеем u.$_$ = 1, что сказывается при генерации буквы "r".

При геренации последней буквы имеем выражение: (![])*(![]) = (false) * (false) = 0.

Таким образом, первая строка имеет вид:

_=("false")[1]+("false")[2]+("true")[3] + ("true")[2] + ("true")[0];

Что равноценно: 

_ = "alert";

Пусть вас не смущает имя переменной "_" - в JavaScript и не такое можно.

Вторая строка, совершенно аналогично первой, делает __ = "sort". Проанализируйте сами ;)

Теперь определения переменных, опущенные ранее:

u={
$:!(![])+"",                  // u.$ = "true"
$_:u.$_$--,                   // u.$_ = 0-- = -1 ~ NaN =Ъ
_:(![])+"",                   // u._ = "false",
_$:u.$_$,                     // u._$ = ""
$_$:(![])*!(!([])),           // u.$_$ = (false) * (true) = 0
_$_:-~-~u.$_$,                // u._$_ = 2  ~ вопрос на смекалку, почему? :)
$$ : function(){},};          // а это, видимо, для красоты :)

Далее отдельной строкой:

u.__=!(u);
u.__+="";

Делает u.__ = "false"

Итак имеем:
- генерация набора текстовых и числовых переменных
- сборка из них двух слов - sort и alert
- вызов метода alert для window с генерируемым тут же текстом "true!"
Сводные итоги анализа:

Для запутывания кода автор использовал следующие инструменты:
- использование класса (u) для хранения словарных ключей и счетчиков,
- использование мат. логики для скрытия истинных значений счетчиков и генерации ключей
- хитрая обфускация объекта window
- подмена классов массивами (что в JavaScript равноценно)
- нестандартные имена переменных в скрипте, "сбивающие с толку"

Скрипт оцениваю как интересную игру на 15 минут. Практической пользы нет :)
 

trueW3C

Поклонник Yii
Регистрация
04.03.2009
Сообщения
847
Практическая польза есть...скрываем JS и CSS от тех кто хочет скопировать сайт.
Тут генерится слово alert...прекрасно...называем дополнительный скрипт alert(без расширения), вызываем его, он вызывает другое....ещё можно его сжать...вообще будет)
 

Ritsuka

Новичок
Регистрация
05.01.2010
Сообщения
4
Есть только один способ скрыть JS и CSS на своем сайте - это вообще не выдавать из пользователю. Если же на сайте используются и нормально интерпретируются JS и CSS, значит они соответсвуют стандартам, а следовательно, не составляет труда их "позаимствовать". Тот же firebug аккуратно парсит CSS и раскладывает все по полочкам, как не обфусцируй. То же справедливо и для javascript, только там свои инструменты.

Максимум, что вы сделаете - это сильно запутаете алгоритмы и структуру, усложнив именно понимаение логики скрипта, и хорошо, если не потеряв при этом в его производительности. Опять же, есть кто-то очень захочет - и в этом разберется, пример выше тому доказательство ;)

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

Если же вы про автономных ботов, ворующих контент для дорвеев, то смею вас разочаровать - им глубоко плевать на css и javascript - им главное - текстовое "мясо" сайта :)

P.S. Мое личное имхо - всегда куда проще написать что-то с нуля, чем у кого-то заимствовать.
 

trueW3C

Поклонник Yii
Регистрация
04.03.2009
Сообщения
847
В браузере нельзя будет нажать сохранить страницу, она сохранится без стилей и JS.
95% умников не расшифруют это JS. Я не говорил про сохранность контента...я говорил про риперов
 

Ritsuka

Новичок
Регистрация
05.01.2010
Сообщения
4
В браузере нельзя будет нажать сохранить страницу, она сохранится без стилей и JS.
Это по вашему преимущество? оО Имхо, это огромный недостаток. Ради борьбы с какими-то рипперами, которые может быть никогда к вам и не зайдут, вы лишаете всех пользователей возможности сохранить на работе страничку вашего сайта на флешку и прочитать удобно дома, или, например, распечатать на другом ПК? Разумная ли это стоимость?

95% умников не расшифруют это JS. Я не говорил про сохранность контента...я говорил про риперов
Давайте определим с вами нашего "врага". Кто он, рипер вашего сайта, и какую цель по вашему он преследует?

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

trueW3C

Поклонник Yii
Регистрация
04.03.2009
Сообщения
847
На зарубежныx сайта дают возможность смотреть платные, сверстаные дизайны...защита слабей, но через браузер уже не сохранить...тот кто не знает JS вообще не сохранит...

Я кстати частенько тырю такие верстки с их сайтов...наивные) Но только ради дизайна и картинок...обычно переверстываю сам..их верстка ни одного раза на пришлась по душе
 

Ritsuka

Новичок
Регистрация
05.01.2010
Сообщения
4
Вот вы сами и ответили на свой вопрос... Кому надо - тот эту защиту обойдет запросто. Вот пример, как правльно продавать верстку и дизайн.
 

trueW3C

Поклонник Yii
Регистрация
04.03.2009
Сообщения
847
Тот кто знает как обойти защиту может и сам это сделать...а тот кто пытается стырить...обычно нихрена кроме азов не знает
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Защита js и css, бесмысленна, так как браузер все равно их расшифровывает для выполнения. Стандартного обфускатора хватит что бы защититься от новичка, но не более.
Данная тема интересна защитой от антивирусов, и позволяет вставлять код злоумышленнику, который не будет обнаружен как зловредный для пользователя.
Для меня это представляет просто еще один интересный способ, над которым стоит подумать, если интересно.
Это идея хороша в развитии, для специфических решений. Но ни как не для защита, а совсем наоборот... ;)

Как уже сказал Ritsuka
Код:
Скрипт оцениваю как интересную игру на 15 минут
 

kein

Частный случай
Регистрация
23.11.2009
Сообщения
446
Хаха)) Я был прав)) Аналогичная хсска http://habrahabr.ru/blogs/virus/80912/ вызов функций из контекста глобального объекта)))
 
Статус
Закрыто для дальнейших ответов.
Верх Низ