特殊混淆案例的还原

处理基于 javascipt-obfuscator 的混淆,还有其他混淆方式, 例如: AAEncode JJEncode JSFuck

AAEncode 的还原

AAEncode 是一种 JS  代码混淆算法, 利用它, 我们可以将 JS 代码转换成颜文字表示 JS 代码

这里有一个示例网站 https://utf-8.jp/public/aaencode.html

可以看到一个简单的 "Hello, JavaScript" 被转换成了很长的颜文字, 代码被混淆的面目全非

但实际上, 混淆后的代码其实还是遵循了 JS 语法的, 只不过其中的一些变量被替换成了表情符的样子。

这里我们看一个示例网站 :https://spa11.scrape.center/  这是一个 NBA 球星网站, 展示了球星的一些数据, 但与此同时, 每个球星的信息面板上都对应了一串字符, 我们把鼠标移动到面板上就可以看到

实际上这些字符包含了一些规律,其结果其实和这些球星的数据有关

可以看到, Index 页面引入了一些标准库, 正常情况下应该不会出现在这里面。最后, 我们发现页面还引入了一个 JS 文件 main.js ,下面我们看看 main.js 里面都有什么

一整行的颜文字

当我们尝试格式化的时候,发现无法格式化

这其实就是 AAEncode 混淆,那么怎么才能看懂这些代码

我们可以先观察一下这些代码的规律。 从代码的前后两端入手,可以看到开头基本上都是

 ゚ω゚ノ= /`m´)ノ ~┻━┻  ,结尾基本上都是 (゚Д゚)[゚o゚]) (゚Θ゚)) ('_')  因为这段 JS 代码是可以运行的, 那么它一定符合 JS  语法的。 但最后是以 括号结尾的, 按照 JS 的语法,可以判定前面的整体是一个方法的声明,就比如类似这样的代码

(function(a) {console.log('hello', a)})('world')

前面是一个方法的声明,然后整个大括号括起来,最后再传入一个参数调用,运行结果如下

hello world

其实 AAEncode 的原理也是将前面 的内容装换位一个方法的声明, 最后传入一个参数来调用执行,只不过最后的参数是一个 下划线 而已

对于上面的例子,假如我们不知道 (function(a) {console.log('hello', a)}) 这个方法声明究竟是怎么写的,我们可以将其输出在控制台上,看下运行效果

可以看到这个方法的声明就被打印出来了

对于 AAEncode 来说,我们可以试着将最后的 (‘_’)去掉,将前面的代码输出到控制台上

可以看到这个方法被解析除了“真正面目” ,当然这里还是不好观察, 我们可以进一步将方法转换为字符串, 在后面加一个 toString 方法的调用

这时我们发现这个方法的声明被转化为了字符串,内容一目了然

将代码整理后格式化一下,就能得到如下结果

function anonymous() {

        const players=[

                {

                name:'凯文-杜兰特',

                image:'durant.png',

                birthday:'1988-09-29',

                height:'208cm',

                weight:'108.9KG'

                },

.....

new Vue({

        el:'#app',

        data:function( {

                return{players,key:'nCQ7ywzJVEqGTTxncPFJzXv8juDWwPMrZAr'}

        },

        methods:{

                getToken(player){

                let key=CryptoJS.enc.Utf8.parse(this.key);

                const{name,birthday,height,weight}=player;

                let base64Name=CryptoJS.enc.Base64.stringify(

                        CryptoJS.enc.Utf8.parse(name)

                );

                let encrypted=CryptoJS.DES.encrypt(

                        `${base64Name}${birthday}${height}${weight}`,

                        key,

                        {mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7}

                  );

                return encrypted.toString()

          }

        }

     })

}

这里我们发现一个 getToken 方法,逻辑也十分清晰, 就是将球员的名字,生日,身高,体重经过处理之后再进行 DES 加密, 加密密钥就是 key , 其值就是

nCQ7ywzJVEqGTTxncPFJzXv8juDWwPMrZAr

DES 加密之后返回即可

JJEncode 的还原

JJEncode 也是一种 JS 代码混淆算法, 其原理和 AAEncode 大同小异,利用它,我们可以将 JS 代码转换成颜文字表示的 JS 代码

这里有一个示例网站: https://utf-8.jp/public/jjencode.html

可以看到这个代码包含了很多的 $ , 看起来可读性也很差,但实际上也是遵循一定的 JS 语法

接下来我们看一个示例网站:https://spa10.scrape.center/  网站和上一个一样,只是源码是经过 JJEncode 混淆的

其实,JJEncode 混淆的解决方案和 AAEncode 差不多。 最后可以看到也是一个 () , 所以我们把 () 去掉,粘贴到控制台输出

运行结果相似,可以在后面加上 toString 方法

后面的操作方法和上面一样

JSFuck 的还原

JSFuck 也是一种特殊的混淆方案, 是基于开源的 JSFuck 库来实现的,其样例可以参考;

https://www.jsfuck.com

我们可以看到 alert(1) 代码被转换成了 [],(), + , ! 的 JS 代码

其中官方说明了,它是基于如下几个等价变量实现的

  • false => ![]
  • true => !![]
  • undefined => [][[]]
  • NaN => +[![]]
  • 0 => +[]
  • 1 => +!+[]
  • 2 => !+[]+!+[]
  • 10 => [+!+[]]+[+[]]
  • Array => []
  • Number => +[]
  • String => []+[]
  • Boolean => ![]
  • Function => []["filter"]
  • eval => []["filter"]["constructor"]( CODE )()
  • window => []["filter"]["constructor"]("return this")()

通过如上变量的组合,再加上一些小括号处理优先级,就可以将任意 JS 代码转换为我们所看到的混淆代码。

但这次不想 AAEncode 和 JJEncode 那样了, 这次混淆代码需要稍微花点时间来解析混淆

示例网站: https://spa12.scrape.center/  这个和前面的相比也仅仅是 main.js 不同,其内容是经过 JSFuck 处理的

但是观察代码发现最后不是 () 

可以看到,这里最后的小括号后面还跟了一个小括号,这样我们就没法像前面那样,将最后的小括号去掉了

那我么稍微退一步,看看右边最后的小括号匹配的是左边那个小括号

复制 main.js 中的代码,到  Online JavaScript beautifier  点击红框里的格式化

2. 将格式化好的代码复制到 vs code 中

然后在扩展程序中搜索  Bracket Pair Colorizer 表示已经弃用,点击设置,把 false 改成 true 

回到代码区 选中最后一个小括号, 就会有一条线指向 另一半的括号,顺着找就好了

然后将两个括号中间的内容复制,粘贴到控制台输出

我们又看到了熟悉的代码,其类型就是一个字符串。

然后我们把刚刚复制出来的代码删除,把剩下的代码粘贴到控制台输出

发现是 undefined 表示执行成功,但是没有返回结果,然后我们去掉最后的一对小括号

这时候看到是一个 eval 方法, 是 JS 中定义的原生方法,传入一段 JS 字符串,利用 eval 就可以执行了

所以第一部分的运行结果就是字符串,把他传给 eval 方法, 自然就可以执行对应逻辑了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值