Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Полиморфный обфускатор (https://javascript.ru/forum/misc/26636-polimorfnyjj-obfuskator.html)

InSys 16.03.2012 00:57

Полиморфный обфускатор
 
Ребят, вообщем мне тут задачу дали, написать полиморфный обфускатор. Его цель - динамически зашифровывать JS, так чтобы максимально усложнить написание программы которая могла бы этот JS расшифровать. Т.е. повторюсь цель не прятать JS от антивирей, а цель максимально усложнить получение значения некой переменной из заобфусцированного кода.

В интернете нагугливается полиморфный криптор-обфускатор JavaScript/HTML/VBS, но, к сожалению, он заобфусцированн, и разобраться как он работает в таком виде, практически нереально.

Вообщем подкиньте, пожалуйста, идеи как такое можно будет реализовать.

devote 16.03.2012 01:00

Цитата:

Сообщение от InSys
В интернете нагугливается полиморфный криптор-обфускатор JavaScript/HTML/VBS, но, к сожалению, он заобфусцированн, и разобраться как он работает в таком виде, практически нереально.

Если есть мозги, в любом коде можно спокойно разобраться. Лично меня еще не один обфускатор не останавливал, когда мне нужно было что-то выяснить.

InSys 16.03.2012 01:04

Цитата:

Сообщение от devote (Сообщение 163416)
Если есть мозги, в любом коде можно спокойно разобраться. Лично меня еще не один обфускатор не останавливал, когда мне нужно было что-то выяснить.

Обфускацию я то снял, это не такая-то проблема, но разобратся в получившейся мешанине кода - очень сложно.

Да и мне желательно понять саму суть алгоритма, идею полиморфной обфускации, если можно так сказать.

devote 16.03.2012 01:27

Цитата:

Сообщение от InSys
но разобратся в получившейся мешанине кода - очень сложно.

Цитата:

Сообщение от InSys
Да и мне желательно понять саму суть алгоритма, идею полиморфной обфускации, если можно так сказать.

Дык отформатируй мешанину и смотри что надо. Не знаю как для других браузеров, но для оперы есть плагин который форматирует говнокод в нормальный вид https://addons.opera.com/ru/addons/e....0/?display=en

Aetae 16.03.2012 01:41

/g javascript beautifier

InSys 16.03.2012 07:57

Ребят, да код то я отформатировал, но все равно разобратся в нем - гемор еще тот.

Я прошу помочь с возможными идеями которые мне могут помочь при написании СВОЕГО обфускатора, кто уже сталкивался с подобными задачами?

monolithed 17.03.2012 15:13

InSys, проявите фантазию:

___ = '';_____ = ~!![];____ = !![]|[];eval((___ + +{})[~(_____ )] + (![] + ___)[~(_____ )+____] + (___ + !!(____))[~(_____ )+~(_____ )+____] + (___ + !!(____))[____] + (___ + !!(____))[+[]])(____) //alert(1)

monolithed 17.03.2012 16:27

Или вот тоже самое только без ключевых слов совсем:

___ = '';____ = !![]|[];_____ = ~!![];____________ = !![];_____ = ~____________;____ = ____________|[];______ = (___ + {});________ = (___ + ____________);_________ = (____________)[![]];__________ = ~(_____ )+____;__ = ______[__________ * __________ + ____________] + ______[____] + (___ + (_________))[____] + (___ + ![])[~(_____ ) +____ + ____________] + ________[+[]] + ________[____] + (___ + (_________))[+[]] + ______[__________ * __________ + ____________] + ________[+[]] + ______[____] + ________[____];[][__][__]('_', ((___ + +{})[~(_____ )] + (![] + ___)[~(_____ )+____] + (___ + !!(____))[~(_____ )+~(_____ )+____] + (___ + !!(____))[____] + (___ + !!(____))[+[]]) + '(_)')(____); //alert(1)


Разберите, тут все очень просто.

9xakep 17.03.2012 17:47

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)

