Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can someone explain me how jjencode works and if is good to use it on my code

Can someone explain me how http://utf-8.jp/public/jjencode.html works and if is good to use it on my code? The first time I tried it I thought that I needed to have some kind of algorithm in my code to use it, but it works on every site. What is happening?

I already read the source code but I don't understand it.

like image 864
Manuel de Leon Avatar asked Dec 06 '25 16:12

Manuel de Leon


1 Answers

Here is the commented script http://corkami.googlecode.com/svn-history/r399/trunk/misc/jjencode.txt

// this is a commented source of a jjencode script
// jjencode, http://utf-8.jp/public/jjencode.html

// reference: Peter Ferrie, 2011, http://pferrie2.tripod.com/papers/jjencode.pdf

// for reference,
// alert("Hello, JavaScript" )
// is encoded as 

// $=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\"\\"+$.__$+$.__$+$.___+$.$$$_+(![]+"")[$._$_]+(![]+"")[$._$_]+$._$+",\\"+$.$__+$.___+"\\"+$.__$+$.__$+$._$_+$.$_$_+"\\"+$.__$+$.$$_+$.$$_+$.$_$_+"\\"+$.__$+$._$_+$._$$+$.$$__+"\\"+$.__$+$.$$_+$._$_+"\\"+$.__$+$.$_$+$.__$+"\\"+$.__$+$.$$_+$.___+$.__+"\\\"\\"+$.$__+$.___+")"+"\"")())();


// preliminary points

// (a + "") gives the string representation of a

// [] = empty array. 0 by value, -1 with ~ => ~[] = -1
// as a string, ![] gives  'false'

// {} = empty object.
// as a string, {} gives '[object Object]'

// if a is a x-long array, a[x] is 'undefined' as a string. same for absent properties.

// "" is an empty string. !"" returns 'true' as it is indeed 'null'


// now let's start with the actual code

// creating $ variable with a value.
 $=~[]; // $ = -1

 // defining properties of a $ object.
 $ =
 {
   ___:++$,             // 0, $ = 0

   $$$$:(![] + ””)[$],        // 0th char of 'false',           => 'f'

   __$:++$,             // 1, $ = 1 now...

   $_$_:(![] + ””)[$],        // 1st char of 'false'            => 'a'

   _$_:++$,             // 2...

   $_$$:({} + ””)[$],         // 2nd char of '[object Object]'  => 'b'

   $$_$:($[$] + ””)[$],       // 2nd char of 'undefined'        => 'd'

   _$$:++$,             // 3...

   $$$_:(!”” + ””)[$],        // 3rd char of 'true'             => 'e'

   $__:++$,             // 4

   $_$:++$,             // 5

   $$__:({} + ””)[$],         // 5th char of '[object Object]'  => 'c'

   $$_:++$,             // 6

   $$$:++$,             // 7

   $___:++$,            // 8

   $__$:++$             // 9
 };

// => in order, ___, __$, _$_, _$$, $__, $_$, $$_, $$$, $___, $__$, $_$_, $_$$, $$__, $$_$, $$$_, $$$$ are now equal to 0...F,
// note they are just binary numbers with character substitution

$.$_ =
    ($.$_ = $ + ””)[$.$_$] +              // 5th character of '[object Object]'  => $.$_ = 'c'
    ($._$ = $.$_[$.__$]) +                // 1st character of ...                => $._$ = 'o'
    ($.$$ = ($.$ + ””)[$.__$]) +          // 1st char of 'undefined'             => $.$$ = 'n'
    ((!$) + ””)[$._$$] +                  // 3rd char of 'false'                 => 's'         // poor s, we don't save it...
    ($.__ = $.$_[$.$$_]) +                // 6th char of '[object Object]'       => $.__ = 't'
    ($.$ = (!”” + ””)[$.__$]) +           // 1st char of 'true'                  => $.$  = 'r'
    ($._ = (!”” + ””)[$._$_]) +           // 2nd char of 'true'                  => $._  = 'u'
    $.$_[$.$_$] +                         // 5th char of '[object Object]']      => 'c'         // hey, we already have a c !
    $.__ +                                // 't'
    $._$ +                                // 'o'
    $.$;                                  // 'r'

