高级进阶:混淆加密

混淆加密


什么是加密

加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。

什么是混淆

混淆,在JS代码中添加大量奇怪的语法组成的语句,使其难以阅读。 如果你不想开源你的JS,那么在JS发布前,就需要对代码进行混淆处理,使其难以阅读。

JS现状

JS本身就属于开源语言,导致JS作者辛辛苦苦写出来的代码得不到保护。大多数作者并没有加密经验,JS代码得不到有效的保护,极易容易被修改。包括但不限于修改版权、复制算法等。

加密混淆的具体实现方式

  1. 将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“oO00o”这样的符号,使得阅读的人无法根据名字猜测其用途。
  2. 重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。
  3. 打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。

加密混淆的常用方案

本文将以下列js作为例子加密

 toast("Hello Js")

1. 原始加密方案

将js源码使用十六进制或八进制编码编码,再用eval函数嵌套解密执行。

eval("\\x74\\x6f\\x61\\x73\\x74\\x28\\x22\\x48\\x65\\x6c\\x6c\\x6f\\x20\\x4a\\x73\\x22\\x29")

2. Base64加密

将js采用base64编码,再套用base64解码以及配合eval函数解密运行。

eval(String(new java.lang.String(new android.util.Base64.decode("dG9hc3QoIkhlbGxvIEpzIik=",2))))  

3.网络上常用的加密

将js字符串以及逻辑运算拆开,采用复杂的混淆算法加密。

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}(' 2("0 1")\\n\\n',62,3,'Hello|Js|toast'.split('|'),0,{}));

4.JsIDE根据上一种方案改进的加密

原理与上一种基本相同,看样子似乎是加密了字符串。

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]},eval("'evˇalˇuaˇtor'.slice(0,5).replace('ˇ','')")];e=function(){return'\\\\w+'};c=1};k[c]=eval(k[c]);while(c--)if(k[c])p=p.replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return void k[++c+1](p)}(' 2("0 1")\\n\\n',62,3,'Hello|Js|toast'.split('|'),0,{}));

5. JsFuck加密

这是一种疯狂的加密方案,采用6个字符()+[]!来表示所有字符,一般不建议采用。- 由于篇幅限制,这里采用toast(1)的加密结果

(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]

各种加密混淆方案的对比

\u\x base64 web Jside jsFuck
文件大小 扩大到6倍 扩大到1.5倍 扩大1K 扩大1K 扩大100+倍
解析速度 明显卡顿 略微卡顿 略微卡顿 略微卡顿 异常卡顿
执行速度 基本无影响 基本无影响 基本无影响 基本无影响 明显卡顿
防在线解密
支持JS类型 全部 全部 部分 部分 全部

总结

  1. 任何加密都会是以牺牲性能为代价换取安全度的,请合理使用加密混淆。
  2. JS加密混淆只是一种手段,在大神级人物面前,任何加密都将灰飞烟灭

链接

注:部分文字来自JsIDE,百度百科,CSDN


image

最后由 内个谁 编辑

讲道理很多加密一个个print就能解决

  • 5
    帖子
  • 494
    浏览

与 Auto.js 的连接断开,我们正在尝试重连,请耐心等待