monolithed 17.03.2012 17:58

Цитата:

Сообщение от 9xakep
словами что тут все легко ты мне бросил вызов!

Ну в правду же легко. Если что-то не понятно задавайте вопросы, но лучше попробуйте сами понять.

9xakep 17.03.2012 18:05

Для вас да, для меня нет)
По крайней мере, я узнал что такое
!!,~,| Даже интересно стало)

9xakep 17.03.2012 18:34

Вообще не врубаюсь в смысл записи:
__2 = ______6[__________10 * __________10 + ____________12]

При подстановке получаем
__2 = '[object Object]'[ -3 * -3 + 1]

__2 = '[object Object]'[10]

Это же undefined!? Хотя стоп...забил в оперу: (''+{})[-3*-3+1] = 'j'. Почему?!

nerv_ 17.03.2012 18:47

Цитата:

Сообщение от 9xakep
Что такое "!!" так и не понял

двойное отрицание - приведение к логическому типу.
Цитата:

Сообщение от 9xakep
// | возвращает 1(typeof === Number) если хотя бы один из операндов true.

Нет, это поразрядное ИЛИ, в связи с чем операция ниже
____4 = !![] | [];

видится мне аналогичной
____4 = 1 | 0;

Т.е. как-то так:
!false | []
true | []
1 | 0

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

9xakep 17.03.2012 18:50

Вы опоздали малость, я с этим уже разобрался...
Но все равно спасибо

9xakep 17.03.2012 18:59

Так-с...тепеь разбрался что такое
(''+{})[10] = 'j'
Благодоря тесту:
'abc'[1] = 'b'
'abc'[2] = 'c'
Что получается у строки можно символ брать как у массива?!

monolithed 17.03.2012 19:01

Цитата:

Сообщение от 9xakep
Что получается у строки можно символ брать как у массива?!

Получается, что можно :)

nerv_ 17.03.2012 19:16

Цитата из Флэнагана:
Цитата:

В некоторых реализациях JavaScript отдельные символы могут извлекаться из строк (но не записываться в строки) при обращении к строкам как к массивам, в результате вызов метода charAt() может быть записан следующим образом:
last_char = s[s.length – 1];

Однако этот синтаксис не стандартизован в ECMAScript v3, не является переносимым и его следует избегать.

9xakep 17.03.2012 19:34

Увы сколько не пытался его прочитать(эл. версию) так дальше меток и не продвинулся

9xakep 17.03.2012 20:09

<script>
alert('j' + 'n' + 's' + '1'[0] + undefined + 'u' + 'j' +  '1'[0] + 'o' + undefined) // __
</script>

Тэк-с...либо я где-то ошибся...либо так и должно быть

monolithed 17.03.2012 20:25

Цитата:

Сообщение от 9xakep
Тэк-с...либо я где-то ошибся...

Ошибся)

9xakep 17.03.2012 20:47

Начал заново) За 20 минут расшифровал все переменные, без помощи тестов, только проверял)

9xakep 17.03.2012 20:50

Сижу 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

9xakep 17.03.2012 20:58

[][__2][__2]
А вот этого я уже в упор не понимаю.
('_' *!* , */!* ((___3 + +{})[~ (_____5)] + (![] + ___3)[~ (_____5) + ____4] + (___3 + !! (____4))

Что значит эта запятая? И еще вы это сам писали или это распространенный обфускатор в интернете?

monolithed 17.03.2012 22:27

Цитата:

Сообщение от 9xakep
[][__2][__2]

Двойки на конце не должно быть.
Цитата:

Сообщение от 9xakep
А вот этого я уже в упор не понимаю.

Потому что цифры на концах лишние, точнее, должно быть так:
______[____] -> ______[1]

Цитата:

Сообщение от 9xakep
Что значит эта запятая?

Как все расшифруете поймете. :)
Цитата:

Сообщение от 9xakep
И еще вы это сам писали или это распространенный обфускатор в интернете?

А что там писать? У меня минут 5 на это ушло, может еще меньше.

9xakep 17.03.2012 22:35

Эм...цифры это я поставил, они означают сколько черточек
__ = __2
___ = ___3. Эти цифры ничто иное, как измененные названия переменных)
Нет я просто непонимаю:
[]['constractor']['constractor'] - это же ошибка!?

