淘宝UA生成文件actionlog_js_ua.js学习笔记总结
近期认真的学习了淘宝UA生成文件actionlog_js_ua.js,也逐一记录自己学习过程中的对淘宝UA一些认知,到今天算基本告一段落。因为边学习边记录,前面一些文章中可能会有一些疏漏,因此本文做一个汇总,记录一些自认为比较重要的学习心得和一些学习过程中的疑问。
淘宝UA生成文件actionlog_js_ua.js主要是用于生成和更新UA,在更新UA的过程中,会根据当前网页的设置将UA相关信息回传至服务器,在整个文件执行过程中也有相应的异常处理机制,大致框图如下所示。
1. 重要全局变量一览表
淘宝UA生成文件actionlog_js_ua.js涉及大量的全局变量,且这些变量名称都不能体现出变量的用途,因此初次看代码的同学会觉得云里雾里。这里我将该文件中比较重要的全局变量整理了一下,大家在查看前面的文章或者看代码时可以参考。不过这些变量名仅针对2015.10.30抓取的文件(js文件可以在这里下载),淘宝UA生成文件中变量名和函数名是经常会变的,乌云上关于淘宝的JSocket漏洞(2014年)报告文档中,有一个JScocket相关的函数,该函数名与我所学习的文件不同,但内容大致相同。
这里我想重点说一下变量sb81,与sb81相关的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
xi3 = function (sb) { var ulqc = 34; for (ulqc = ulqc + 31; ulqc <= 90; ++ulqc) { sb["push"](upc["String"]["fromCharCode"](ulqc)); } }; xi3(sb81); xrtq = function (sb) { var i = 90 while (i < 104) { sb["push"](window["String"]["fromCharCode"](i + 7)); ++i; } }; xrtq(sb81); dzpr = function (tu) { var e4 = ""; var o7w = 0; for (var o7w = 0; o7w < tu["length"] / 2 - 16; ++o7w) { e4 += "" + o7w; } for (var qv1 = 0; qv1 < 3; qv1++) { if (qv1 == 0) { var mbyh = o7w + tu["length"]; } else if (qv1 == 2) { e4 += window["String"]["fromCharCode"](mbyh - 15); } if (qv1 == 1) { e4 += window["String"]["fromCharCode"](mbyh - 19); } } return tu["join"](irt) + e4; }; xl6q = dzpr(sb81); |
变量sb81相关的代码执行过程大致如下:
1.1 在函数xi3和xrtq执行完成后,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)是空字符串。所以sb81和x16q也是淘宝的一个障眼法。
2. 重要函数一览表
与上一节中的变量一样,ua中的函数名也不能体现出函数的功能,所以这里列出来,大家在查看前面的文章或者看代码时可以参考。同理,该列表仅限于2015.10.30抓取的文件(js文件可以在这里下载)。
3. 添加script和eval
ua.js文件中有动态添加元素,也有window.eval的语句。据说在js文件中使用eval必须特别小心,后果大家都懂的。但是淘宝的这些使用方法我不敢妄论,这里把它们列出来给大家围观。函数q相关的代码请到ua.js中JSocket.getlso和JSocket.setlso代码分析中查阅。
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事件处理函数,在中间在穿插一些mousedown和mousemove事件。当然这些可能只是我个人在胡言乱语,后续有时间且如果我能找到现在淘宝版本中的UA生成文件的话,我会尝试验证一下。
7. 关于ua.js的疑问
在整个文件中,我没有看懂的有三点,这三点在wql和vq4中均对应到唯一的特征值。
7.1 特征值12
特征值12涉及到两处调用。其中一处的调用形式代码如下所示,此调用形式比较明确,与其他固定信息类的特征值调用方式类似,在load事件处理函数中调用,且在调用vq4之后会随即调用wql来检测网络是否超时
1 2 3 4 |
if(((ivsz["SendMethod"] & 1) > 0) || ((ivsz["SendMethod"]& 8) > 0)) { vq4([12, ivsz['TokenStr']]); } |
另外一处的调用形式如下:
1 2 3 4 |
UA_Opt["setToken"] = function(vd){ ivsz["TokenStr"] = UA_Opt["Token"]; vq4([12,vd]); }; |
该语句中vq4的执行条件: a.页面包含UA_Opt元素 b.
load事件函数执行完成之后。C. 此处调用vq4之后不会调用wql。因UA_Opt是来源于当前访问页面的变量,据此推测,该函数会在当前访问页面设定Token时中被调用。
7.2 特征值17
特征值17仅有一处调用,在主动执行函数hp6中,涉及代码如下所示。
1 2 3 4 5 6 7 8 9 |
if(ivsz["UMID"]){ UA_Opt["setUM"]=ey03; } ey03 = function (wz1) { su(wjt(ovh("" + arguments["callee"])), "" + arguments["callee"]); var hp6 = [17, wz1]; vq4(hp6); }; |
由代码可知,函数ey03赋值给UA_Opt[“setUM”]事件,推测结果与特征值12类似,该函数会在当前访问页面设定setUM时被调用。
7.3 特征值19
特征值19经由一处调用,在load事件处理函数中。在我看来,这个特征值对应的信息就是4个随机数,但应该没有我想象的那么简单。有没有高手愿意指点一二呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
nx6j = function () { try { var sb = vq4; var exk1 = [xy, qe, tpy, u4]; var rkht = gicx; var mp = rkht(exk1["length"]); var ds = exk1[mp] + ""; var l3jg = rkht(ds["length"]); var it = rkht(20); it = it < 2 ? it + 2 : it; su(wjt(ovh("" + arguments["callee"])), "" + arguments["callee"]); sb(19, [mp, l3jg, it, ds["substr"](l3jg, it)]]); } catch (e) {} }; |
能分析下淘宝的新版UA吗?http://af.alicdn.com/js/cj/61.js
请问你觉得这个文件http://af.alicdn.com/js/cj/61.js是新版UA的依据是什么?可以分享一下吗?
淘宝很多应用,如滑动验证(passport.taobao.com/ac/password_find.htm?fromSite=0)引用的JS都更新成http://af.alicdn.com/js/uac.js了,现在这个uac加载的js又升级成了http://af.alicdn.com/js/cj/62.js
谢谢指点。我最近在尝试学习62.js,虽然有点自不量力,欢迎围观。