ua.js中UA_Opt设定信息的重要性与来源分析
actionlog_js_ua.js混淆编程形式与执行主流程
ua.js中mousedown和mousemove事件自定义函数功能解析
ua.js中JSocket.getlso和JSocket.setlso代码分析
ua.js中arguments.callee.caller的应用
ua.js文件中有一个名为isvz的数组,该数组的设定值决定着大量函数是否需要执行,而isvz的值来源于一个名为UA_Opt的变量,根据代码推测,UA_Opt应该来源于当前访问的页面,本文主要分析ua.js中UA_Opt设定信息的重要性与来源推测。
上一篇文章给出了函数hp6的反混淆形式,hp6函数调用的第一个函数是wo(),且若函数wo()返回值是1,hp6中的所有内容都不会执行,我们先来看看函数wo的反混淆形式。
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
wo = function () { if (typeof UA_Opt == 'undefined') { return 1; } if(typeof UA_Opt["Flag"] != 'number') { return 1; } var lt = 0; while (!lt) { if (lt + 1) { var tty = new window["Object"]; lt = lt + 1; continue; } this.bv = bo0.join('>'); } if (typeof UA_Opt["FormId"] != 'undefined' && UA_Opt["FormId"] != "") { tty["FormId"] = UA_Opt["FormId"]; } if (typeof UA_Opt["LogVal"] != 'undefined' && UA_Opt["LogVal"] != "") { tty["LogVal"] = UA_Opt["LogVal"]; } tty["EnableKSLog"] = (UA_Opt["Flag"]>>1) & 1; tty["EnableMCLog"] = (UA_Opt["Flag"]>>2) & 1; tty["EnableMPLog"] = (UA_Opt["Flag"]>>3) & 1; tty["LogTimeInterval"] = (UA_Opt["Flag"]>>6) & 1; var ge = 0; for (var im = 0; im <= 6; ge = ++im + im++ + im){ if (im == ge) { tty["BrowserInfo"] = (UA_Opt["Flag"]>>7) & 1; continue; } if (2 * im == ge - 4) { tty["ProxyInfo"] = (UA_Opt["Flag"]>>9) & 1; } else if (2 * im == ge - 2) { tty["GetMacAddr"] = (UA_Opt["Flag"]>>8) & 1; continue; } if (4* im == ge + 8) { tty["PCIDInfo"] = (UA_Opt["Flag"]>>10) & 1; } } var bt = 0; for (var nu = 0; nu <= 7; bt = ++nu + nu++ + nu) { if (nu == bt) { tty["Location"] = (UA_Opt["Flag"]>>11) & 1; continue; } if (2 * nu == bt - 5) { tty["FocusInfo"] = (UA_Opt["Flag"]>>14) & 1; break; } if (2 * nu == bt - 2) { tty["ScreenInfo"] = (UA_Opt["Flag"]>>13) & 1; nu++; } if (3 * nu == bt + 2) { tty["Token"] = (UA_Opt["Flag"]>>12) & 1; } } tty["FlashInfo"] = (UA_Opt["Flag"]>>16) & 1; tty["UMID"] = (UA_Opt["Flag"]>>17) & 1; if (typeof UA_Opt[Token] == 'string'){ var d9 = 1; while (!(d9 - 1)) { if (d9) { tty["TokenStr"] = UA_Opt["Token"]; d9 = d9 - 1; continue; } oi.nm = "uxa"; } UA_Opt["setToken"] = function (vd) { tty["TokenStr"] = UA_Opt["Token"] = vd; if (gpga == 1) { su(wjt(ovh("" + arguments["callee"])), "" + arguments["callee"]); vq4([12,vd]); } }; } else { if (!0) { var la = 0; } else { la = 1; } if (!la) { var d1sn = 2; } if (d1sn) { tty["Token"] = 0; } else { this.UAOpt = e45t; } } var nx = 1; var r235 = 0; switch ((++r235 - nx--) * nx) { case 0: tty["ImgUrl"] = (typeof UA_Opt["ImgUrl"] == 'string') ? UA_Opt["ImgUrl"] : ''; case 1: tty["GetAttrs"] =[]; break; case 2: cr = navigator.appVersion.indexOf("MSIE"); } if(typeof UA_Opt["GetAttrs"]!= != 'undefined') { for(var i = 0; i < UA_Opt["GetAttrs"]["length"]; i++){ tty["GetAttrs"]["push"](UA_Opt["GetAttrs"](i)); } } tty["ExTarget"] = []; if (typeof UA_Opt["ExTarget"] != 'undefined') { for(var i = 0; i < UA_Opt["ExTarget"]["length"]; i++){ var dvy = 0; while (!dvy) { if (dvy + 1) { tty["ExTarget"]["push"](UA_Opt["ExTarget"](i)); dvy = dvy + 1; continue; } r4 += 87; } } } tty["MPInterval"] = (typeof UA_Opt["MPInterval"] != 'undefined' && UA_Opt["MPInterval"] > 0) ? UA_Opt["MPInterval"]:50; tty["MaxMCLog"] = (typeof UA_Opt["MaxMCLog"] != 'undefined' && UA_Opt["MaxMCLog"] > 0) ? UA_Opt["MaxMCLog"]:0; tty["MaxKSLog"] = (typeof UA_Opt["MaxKSLog"] != 'undefined' && UA_Opt["MaxKSLog"] > 0) ? UA_Opt["MaxKSLog"]:0; tty["MaxMPLog"] = (typeof UA_Opt["MaxMPLog"] != 'undefined' && UA_Opt["MaxMPLog"] > 0) ? UA_Opt["MaxMPLog"]:0; tty["MaxFocusLog"] = (typeof UA_Opt["MaxFocusLog"] != 'undefined' && UA_Opt["MaxFocusLog"] > 0) ? UA_Opt["MaxFocusLog"]:0; tty["SendInterval"] = (typeof UA_Opt["SendInterval"] != 'undefined' && UA_Opt["SendInterval"] > 0) ? UA_Opt["SendInterval"]:1; tty["SendMethod"] = (typeof UA_Opt["SendMethod"] != 'undefined' && UA_Opt["SendMethod"] > 0) ? UA_Opt["SendMethod"]:0; if ((UA_Opt["Flag"] & 1) == 0) { if (!0) { var j8 = 0; } else { j8 = 1; } if (!j8) { var g1 = 2; } if (g1) { tty["SendMethod"] |= 1; } else { iio.updateUA("xtt", ky5); } } else { var hf8 = 0; while (!hf8) { if (hf8 + 1) { tty["SendMethod"] |= 8; hf8 = hf8 + 1; continue; } vu += 1; } } tty["ResHost"] = (typeof UA_Opt["ResHost"] == 'string') ? UA_Opt["ResHost"]:'acjs.aliyun.com'; tty["SendTimer"] = (typeof UA_Opt["SendTimer"] == 'number') ? UA_Opt["SendTimer"]:1000; ivsz = tty; return 0; }; |
由函数wo的内容可知,若(typeof UA_Opt == ‘undefined’)或(typeof UA_Opt[“Flag”] != ‘number’),那么wo函数就直接返回1,wo和hp6函数中剩余部分就不会执行。若这两个条件不满足,那么会根据UA_Opt的值来给object tty的各项属性赋值,最后ivsz=tty。而且ua.js文件中有大量的函数是否执行需要由ivsz的属性值来决定。
根据以上事实以及ua.js文件全局的代码,UA_Opt有以下特征:
1. ua.js文件中没有定义UA_Opt,且UA_Opt该对象存在与否,以及属性值决定着ua.js几乎所有函数的是否需要执行。据此推测,需要生成UA的页面或者页面相关的js文件中一定有定义UA_Opt并赋值,否则无法通过ua.js得到UA。
2. 以UA_opt为关键词在baidu或google中搜索,会发现很多类似的给UA_opt赋值的代码。而这些代码中出现的LogVal,MaxMCLog,MaxMPLog等等属性值都有在ua.js文件中出现。
1 2 3 4 5 6 7 8 9 |
var ua=""; var UA_Opt=new Object; UA_Opt.LogVal="ua"; UA_Opt.MaxMCLog=3; UA_Opt.MaxMPLog=3; UA_Opt.MaxKSLog=3; UA_Opt.Token=new Date().getTime()+":"+Math.random(); UA_Opt.SendMethod=8; UA_Opt.Flag=14222; |
因此,个人认为UA_Opt是在ua.js之外定义的,且相关变量在我们访问页面时已赋值完成,而ua.js则根据UA_Opt的设定值去选择参与生成UA的数据类型。我也尝试用FireBug去寻找UA_Opt的踪影,很可惜我没有找到,但是我坚定的认为该对象存在于当前页面的某个js文件或者html文件中,如果有知道的同学还请不吝赐教,感激不尽。
UA_Opt的定义是在Html登陆的主页面中有定义的
UA_Opt:需要UA_Opt的时候就回去加载index-min.js
https://g.alicdn.com/kg/rate/0.0.25/index-min.js