目前淘宝最新的UA文件是https://af.alicdn.com/js/cj/64.js,使用的混淆方法之一是字符串
字面量混淆:首先提取全部的字符串,在全局作用域创建一个字符串数组,同时转义字符增大阅
读难度,然后将字符串出现的地方替换成为数组元素的引用。
在C#中用正则表达式尝试反混淆时该文件时发现字符串数组r[1163]对应的字符串
‘JR;ZNRC]Y”yQD”PVR$’,而用正则表达式去替换r[1163]时,结果与想象中的不一致。以下代码中,第一段代码是
在64.js中截取的代码;第二段代码是可以在C#中执行的验证代码。
更详细的对64.js文件反混淆的方案请参考: [C# 正则表达式实现对淘宝 UA 文件初步反混淆][1]
这应该是淘宝设置的防止反混淆的手段,那么请问它的原理是什么?谢谢各位大神的指点。
//在64.js中截取的代码////////////////////////////////
w = g ? new r[410](r[1161]) : new r[410](e + ua),
b = w[r[550]](d[C]);
return d[m] && d[m](p, a = function () {
d[t(r[1163])](p, a, h),
o()
}, h),
g && d[r[849]](y, a = function () {
new r[410](r[1164])[r[550]](d[C]) && (d[t(r[1165])](y, a), o())
}),
//在64.js中截取的代码////////////////////////////////
//在C#中可执行的验证代码////////////////////////////
string tmpStr0 = "contentOut(r[1163])strArray";
string tmpStr = "'JR;ZNRC]Y\"yQD\"PVR$'";
Regex reg1 = new Regex(@"r\[1163\]");
string tmpStr1 = reg1.Replace(tmpStr0, tmpStr);//contentOut('JR;ZNRC]Y"yQD"PVR)strArray)strArray
string tmpStr2 = tmpStr0.Replace("r[1163]", tmpStr);//contentOut('JR;ZNRC]Y"yQD"PVR$')strArray
//在C#中可执行的验证代码////////////////////////////
C#的正则表达式中,$是一个特殊的字符,具体请参考:https://msdn.microsoft.com/en-us/library/ewy2t5e0.aspx#AfterMatch。
$' 替换将匹配的字符串替换为匹配项后的整个输入字符串。它将在删除匹配的文本时重复匹配项后的输入字符串。匹配文本前面的任何文本在结果字符串中保持不变。