快捷搜索:  汽车  科技

js怎么加密最好(对象属性调用十六进制化加密)

js怎么加密最好(对象属性调用十六进制化加密)其原因,是由于stringLiteral生成的变量直接赋值给node的property属性,导致属性值错误。由此可见,混淆过程错误,导致生成的内容错误,代码无法运行。实际测试发现,这里存在错误,书中给出的方案和例程,是不能运行的。如下图:上两图中展示的是以下原始代码经混淆后的执行:

在JS混淆加密过程中,一般会将对象属性由“点调用”转为“数组字符串”。如:console.log,转为console[“log”],再对“数组字符串”进行“字符串阵列化”,再加密阵列。最后形成一个类似a[b[c]](d)的变形函数。

而在某些特殊情况下,比如对象使用是在最外层,无法阵列化处理,这里则只能降低一些保护等级,采用如unicode化、十六进制化的方式进行混淆。

如,将console.log(1)转化为console["\x6c\x6f\x67"]("\u0031")。

在实现这个功能时,最初曾参考了某本清华大学出版社发行的书:

js怎么加密最好(对象属性调用十六进制化加密)(1)

实际测试发现,这里存在错误,书中给出的方案和例程,是不能运行的。

如下图:

js怎么加密最好(对象属性调用十六进制化加密)(2)

js怎么加密最好(对象属性调用十六进制化加密)(3)

上两图中展示的是以下原始代码经混淆后的执行:

js怎么加密最好(对象属性调用十六进制化加密)(4)

由此可见,混淆过程错误,导致生成的内容错误,代码无法运行。

其原因,是由于stringLiteral生成的变量直接赋值给node的property属性,导致属性值错误。

如下图右侧部分:

js怎么加密最好(对象属性调用十六进制化加密)(5)

注:这里使用的是Balel操作AST(抽象语法树)。

而正确的属性,应该是如下图所示:

js怎么加密最好(对象属性调用十六进制化加密)(6)

也就是说:代码中的赋值方法,与正确的代码ast不符,不但value值错误,还缺少extra,以及其下的raw、rawValue属性。

那么,正确的代码应该是:

js怎么加密最好(对象属性调用十六进制化加密)(7)

运行:

js怎么加密最好(对象属性调用十六进制化加密)(8)

混淆结果:

js怎么加密最好(对象属性调用十六进制化加密)(9)

运行效果:

js怎么加密最好(对象属性调用十六进制化加密)(10)

成功实现。

猜您喜欢: