Полиморфный обфускатор
Ребят, вообщем мне тут задачу дали, написать полиморфный обфускатор. Его цель - динамически зашифровывать JS, так чтобы максимально усложнить написание программы которая могла бы этот JS расшифровать. Т.е. повторюсь цель не прятать JS от антивирей, а цель максимально усложнить получение значения некой переменной из заобфусцированного кода.
В интернете нагугливается полиморфный криптор-обфускатор JavaScript/HTML/VBS, но, к сожалению, он заобфусцированн, и разобраться как он работает в таком виде, практически нереально. Вообщем подкиньте, пожалуйста, идеи как такое можно будет реализовать. |
Цитата:
|
Цитата:
Да и мне желательно понять саму суть алгоритма, идею полиморфной обфускации, если можно так сказать. |
Цитата:
Цитата:
|
|
Ребят, да код то я отформатировал, но все равно разобратся в нем - гемор еще тот.
Я прошу помочь с возможными идеями которые мне могут помочь при написании СВОЕГО обфускатора, кто уже сталкивался с подобными задачами? |
InSys, проявите фантазию:
___ = '';_____ = ~!![];____ = !![]|[];eval((___ + +{})[~(_____ )] + (![] + ___)[~(_____ )+____] + (___ + !!(____))[~(_____ )+~(_____ )+____] + (___ + !!(____))[____] + (___ + !!(____))[+[]])(____) //alert(1) |
Или вот тоже самое только без ключевых слов совсем:
___ = '';____ = !![]|[];_____ = ~!![];____________ = !![];_____ = ~____________;____ = ____________|[];______ = (___ + {});________ = (___ + ____________);_________ = (____________)[![]];__________ = ~(_____ )+____;__ = ______[__________ * __________ + ____________] + ______[____] + (___ + (_________))[____] + (___ + ![])[~(_____ ) +____ + ____________] + ________[+[]] + ________[____] + (___ + (_________))[+[]] + ______[__________ * __________ + ____________] + ________[+[]] + ______[____] + ________[____];[][__][__]('_', ((___ + +{})[~(_____ )] + (![] + ___)[~(_____ )+____] + (___ + !!(____))[~(_____ )+~(_____ )+____] + (___ + !!(____))[____] + (___ + !!(____))[+[]]) + '(_)')(____); //alert(1) Разберите, тут все очень просто. |
monolithed,
словами что тут все легко ты мне бросил вызов! Первый раз занимаюсь подобной хренью, но я пойму что это значит! Первая часть рассуждений, все что в комментариях, строго мои мысли, и ничьи другие. И идут они в той послдедовательности, в которой пришли ко мне в голову ___3 = ''; // '' ____4 = !! [] | []; // | возвращает 1(typeof === Number) если хотя бы один из операндов true. Что такое "!!" так и не понял _____5 = ~ !! []; /* ~ Возвращает число в таком виде: -(m+1), где m - наше число. Появились предположения что такое "!!", например: var a = false; alert(!! a) // false alert([] | []) // 0, следовательно: [] == [] == false (ну это я так...для себя) var b = [] // мы уже знаем что это false alert(!!b) // true, так вот мое предположение: "!!" меняет с true на false и наоборот только у объектов */ ____________12 = !! []; // исходя из предыдущих рассуждений, это вернет true == 1 (это также для меня) _____5 = ~____________12; // смотрим что такое: "____________", это предыдущий пункт, рассчитаем по моей формуле: -(1+1) = -2. Эта переменная равна -2 /* Вдруг я заметил, что черта похоже с другой, и понял что есть еще один подводный камень: значения переменных еще и меняются!! В таком случае, уже с моими знаниями, можем сказать что вернет первая _____ и вторая _____: 1) ~ !! [] == -2; 2) -2 Она что также равняется -2?! Зачем... Ладно..поехали дальше */ ____4 = ____________12 | []; // так сейчас я уже все пронумеровал, и меня не обмануть) ____ = 1, после этого она также равняется единице ______6 = (___3 + {}); ________8 = (___3 + ____________12); _________9 = (____________12)[![]]; __________10 = ~ (_____) + ____4; __ = ______[__________ * __________ + ____________] + ______[____] + (___ + (_________))[____] + (___ + ![])[~ (_____) + ____ + ____________] + ________[+[]] + ________[____] + (___ + (_________))[+[]] + ______[__________ * __________ + ____________] + ________[+[]] + ______[____] + ________[____]; [][__][__]('_', ((___ + +{})[~ (_____)] + (![] + ___)[~ (_____) + ____] + (___ + !! (____))[~ (_____) + ~ (_____) + ____] + (___ + !! (____))[____] + (___ + !! (____))[+[]]) + '(_)')(____); //alert(1) |
Цитата:
|
Для вас да, для меня нет)
По крайней мере, я узнал что такое !!,~,| Даже интересно стало) |
Вообще не врубаюсь в смысл записи:
__2 = ______6[__________10 * __________10 + ____________12] При подстановке получаем __2 = '[object Object]'[ -3 * -3 + 1] __2 = '[object Object]'[10] Это же undefined!? Хотя стоп...забил в оперу: (''+{})[-3*-3+1] = 'j'. Почему?! |
Цитата:
Цитата:
____4 = !![] | []; видится мне аналогичной ____4 = 1 | 0; Т.е. как-то так: !false | [] true | [] 1 | 0 А в целом могу сказать, что разбирать даже не пытался, только бегло посмотрел. |
Вы опоздали малость, я с этим уже разобрался...
Но все равно спасибо |
Так-с...тепеь разбрался что такое
(''+{})[10] = 'j' Благодоря тесту: 'abc'[1] = 'b' 'abc'[2] = 'c' Что получается у строки можно символ брать как у массива?! |
Цитата:
|
Цитата из Флэнагана:
Цитата:
|
Увы сколько не пытался его прочитать(эл. версию) так дальше меток и не продвинулся
|
<script> alert('j' + 'n' + 's' + '1'[0] + undefined + 'u' + 'j' + '1'[0] + 'o' + undefined) // __ </script> Тэк-с...либо я где-то ошибся...либо так и должно быть |
Цитата:
|
Начал заново) За 20 минут расшифровал все переменные, без помощи тестов, только проверял)
|
Сижу 5 минут туплю, не могу понять, что такое constraktor)))
<script> ___3 = ''; // '' ____4 = !! [] | []; // 1 _____5 = ~ !! []; // -2 ____________12 = !! []; // true _____5 = ~____________12; // -2 ____4 = ____________12| []; // 1 ______6 = (___3+ {}); // '[object Object]' ________8 = (___3+ ____________12); 'true' _________9 = (____________12)[![]]; // true[false] = undefined __________10 = ~ (_____5) + ____4; // 2 __2 = ______6[__________10 * __________10 + ____________12] // '[object Object]'[2*2+true] = '[object Object]'[5] = 'c' __2 += ______6[____4] // '[object Object]'[1] = 'o' __2 +=(___3 + (_________9))[____4] // 'undefined'[1] = 'n' __2 +=(___3 + ![])[~ (_____5) + ____4 + ____________12] // 'false'[1 + 1 + true] = 'false'[3] = 's' __2 +=________8[+[]] // '1'[0] = 't' __2 +=________8[____4] // 'true'[1] = 'r' __2 +=(___3 + (_________9))[+[]] // 'undefined'[0] = 'u' __2 +=______6[__________10 * __________10 + ____________12] // '[object Object]'[2*2+true] = 'c' __2 +=________8[+[]] // 'true'[0] = 't' __2 +=______6[____4] // '[object Objet]'[1] = 'o' __2 +=________8[____4]; // 'true'[1] = 'r' alert(__2) </script> То что у меня получилось целостное слово, думаю озночает что я на верном пути. И это за 30 минут, радует :D |
[][__2][__2]А вот этого я уже в упор не понимаю. ('_' *!* , */!* ((___3 + +{})[~ (_____5)] + (![] + ___3)[~ (_____5) + ____4] + (___3 + !! (____4)) Что значит эта запятая? И еще вы это сам писали или это распространенный обфускатор в интернете? |
Цитата:
Цитата:
______[____] -> ______[1] Цитата:
Цитата:
|
Эм...цифры это я поставил, они означают сколько черточек
__ = __2 ___ = ___3. Эти цифры ничто иное, как измененные названия переменных) Нет я просто непонимаю: []['constractor']['constractor'] - это же ошибка!? |
Цитата:
[]['constructor']['constructor'] |
Да не в написании дело))
|
[]['constructor']['constructor']('_', 'alert' + '(_)')(1);
Я просто не понимаю смысл этой записи, раньше такого не встречал. Как это в нормальный вид то перевести? |
Цитата:
[] - массив массив['constractor'] - возвращает функцию Array функция['constructor'] - возвращает функцию Function |
Цитата:
(function(_){ alert(_) })(1) |
|
Спасибо О_о
Раед,ты читаешь мои мысли) |
Цитата:
|
Цитата:
Function('_', 'alert(_)')(1); |
А если я в такой ф-ии:
[]['constructor']['constructor']('alert(1)')() Захочу кроме alert'a еще что нибудь добавить, как тогда? []['constructor']['constructor']('alert(1) \n alert(2)')() Так что ли? И что серьезные скрипты подобным образом и обфусицируются? (слово то какое-то дебильное) Не муторно? |
Цитата:
|
Щас попробую)
[]['constructor']['constructor']('alert(1); alert(2); var a = 3; alert(a)')() Not bad.. |
Ребят, простите, но это все полная хрень.
Мне нужна идея для ПОЛИМОРФНОГО обускатора. Нужно смочь сделать так чтобы невозможно было написать автоматический ДЕобфускатор. А то что вы привели выше, все это снимается относительно простеньким скриптом. |
Цитата:
В любом случае, все более-менее нормальные бьютификаторы приведут код в порядок доступный для дешифровки. |
Цитата:
|
Часовой пояс GMT +3, время: 02:09. |