淘宝新版 UA 文件代码反混淆分析(去数组下标)
淘宝新版UA文件是http://af.alicdn.com/js/cj/62.js,这个文件与原来(2015年10月)的UA文件ctionlog_js_ua.js风格迥异,代码混淆的复杂度完全不可相提并论。尽管犹如蚍蜉撼大树,我还是尝试着对这个文件做了一些初步的反混淆分析,还请各位大神指点。
直接在浏览器中打开上述链接,就可以得到淘宝新版UA文件,该文件一眼看上去都是数组下标,这是该文件的混淆方式之一,本文主要记录将数组下标还原为变量。
C#对淘宝新版UA文件进行反混淆
这里我用C#来实现对淘宝新版UA文件进行反混淆,实现步骤如下:
1. 用HttpWebResponse请求淘宝新版UA文件的链接http://af.alicdn.com/js/cj/62.js,以字符串的方式存储该链接返回的代码;
2. 用正则表达式获取淘宝新版UA文件62.js最外层函数的参数,然后将这些参数依次存储在数组中。这个数组下标与62.js中出现的r数组的下标对应;
参数提取出来后,我起初使用了string[] strArray = rList.Split(new char[] { ‘,’ }); 的方式来将参数分割为数组,这样做就默认所有的元素中均不包含’,’。但事实上,62.js,63.js中有三个元素包含’,’,所以这种简单的分解方法会出错。经过某位大神的友情提醒,我才意识到这个错误,非常感谢。不过我暂时还不会做语法分析,所以我选用了比较简单的方案来处理这个问题点:
将参数进行格式化之后,找出包含’,’的元素,用特殊字符替代,待数组分解完毕后,再将特殊数组用原始的元素替换。
另外一种方法是将第一步反混淆之后的代码存储并用格式化工具处理,处理完成后,元素与元素之间会变成”,”和空格,然后用C#读取本地文件, 用”, “进行区分。
3. 根据第2步中获取的数组长度,用正则表达式从0开始依次获取r数组元素并用第2步中获取的相应数组元素进行替换。
实现代码如下,在以下代码中,contentOut的最终执行结果即为用变量名分别替换数组元素后的结果
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 |
static private string replace_R_Array(string codeString) { string regStr = ""; string contentOut = codeString; //获取参数值 Regex reg1 = new Regex( @ "\"" \ ""(. * ? ) \ "" ex \ "" "); string rList = reg1.Match(codeString).Groups[0].Value; //原数组元素中包含“,”时,此方法有误,63.js的数组中有三个元素包含", ",在notepad中找到这三个特殊元素,用特殊字符替代 //待Split执行完成后,再将相应元素用原本特殊元素替换 reg1 = new Regex(@", \ "", \ "", ");//特殊元素1 ", " rList = reg1.Replace(rList, ", special_1, "); reg1 = new Regex(@" \ ',\""\',");//特殊元素2 ', "', rList = reg1.Replace(rList, " special_2, "); reg1 = new Regex(@" \ '\"",\',");//特殊元素3 ' ",', rList = reg1.Replace(rList, " special_3, "); string[] strArray = rList.Split(new char[] { ',' }); int arrIndex = strArray.Length; //将js文件中的r数组用数组值替代 for (int i = 0; i < arrIndex; i++) { regStr = @" r \ [" + i.ToString() + @" \ ]"; reg1 = new Regex(regStr); if (strArray[i] == " special_1 ") { strArray[i] = ", "; } else if(strArray[i] == " special_2 ") { strArray[i] = ", \ ""; } else if (strArray[i] == "special_3") { strArray[i] = "\","; } contentOut = reg1.Replace(contentOut, strArray[i]); } return contentOut; }<span style="font-size:13.2px;line-height:1.5;"> </span> |
尝试过的其他方案
最初我想用js来实现反混淆,我想将相关代码写在html文件中,然后用浏览器打开该文件来进行调试。我的思路是这样的:用XMLHttpRequest请求淘宝新版UA文件的链接,获取62.js的内容,然后用正则表达式对这些内容进行反混淆。可是第一步我就失败了,获取62.js内容的代码如下:
1 2 3 |
var url = "http://af.alicdn.com/js/cj/62.js"; xmlHttpRequest = new XMLHttpRequest(); xmlHttpRequest.open("GET",url,true); |
该文件在chrome中打开时,也无法得到正确的结果,提示:Origin ‘null’ is therefore not allowed access.
在firefox中执行时,无法得到正确的结果,原因:CORS 头缺少 ‘Access-Control-Allow-Origin’。
在IE中执行时,倒是没有报错,但是其获取的内容并不完整。
关于firefox和chrome中的执行状况,我查了很多资料,也没有明白到底该怎么做,所以我最后选择了用C#来实现该功能,去除数组下标的文件的下载链接,不过C#获取的内容中有一些乱码,可能是我在请求链接时编码方式未设置正确,也可能是淘宝设置的一个坑,目前我暂时还不知道该如何处理,如果有大神愿意指导,不甚感激。
Access-Control-Allow-Origin,指的是js的同源安全策略。说人话就是:浏览器禁止js请求当前域名之外的资源。你可以直接在淘宝的页面中调试这个js,在Chrome的开发人员工具中,把这个个文件format之后在需要的地方打断点,一步步调试可以跟踪,跟VS操作一样。有疑问可以微博上At我。
谢谢指点
不过可能我习惯不太好,我一般不在控制台中操作,可能是我用的不熟,总觉得在控制台中操作不是那么方便。如果后续有需要,我会进一步请教,还请多多指教,谢谢。