monolithed 17.03.2012 22:40

Цитата:

Сообщение от 9xakep
[]['constractor']['constractor'] - это же ошибка!?

должно быть так:
[]['constructor']['constructor']

9xakep 17.03.2012 22:59

Да не в написании дело))

9xakep 17.03.2012 23:10

[]['constructor']['constructor']('_', 'alert' + '(_)')(1);
Я просто не понимаю смысл этой записи, раньше такого не встречал. Как это в нормальный вид то перевести?

Раед 17.03.2012 23:13

Цитата:

Сообщение от 9xakep
Нет я просто непонимаю:
[]['constractor']['constractor'] - это же ошибка!?

вообщето нет.
[] - массив
массив['constractor'] - возвращает функцию Array
функция['constructor'] - возвращает функцию Function

Раед 17.03.2012 23:14

Цитата:

Сообщение от 9xakep
[]['constructor']['constructor']('_', 'alert' + '(_)')(1);
Я просто не понимаю смысл этой записи, раньше такого не встречал. Как это в нормальный вид то перевести?

(function(_){
alert(_)
})(1)

Раед 17.03.2012 23:16

9xakep,
альтернативный способ создания функций

9xakep 17.03.2012 23:25

Спасибо О_о
Есть у кого ссылка, чтобы почитать про эти constractor'ы?
Раед,ты читаешь мои мысли)

Раед 17.03.2012 23:31

Цитата:

Сообщение от 9xakep
Есть у кого ссылка, чтобы почитать про эти constractor'ы?

http://learn.javascript.ru/constructor

monolithed 17.03.2012 23:39

Цитата:

Сообщение от 9xakep
[]['constructor']['constructor']('_', 'alert' + '(_)')(1);

Иными словами (как уже написал выше Раед), в нормальном виде это будет выглядеть так:
Function('_', 'alert(_)')(1);

9xakep 17.03.2012 23:42

А если я в такой ф-ии:
[]['constructor']['constructor']('alert(1)')()

Захочу кроме alert'a еще что нибудь добавить, как тогда?
[]['constructor']['constructor']('alert(1) \n alert(2)')()

Так что ли? И что серьезные скрипты подобным образом и обфусицируются? (слово то какое-то дебильное) Не муторно?

Раед 17.03.2012 23:51

Цитата:

Сообщение от 9xakep
Захочу кроме alert'a еще что нибудь добавить, как тогда?
1 []['constructor']['constructor']('alert(1) \n alert(2)')()

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

9xakep 17.03.2012 23:54

Щас попробую)
[]['constructor']['constructor']('alert(1); alert(2); var a = 3; alert(a)')()

Not bad..

InSys 17.03.2012 23:56

Ребят, простите, но это все полная хрень.

Мне нужна идея для ПОЛИМОРФНОГО обускатора. Нужно смочь сделать так чтобы невозможно было написать автоматический ДЕобфускатор. А то что вы привели выше, все это снимается относительно простеньким скриптом.

monolithed 18.03.2012 00:11

Цитата:

Сообщение от InSys
Нужно смочь сделать так чтобы невозможно было написать автоматический ДЕобфускатор.

Ну так запутайте код как вам нужно, примеру через XOR операцию, и пр. методы криптографии.
В любом случае, все более-менее нормальные бьютификаторы приведут код в порядок доступный для дешифровки.

Раед 18.03.2012 00:18

Цитата:

Сообщение от InSys
так чтобы невозможно было написать автоматический ДЕобфускатор

в любом случае ваш код будет выполняться => дешифровываться и интерпретироваться браузером => следовательно расшифровать код можно всегда


Часовой пояс GMT +3, время: 02:09.