JS奇淫技巧:数值的七种写法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS奇淫技巧:数值的七种写法相关的知识,希望对你有一定的参考价值。

JS奇淫技巧:数值的七种写法

JS奇淫技巧:挑战前端黑科技,数值的七种写法,能全看懂的一定是高手

你知道吗?在JS编程中,数值可以有很多种写法。

第一种写法:

一般情况而言,数值就是数值。

比如:

var a = 1;

你可知,这个1可以有很多种变形的写法,甚至是变态的写法。

第二种写法:

var a= +!!;

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算

即:1变成了+!!。

数值1为什么能用+!!来表示呢?原因如下:

在JS语法中,!是布尔值false,强制转换成数字为0,!!则是true,用+号做强制转换,变成数值即为1。

以此类推:

2=(+!!)+(!!)

3=(+!!)+(!!)+(!!)

111=+((+!!)+[]+(+!!)+(+!!))

第三种写法:

var a=266119^266118;

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_02

即:将异常运算的结果,等于我们使用的数值。

这也就意味着,同一个数,比如1,可以有多种异或写法,比如:

var a=596219^596218;

var a=115812^115813;

第四种写法:

var a = function (s, h)

return s ^ h;

(719028, 719029);

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_03

也就是把第三种写法中的异或运算变成函数,将异或的两个数以参数的形式传入,在函数中运算并返回数值结果。

第五种写法:

把第三种写法中的亦或运算转成AST(抽象语法树)。

var a = ast("type":"File","program":"type":"Program","body":["type":"ExpressionStatement","expression":"type":"BinaryExpression","left":"type":"NumericLiteral","value":115812,"operator":"^","right":"type":"NumericLiteral","value":115813]);

console.log(a);

JS奇淫技巧:数值的七种写法_js代码_04

变成AST之后,还得带一段执行AST的代码,也就是AST的解释器。

当然,这里是简单的仅解析异或运算的解释器:(AST解释器的雏形)

function ast(node)

if(node.type == "File")

return ast_excute(node.program);

if(node.type == "Program")

return ast_excute(node.body[0]);

if(node.type == "ExpressionStatement")

return ast_excute(node.expression);

if(node.type == "BinaryExpression")

var left_value = node.left.value;

var right_value = node.right.value;

var operator = node.operator;

if(operator == "^")

return left_value ^ right_value;

此操作,等于将异或运算代码编译为AST,再带了一个AST解释器运行它。

第六种写法

Eval的使用。

直接的写法:

var a = eval(1);

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_05

Eval的变形写法:

var a = window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)](1); console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_06

对方法四的代码做升级,也可加入eval(238, 238, 238); opacity: 0.6;">

var a = function (s, h)

return eval(String.fromCharCode(115, 32, 94, 32, 104));

(678405, 678404);

console.log(a);

JS奇淫技巧:数值的七种写法_js代码_07

即:把return s ^ h用eval(238, 238, 238); opacity: 0.6;">

var a = [].constructor.constructor("return 1")();

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_08

升级一下,对return语句进行编码以隐藏关键字:

var a = [].constructor.constructor("\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0031")();

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_09

再升级,将constructor字符也隐藏:

var a = []["\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072"]["\\u0063\\u006f\\u006e\\u0073\\u0074\\u0072\\u0075\\u0063\\u0074\\u006f\\u0072"]("\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0031")();

console.log(a);

JS奇淫技巧:数值的七种写法_构造函数_10

还有更复杂的写法:

var $ = ["\\u0061", "\\u0062", "\\u0063", "\\u0064", "\\u0065", "\\u0066", "\\u0067", "\\u0068", "\\u0069", "\\u006a", "\\u006b", "\\u006c", "\\u006d", "\\u006e", "\\u006f", "\\u0070", "\\u0071", "\\u0072", "\\u0073", "\\u0074", "\\u0075", "\\u0076", "\\u0077", "\\u0078", "\\u0079", "\\u007a", "\\u0028", "\\u0029", "\\u0027", "\\u0022", "\\u005b", "\\u005d", "\\u002e"];

var a = [][$[443650 ^ 443648] + $[169829 ^ 169835] + $[338738 ^ 338751] + $[745099 ^ 745113] + $[847761 ^ 847746] + $[986395 ^ 986378] + $[591407 ^ 591419] + $[989467 ^ 989465] + $[820242 ^ 820225] + $[848420 ^ 848426] + $[782593 ^ 782608]][$[972307 ^ 972305] + $[406834 ^ 406844] + $[838220 ^ 838209] + $[317151 ^ 317133] + $[799896 ^ 799883] + $[655841 ^ 655856] + $[333562 ^ 333550] + $[745730 ^ 745728] + $[843076 ^ 843095] + $[151776 ^ 151790] + $[832229 ^ 832244]]("\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0031")();

console.log(a);

JS奇淫技巧:数值的七种写法_异或运算_11

这个方法的原理,在之前的文章《JS奇淫技巧:alert有几种写法?》一文中有详细讲解,有兴趣的朋友可以去翻看那篇文章。

以上所述技术,由JShaman团队提供,JShaman是专业的JS代码混淆加密服务提供方,本文实现的功能大多数已在JShaman官网提供。

JS奇淫技巧:数值的七种写法_js代码_12

到此时,还记的本文的标题吗?

请注意:

[][$[443650 ^ 443648] + $[169829 ^ 169835] + $[338738 ^ 338751] + $[745099 ^ 745113] + $[847761 ^ 847746] + $[986395 ^ 986378] + $[591407 ^ 591419] + $[989467 ^ 989465] + $[820242 ^ 820225] + $[848420 ^ 848426] + $[782593 ^ 782608]][$[972307 ^ 972305] + $[406834 ^ 406844] + $[838220 ^ 838209] + $[317151 ^ 317133] + $[799896 ^ 799883] + $[655841 ^ 655856] + $[333562 ^ 333550] + $[745730 ^ 745728] + $[843076 ^ 843095] + $[151776 ^ 151790] + $[832229 ^ 832244]]("\\u0072\\u0065\\u0074\\u0075\\u0072\\u006e\\u0020\\u0031")();

这是数值1。

这便是JS代码混淆加密的魅力,让别人无法看懂你的代码!让他人看到你的代码时,只能会发出“哇”的惊呼,而不敢轻易维护你的代码,无从下手啊。JS代码的安全性得到了大大的提升。

这些变态的写法,你能看懂几种呢?

或者你有什么新奇的手法?评论区交流一下吧。

以上是关于JS奇淫技巧:数值的七种写法的主要内容,如果未能解决你的问题,请参考以下文章

单例模式的七种写法,你都知道吗?

设计模式单例模式的七种写法

Java单例模式的七种写法

很多人不知道的Python 炫技操作:条件语句的七种写法

单例模式的七种写法

单例模式的七种写法