| 关键词: 混淆 属性 错误 代码 阵列 下图 字符串 运行 console 赋值 |
在JS混淆加密过程中,一般会将对象属性由“点调用”转为“数组字符串”。如:console.log,转为console[“log”],再对“数组字符串”进行“字符串阵列化”,再加密阵列。最后形成一个类似a[b[c]](d)的变形函数。 而在某些特殊情况下,比如对象使用是在最外层,无法阵列化处理,这里则只能降低一些保护等级,采用如unicode化、十六进制化的方式进行混淆。 如,将console.log(1)转化为console["\x6c\x6f\x67"]("\u0031")。 在实现这个功能时,最初曾参考了某本清华大学出版社发行的书: 实际测试发现,这里存在错误,书中给出的方案和例程,是不能运行的。 如下图: 上两图中展示的是以下原始代码经混淆后的执行: 由此可见,混淆过程错误,导致生成的内容错误,代码无法运行。 其原因,是由于stringLiteral生成的变量直接赋值给node的property属性,导致属性值错误。 如下图右侧部分: 注:这里使用的是Balel操作AST(抽象语法树)。 而正确的属性,应该是如下图所示: 也就是说:代码中的赋值方法,与正确的代码ast不符,不但value值错误,还缺少extra,以及其下的raw、rawValue属性。 那么,正确的代码应该是: 运行: 混淆结果: 运行效果: 成功实现。 |
| 本文出处: https://www.toutiao.com/a7010312545034715679/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|