JS代码安全之路:用JS对JS代码混淆加密( 四 )


图29:

JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
二进制表达式转为调用表达式即BinaryExpression节点转为CallExpression 。
先看效果:
图30,左侧为二进制表达式,右侧为调用表达式:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
二进制表达式AST形式:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
实现代码:
图31:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
调用表达式AST形式:
图32:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
代码中的这部分,即是将二进制表达式转化为调用表达式:
图33:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
布尔型常量值混淆代码及效果如下图:
图34:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
数值混淆代码及效果如下图:
图35:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
JS代码混淆加密,虽不至博大精深,但也属于高段位技术 。
在此分享部分浅显方案,以展现其实用效果,用于说明混淆加密手段对于JS代码加固的有效性 。此外,还有更多高端的防护手段,如JShaman应用的:平展控制流、时间限制、域名锁定、僵尸代码植入等 。
图36、JShaman的JS代码保护配置功能:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
防逆向措施:检测与对抗 。对JS代码进行混淆加密之后,代码安全度得到相当的加强,但还能更进一步,为了防止不法者进行逆向分析、破解,可在代码中加入防破解对抗功能 。这也是被JShaman应用的方案 。
  • 无限断点 。
JS当中有一个debugger指令,当处于调试工具中时,如在浏览器中,会形成断点,使调试中断,利用此特性,在程序中加入无限的debugger,可使代码无法被调试 。
图37、每100毫秒一个断点:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
浏览器中执行效果如下,当打开“调试器”时,程序会不停的中断,导致无法跟踪代码:
图38:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
时间差检测 。代码及执行效果如下图所示:
图39:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
检测原理是:
在代码中加入console.log输出和console.clear语句,未在调试工具中时,这两句代码执行是不需渲染显示的,执行耗时短,但假如在浏览器中打开了开发者工具,则会因为显示输出并清除的操作而消耗较多时间,这会被程序察觉出耗时异常,从而检测出是在被调试 。
专业的混淆加密:JShaman本文讲述了部分JS代码混淆加密技术及实现,更多更专业的防护方案未有尽述,这里再展示一段经JShaman保护的代码,领略专业级的JS代码安全 。
图40、测试代码准备进行混淆加密:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
图41、保护选项设置:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
图42、混淆加密后的JS代码:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
彩蛋:字节码加密技术 。提示:JS字节码(ByteCode)加密技术,理论可行,但通用性较差,在此仅做技术介绍,不推荐做为项目或产品正式使用方案 。
  • 字节码生成
在NodeJS中将JS代码生成字节码,方法很简单,需借助google的V8引擎,V8引擎内置有JS虚拟机 。通过v8虚拟机,将JS代码编译为字节码 。全程仅需十几行代码,如下图:
图43:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 
关键处是cachedData,即字节码 。
  • 运行字节码
V8虚拟机是能够识别和直接运行该字节码的 。
代码如下,如同创建字节码一样简单 。
图44:
JS代码安全之路:用JS对JS代码混淆加密

文章插图
 


推荐阅读