淘宝UA生成文件actionlog_js_ua.js学习笔记总结

       近期认真的学习了淘宝UA生成文件actionlog_js_ua.js,也逐一记录自己学习过程中的对淘宝UA一些认知,到今天算基本告一段落。因为边学习边记录,前面一些文章中可能会有一些疏漏,因此本文做一个汇总,记录一些自认为比较重要的学习心得和一些学习过程中的疑问。

       淘宝UA生成文件actionlog_js_ua.js主要是用于生成和更新UA,在更新UA的过程中,会根据当前网页的设置将UA相关信息回传至服务器,在整个文件执行过程中也有相应的异常处理机制,大致框图如下所示。


block diagram in ua.js

1. 重要全局变量一览表

       淘宝UA生成文件actionlog_js_ua.js涉及大量的全局变量,且这些变量名称都不能体现出变量的用途,因此初次看代码的同学会觉得云里雾里。这里我将该文件中比较重要的全局变量整理了一下,大家在查看前面的文章或者看代码时可以参考。不过这些变量名仅针对2015.10.30抓取的文件(js文件可以在这里下载),淘宝UA生成文件中变量名和函数名是经常会变的,乌云上关于淘宝的JSocket漏洞(2014年)报告文档中,有一个JScocket相关的函数,该函数名与我所学习的文件不同,但内容大致相同。

important variable in ua.js

        这里我想重点说一下变量sb81,与sb81相关的代码如下:

      变量sb81相关的代码执行过程大致如下:

      1.1    在函数xi3xrtq执行完成后,sb81=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n;

      1.2    xl6q =
dzpr(sb81)
执行完成后,x16q=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn0123;

      1.3    在首次更新UA字符串时,UAz字符串 =
xl6q[“substring”](53, 56) + wz1 + cu + zzs;
而实际上xl6q[“substring”](53, 56)是空字符串。所以sb81x16q也是淘宝的一个障眼法。

2. 重要函数一览表  

       与上一节中的变量一样,ua中的函数名也不能体现出函数的功能,所以这里列出来,大家在查看前面的文章或者看代码时可以参考。同理,该列表仅限于2015.10.30抓取的文件(js文件可以在这里下载)。

important function

3. 添加scripteval

      ua.js文件中有动态添加元素,也有window.eval的语句。据说在js文件中使用eval必须特别小心,后果大家都懂的。但是淘宝的这些使用方法我不敢妄论,这里把它们列出来给大家围观。函数q相关的代码请到ua.js中JSocket.getlso和JSocket.setlso代码分析中查阅。

add script

4. 与服务器交互

与服务器交互分为两种,一种是通过image对象统计用户访问信息,另一种是用Jsocket.setlso来写入相关信息。

通过image对象统计用户访问信息的方式执行频率较高,且回传给服务器的是与UA直接相关的信息,具体实现方法大家可以参考ua.js中用 image 对象实现页面访问统计;而setlso则仅在load事件处理函数中执行一次,且回传内容仅与函数执行时间相关,参考文章ua.js中JSocket.getlso和JSocket.setlso代码分析

5. 异常检测机制

异常检测机制包含load函数执行时的网络超时检测,参考ua.js中网络超时检测函数 wql 功能分析,文件执行过程中函数调用逻辑检测,参考ua.js中arguments.callee.caller的应用。检测到异常后,处理方式一致:接触各事件与其自定义处理函数的绑定,抛出异常。

6. 大话模拟UA

之前研究过C#模拟登录淘宝,我现在学习的actionlog_js_ua.js文件是当时验证模拟登录时期的文件。模拟时用的UA是某一次登录时抓取的UA,当时很长一段时间都是可以直接使用的,以此推论:

a.     
虽然文件中有大量涉及时间的元素加入
UA,当时服务器并不验证时间。

b.     
UA生成过程中,相关信息会周期性将UA相关信息回传至服务器。但最终验证时,该回传内容不会与最后使用的UA进行对比。因为C#模拟登录时,不会有load,mousemove,mousedown事件发生,所以不会有信息回传至服务器。

c.     
模拟登录时,服务器验证的应该是
UA中是否包含主要要素。所以理论上而言,UA应该是有机会模拟得到的。假如在C#中实现的话,可以先调用load处理相关函数获取固定信息,然后按照登录时的用户名和密码调用相应的keydown事件处理函数,在中间在穿插一些mousedownmousemove事件。当然这些可能只是我个人在胡言乱语,后续有时间且如果我能找到现在淘宝版本中的UA生成文件的话,我会尝试验证一下。

7. 关于ua.js的疑问

在整个文件中,我没有看懂的有三点,这三点在wqlvq4中均对应到唯一的特征值。

7.1 特征值12

  特征值12涉及到两处调用。其中一处的调用形式代码如下所示,此调用形式比较明确,与其他固定信息类的特征值调用方式类似,在load事件处理函数中调用,且在调用vq4之后会随即调用wql来检测网络是否超时

  另外一处的调用形式如下:

  该语句中vq4的执行条件: a.页面包含UA_Opt元素 b.
load
事件函数执行完成之后。C. 此处调用vq4之后不会调用wql。因UA_Opt是来源于当前访问页面的变量,据此推测,该函数会在当前访问页面设定Token时中被调用。

7.2 特征值17

特征值17仅有一处调用,在主动执行函数hp6中,涉及代码如下所示。

由代码可知,函数ey03赋值给UA_Opt[“setUM”]事件,推测结果与特征值12类似,该函数会在当前访问页面设定setUM时被调用。

7.3 特征值19

          特征值19经由一处调用,在load事件处理函数中。在我看来,这个特征值对应的信息就是4个随机数,但应该没有我想象的那么简单。有没有高手愿意指点一二呢?


Comments

  1. By 天下

    回复

    • By live

      回复

      • By 天下

        回复

        • By live

          回复

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Fork me on GitHub