ua.js中arguments.callee.caller的应用

       actionlog_js_ua.js混淆编程形式与执行主流程

       ua.js中UA_Opt设定信息的重要性与来源分析

       ua.js文件load事件自定义处理函数功能解析

       ua.js中mousedown和mousemove事件自定义函数功能解析

       ua.js文件focus&blur&keydown事件分析

       ua.js中UA生成函数vq4的“庐山真面目”

       ua.js中网络超时检测函数 wql 功能分析

       ua.js中用 image 对象实现页面访问统计

       ua.js中JSocket.getlso和JSocket.setlso代码分析

       ua.js中arguments.callee.caller的应用

       ua.js 获取访客浏览器与操作系统信息的方式

     在ua.js文件中,用到arguments.calleearguments.callee.caller的函数名为su。据我的理解,这个函数的作用是:在每一次UA更新时,获取当前更新UA的函数名,按照函数执行次序依次将函数名存储在变量uv5中。

      1. arguments.callee

      callee 是 arguments 对象的属性,在该函数的函数体内,它可以指向当前正在执行的函数;arguments.callee.caller返回调用当前正在执行的函数的函数。但是ECMAScript 第五版 (ES5) 的 严格模式 中禁止使用 arguments.callee()和arguments.callee.caller,到这里查看原因。

      2.  函数su的传入参数

      函数su的调用处的调用形式全部一致:su(wjt(ovh(“” + arguments.callee)), “” + arguments.callee); 函数su及相关函数的代码如下。这里先认为函数ovh为加密函数,其作用是将当前正在执行的函数名加密后返回一个字符串str;假设函数wjt执行时的时间为time,那么结合函数wjt的代码可知su函数调用时的参数形式:hnp1[0]=str+time; hnp1[1]=aytz(time);tu= “”+ arguments.callee

      3. 函数su的执行逻辑

      3.1  由su的代码可知,变量tf非常关键。变量tf初始化为false,第一次调用su后会被置为true。该变量初始化所在函数是ua.js最外层的匿名函数,所以除非ua.js的最外层匿名函数被重新调用,tf的值将保持为true。因此ua.js第一次调用时,会在uv5中存储su的函数名。

       3.2  获取当前正在执行的su的调用函数Unicode编码,存入到变量sk2中。

       3.3  判断条件if (tu == “” || typeof tu == “undefined” || hnp1[0] != (sk2 + tno(hnp1[1])))是否成立。函数su定义时需要输入两个参数{su = function (hnp1, tu)},所有调用su的地方均传入了两个参数,所以前两个条件均不会满足。另外tno与aytz互为反函数,所以第三个条件也不成立。因此理论上而言,该条件不会成立,所以该条件下的代码不会被执行。若万一此条件成立,会调用函数f1,而f1函数中会调用gby。在ua.js中网络超时检测函数 wql 功能分析一文中我们提到过gby是一个故障处理函数,所以基本可以认为若此条件成立,那必定是发生了异常。

      3.4 当前调用su的函数存入到变量uv5中。

      3.5 ua.js中还有一个函数与uv5相关。该函数在更新UA的函数vq4中调用,判断当前函数的调用者是否已经存在于uv5中,若存在该函数会返回true,而事实上,所有su调用的地方都在vq4函数之前,也就是说这个函数一定会返回true。与3.3中同样的道理,万一此函数返回false,会先调用故障处理函数,所以可以认为若在调用vq4时,调用vq4的函数名不在变量uv5中,那么程序将会抛出异常。

       根据以上分析,函数su和变量uv5的作用基本可以认为是用于监控ua.js文件中执行流程是否有异常,若出现异常,程序将抛出异常;若无异常,则继续执行。而判断异常的标准由两点:a. 在函数su中检查传入的变量是否合理,合理的状况如3.3所述,否则为不合理。; b. 在vq4调用时,判断当前调用vq4的函数是否已经存在变量uv5中,若已存在为合理现象,若不存在则不合理。不知道这样认为是否合理?

发表回复

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

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

Fork me on GitHub