JS的eval函数解码分析

今天由于爬虫要分析一个网站的代码,所以看了下发现JS加密函数。在浏览器的JS脚本里经常看到这样的函数:

这是一种为了便于传输和混淆的转码方法。

其主体函数是:

之后的则是函数部分。

解密十分简单,网上到处都有,不过由于好奇心,想知其所以然,然而这每个字母都看得懂,合在一起就看不明白了,所以去网上找答案。

然而网上关于这个函数的说明却一个也没有,难道是这个一看就懂显而易见所以不需要额外说明吗?我不禁怀疑自己的智商。

不过突然想到外国的有没有,便翻墙去找,结果一找一大堆,看来国外的水平还是太低啊。

我对JS还只是看得懂代码的水平,eval这个函数是接受一个字符串str作为参数,并把此str当做一段javascript代码去执行,如果str执行结果是一个值则返回此值,否则返回undefined。如果参数不是一个字符串,则直接返回该参数。

而function()其实就像是一个匿名函数,所以先看下参数部分,以这个为例

一个逗号对应一个参数,p,a,c,k,e,d

p对应的是最小化的代码功能(有效载荷);

a对应的是基数,在解码有效载荷时将用作基数;(大部分都是62进制,为什么这样,后面会说)

c是字数,即k的个数;

k是关键字(用|分隔);

最后一部分是无关紧要的;

那么很显然函数执行的是替换部分,类似于哈夫曼编码,将名称替换掉。

这段代码有个递归函数,其实就是将10进制转换成62进制,为什么是62,因为0-9A-Za-z正好是62个,而且现在短网址算法好像就是用62进制的样子。为什么要这样写,我试了下toString好像不能转换62,做多只能36。

之后则是进行赋值:

对于每一个对象元素赋值,然后进行一次完全正则替换,两个\b是保证完全匹配的

知道了解密的原理是什么样的,那么加密的原理也就十分简单了。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180512G18EBK00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券