淘宝UA算法UA来源信息加密方案浅析(201605)

       淘宝UA算法文件架构与技巧并重,混淆与加密兼备,本文要分享的主题是UA来源信息的加密方案。2015年10月份淘宝的ua.js文件采用相同的加密方案来加密不同类型的UA来源信息,但2016年的淘宝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算法文件功能框架的粗浅分析

        模块化编程方案请参阅淘宝UA算法中exports应用技巧与算法执行流程

        window隐藏措施与事件驱动机制请参阅淘宝UA算法window隐藏技巧与事件驱动机制

       加密方案的架构

       虽然新版的淘宝UA算法文件对不同的信息定制了不同的加密方案,但是其加密方案的架构是相同的,涉及更新UA信息的每一处都使用了下图所示的架构。该架构示意图截取了主函数参数中序号1的函数中,处理浏览器调试信息的部分代码。

structure of encrypt

      该架构的特征如下:

      1. 函数两层嵌套调用

      上图架构示意图中内层函数名为St,在主函数参数中不同序号的函数使用该架构时,内层函数的名称会不一样。但不论其名称外在如何,该内层函数调用的都是是主函数参数中序号8的函数输出的名为process的子函数。process函数用于加密其参数中的信息。

      示意图中外层函数名为Mt,同内层函数一样,只要它在类似图中所示的架构中,不论其所在位置与名称如何,它调用的都是主函数参数中序号9的函数名为s的子函数。该函数负责将更新过的UA字符串赋值给当前页面ID给UA_InputId的元素且通过image回传服务器。

       2.内层函数的参数形式

       内层函数的参数形式为([], function (t){}, …… function(t){}),即数组+函数的混合形式。其中数组的长度与当前固定信息或事件的类型有关,不论数组长度如何,数组中第二个元素(上图数组的元素6)的作用是固定的。函数的个数我没有具体数过,与数组中第二个元素相关的函数的返回结果形式是charCodeAt类型,是数值,其他所有函数的返回结果都是fromCharCode类型,是字符串。

       加密函数process浅析

       加密函数process是主函数参数中序号8的函数中输出的子函数之一,该函数的每一句代码都是戏,所以我尝试对每一句代码都添加了注释。

       该加密函数的特征如下:

       1.下图中function(n)中的n仅包含加密架构示意图中的传入参数中的数组部分,并不包含其中的N个函数。为什么呀?我暂时不知道,不过我会尝试去了解,找到答案再来和大家分享。

       2.下图中的vat t=[].slice.call(arguments,1)中的t则包含了加密架构示意图中的传入参数的N个函数。

       3.根据数组n中的第二个元素定位并提取N个函数中返回值类型是charCodeAt类型的函数,然后删除数组n中的第二个元素,也删除t中的返回值为charCodeAt的函数,这种方式让我想到了“飞鸟尽良弓藏”。

       4.将改造后的数组n转换为字符串。

       5.根据上述步骤得到的内容对当前信息与过往信息加密并返回加密字符串。

       这种方式会让已有的UA信息不断的进行迭代加密,加密后的字符串几乎不存在被复原的可能。

process function

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Fork me on GitHub