淘宝UA算法中exports应用技巧与算法执行流程
起初学习淘宝新版UA算法的文件时,基本上每个函数都要Google一下,包括看到exports时。根据关键词exports,google把我导向了js模块化编程,我在网上恶补了一番关于模块化编程的知识。然而我回头再来看代码时,发现淘宝UA算法中的exports只是一个普通的对象名称。但是正是这个普通的对象让淘宝UA算法如行云流水一般的流畅。
本系列文章的研究对象是淘宝新版的UA算法64.js,原文件的下载链接http://af.alicdn.com/js/cj/64.js(该链接已失效),该文件反混淆之后的文件的下载链接 http://pan.baidu.com/s/1o8ep0r4 。
64.js的其他功能分析参考链接如下:
该算法文件反混淆的思路请参阅淘宝UA反混淆之常量替换(201605_64.js)。
该算法文件的总体架构请参阅2016新版淘宝UA算法文件功能框架的粗浅分析。
window隐藏措施与事件驱动机制请参阅淘宝UA算法window隐藏技巧与事件驱动机制
UA来源信息加密方案请参阅淘宝UA算法UA来源信息加密方案浅析(201605)。
UA算法中exports分析
在学习js模块化编程知识时,我接触到了的node.js, exports和module.exports的概念。作为一个初学者,我十分疑惑,我并不能理解这些概念与UA算法中exports的关系。后来才明白node中有module对象, 而module中则内置了exports这个属性,node文件中同时内置了 exports = module.exports,所以可以直接在node的module文件中引用 exports。但是浏览器端的js中没有内置module和exports的概念。所以UA算法中的exports就是一个普通的对象名称,它可以是任意一个其他的字符串,例如livezingy。
在《2016新版淘宝UA算法的粗浅分析__js文件函数结构》中提到过淘宝UA算法的主函数是一个拥有15个参数(均有函数组成)的自执行的匿名函数,我们先来看看反混淆之后的主函数的函数体,如下图所示。主函数的函数体首先定义了对象e,然后是return语句。return语句有4个表达式,由逗号运算符连接,逗号运算符会将最后一个表达式的结果返回。这里的前3个表达式应该都是用于混淆代码的,最后一个表达式是t(0)。
由上图中的主函数结构图可知如下信息:
1. exports对象的作用就是让主函数参数中的函数可以输出变量或函数让外界来调用,应该也算是一种模块化编程的思想吧。
2. 主函数函数体中使用参数的形式为v.exports.n[u](v, v.exports, t),所以参数中的函数形式若为function(a,b,c),那么a=v, b=v.exports, c=t。
3. t(0)就是调用主函数中序号为0的参数,序号为0的参数的匿名函数为function (n, t, a){a(1).init();},因此接下来的执行流程应该是t(0)–>t(1)–>t(1).init()。
淘宝UA算法的执行流程
接下来我们来关注主函数中序号为1的参数的函数体,在notepad++中将其子函数收起来,其函数结构图如下图所示:
由该函数体可以知道,在序号为1的函数中会调用函数2~9,11~13,而其中函数13中会调用函数14,函数10作为加密函数会在各函数中更新UA时被调用。就这样奇妙,15个参数都被调用到了。