jsfuck
http://lz12366.iteye.com/blog/961062
一. 可变变量
先介绍一下php中的可变变量,简单理解来说就是设置为的变量还是变量的意思,有一点嵌套的感觉,实现的时候就在加一个$就可以了
要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。
类的属性也可以通过可变属性名来访问。可变属性名将在该调用所处的范围内被解析。例如,对于 $foo->$bar 表达式,则会在本地范围来解析 $bar 并且其值将被用于 $foo 的属性名。对于 $bar 是数组单元时也是一样。
- 注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。
二. 超全局变量
超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量。
然后就到了非常精妙的时刻了,有才有才。
js加密的过程,可以慢慢理解。
- $先赋值为一个空数组 (后面会被覆盖)
- __ = ![] + [] = false + [] = "false" 这里利用了javascript运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串
- 在计算[]时,需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1。
Java代码
参考:
~3 = -4
~[3] = -4
~[3,2] = -1 (无法转为数字)
~"3" = -4
~"abc" = -1
因此: _ = ---~[] = ---(-1) = --1 = -~-(-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字 - !''是true,使用+$将其变为字符串 "true"
- 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[]] = "true"[1] + "true"[0] = "rt"
- __[_] = "false"[3] = "s"
- ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[/] = "[object Object]"[1] = "o"
- 这里把$覆盖为 [[]]["s"+"o"+"rt"]。注意这里[[]]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是,$ = [[]]["sort"] = [[]].sort = Array.prototype.sort。
- 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。
接下来介绍js的7种加密方式
引自于https://blog.csdn.net/doulinxu/article/details/60766242
一:最简单的加密解密
二:转义字符""的妙用
三:使用Microsoft出品的脚本编码器Script Encoder来进行编码 (自创简单解码)
四:任意添加NUL空字符(十六进制00H) (自创)
五:无用内容混乱以及换行空格TAB大法
六:自写解密函数法
七:错误的利用