// => $.$_ = 'constructor'


$.$$ =
    $.$ +                       // 'r'
    (!”” + ””)[$._$$] +         // 'true'[3] => 'e'
    $.__ +                      // 't'
    $._ +                       // 'u'
    $.$ +                       // 'r'
    $.$$;                       // 'n'

$.$ =
    ($.___)[$.$_][$.$_];        // (0)[constructor][constructor]


// summary of $ at this point

// $ = {}
// $.___  = '0';
// $.__$  = '1';
// $._$_  = '2';
// $._$$  = '3';
// $.$__  = '4';
// $.$_$  = '5';
// $.$$_  = '6';
// $.$$$  = '7';
// $.$___ = '8';
// $.$__$ = '9';
// $.$_$_ = 'a';
// $.$_$$ = 'b';
// $.$$__ = 'c';
// $.$$_$ = 'd';
// $.$$$_ = 'e';
// $.$$$$ = 'f';

// $.$_ = 'c'
// $._$ = 'o'
// $.$$ = 'n'
// $.__ = 't'
// $.$  = 'r'
// $._  = 'u'

// $.$_ = 'constructor';
// $.$$ = 'return';
// $.$ = (0)[constructor][constructor]



// and finally, the only line of call

$.$(
    $.$(
        $.$$ + ”\”” + ENCODED + ”\””
        )()
    ) ();

//
(0)[constructor][constructor](
    (0)[constructor][constructor](
        return + " + ENCODED + "
        )()
    )()

// 'equivalent' to eval(eval(ENCODED))


// encoding
// !"#$%&’()*+,-./:;<>=?@[]^_`{|}~  as is
// 0123456789abcdeftou => as $ properties. Ex : 'babe' = $.$_$$ + $.$_$_ + $.$_$$ + $.$$$_
// other ascii chars: as \xxx (octal) encoding. Ex: 'A' = char(65) = \101 = "\\" + $.__$ + $.___ + $.__$
// unicode chars as \u????. ex: 'sea', \u6d77 as "\\" + $._ + $.$$_ + $.$$_$ + $.$$$ + $.$$$

// so in the end, it's just defining a $ object and executing an eval on a string, that is built character by character.

// to confirm, here is a small imperfect python decryption script

// import sys
// start = r'$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+'
// end = r'+"\"")())();'
// 
// with open(sys.argv[1], "rb") as f:
//     r = f.read()
// 
// r = r.replace(start, "").replace(end, "")
// print r
// 
// subst = [
//     ['$.$___','8'],
//     ['$.$__$','9'],
//     ['$.$_$_','a'],
//     ['$.$_$$','b'],
//     ['$.$$__','c'],
//     ['$.$$_$','d'],
//     ['$.$$$_','e'],
//     ['$.$$$$','f'],
//     ['$.___','0'],
//     ['$.__$','1'],
//     ['$._$_','2'],
//     ['$._$$','3'],
//     ['$.$__','4'],
//     ['$.$_$','5'],
//     ['$.$$_','6'],
//     ['$.$$$','7'],
//     ['$.$_', 'c'],
//     ['$._$', 'o'],
//     ['$.$$', 'n'],
//     ['$.__', 't'],
//     ['$.$', 'r'],
//     ['$._', 'u'],
//     [r'"\\"' , '\\'],
//     ["\"\\\\\\\\\"", "\\\\"],
//     ["+", ""],
//     ]
// 
// for s in subst:
//     r = r.replace(s[0], s[1])
// 
// r = r.replace("+", "")
// print r

// Ange Albertini, BSD Licence 2011
like image 180
user478249 Avatar answered Dec 08 '25 05:12

user478249



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!