SyntaxError:missing:在属性id之后 - 在混淆之后

时间:2013-05-14 14:36:49

标签: javascript obfuscation

混淆代码引发错误“SyntaxError:missing:after property id”。

lint上检查代码,并且没有任何错误或警告。

这是原始代码(这也是本js文档中的第一行):

var pgetColor = {
'AB': '#CAD17D',
'BC': '#7DD1AE',
'CL': '#919AFF',
'CI': '#FFE291',
'HB': '#84DBD5',
'ON': '#AA84DB',
'PM': '#DB848A',
'SR': '#B5DB84',
'TS': '#C96B9B',
'IS': '#FFC926',
'FREE': '#5FCF68'
};

这是一个错误报告:

enter image description here

我做错了什么?

1 个答案:

答案 0 :(得分:2)

这是the obfuscator you're using中的错误。你的代码

var pgetColor = {
'AB': '#CAD17D',
'BC': '#7DD1AE',
'CL': '#919AFF',
'CI': '#FFE291',
'HB': '#84DBD5',
'ON': '#AA84DB',
'PM': '#DB848A',
'SR': '#B5DB84',
'TS': '#C96B9B',
'IS': '#FFC926',
'FREE': '#5FCF68'
};

正在变成这个(我添加了换行符):

var _0x5523=["\x41\x42","\x23\x43\x41\x44\x31\x37\x44","\x42\x43","\x23\x37\x44\x44\x31\x41\x45","\x43\x4C","\x23\x39\x31\x39\x41\x46\x46","\x43\x49","\x23\x46\x46\x45\x32\x39\x31","\x48\x42","\x23\x38\x34\x44\x42\x44\x35","\x4F\x4E","\x23\x41\x41\x38\x34\x44\x42","\x50\x4D","\x23\x44\x42\x38\x34\x38\x41","\x53\x52","\x23\x42\x35\x44\x42\x38\x34","\x54\x53","\x23\x43\x39\x36\x42\x39\x42","\x49\x53","\x23\x46\x46\x43\x39\x32\x36","\x46\x52\x45\x45","\x23\x35\x46\x43\x46\x36\x38"];
var pgetColor={_0x5523[0]:_0x5523[1],_0x5523[2]:_0x5523[3],_0x5523[4]:_0x5523[5],_0x5523[6]:_0x5523[7],_0x5523[8]:_0x5523[9],_0x5523[10]:_0x5523[11],_0x5523[12]:_0x5523[13],_0x5523[14]:_0x5523[15],_0x5523[16]:_0x5523[17],_0x5523[18]:_0x5523[19],_0x5523[20]:_0x5523[21]};
// ------------^^^^^^^^^^
//             This is wrong (as are the ones that follow)

_0x5523[0]作为对象初始值设定项中的属性名称无效。您似乎通过使用字符串文字而不是:左侧的属性名称文字来混淆它 - 它的字符串替换过于热心。 (如果你不太明白我的意思是“字符串文字”与“属性名字字面数”,请参见下文。)因为你所做的是完全正确和合理的,所以它是混淆器中的一个错误。

我会使用不同的混淆器,或者更好的是,使用像Closure compiler这样的编译器。

如果我更改您的代码以改为使用属性名称文字:

var pgetColor = {
AB: '#CAD17D',
BC: '#7DD1AE',
CL: '#919AFF',
CI: '#FFE291',
HB: '#84DBD5',
ON: '#AA84DB',
PM: '#DB848A',
SR: '#B5DB84',
TS: '#C96B9B',
IS: '#FFC926',
FREE: '#5FCF68'
};

......结果很好:

var _0x8d33=["\x23\x43\x41\x44\x31\x37\x44","\x23\x37\x44\x44\x31\x41\x45","\x23\x39\x31\x39\x41\x46\x46","\x23\x46\x46\x45\x32\x39\x31","\x23\x38\x34\x44\x42\x44\x35","\x23\x41\x41\x38\x34\x44\x42","\x23\x44\x42\x38\x34\x38\x41","\x23\x42\x35\x44\x42\x38\x34","\x23\x43\x39\x36\x42\x39\x42","\x23\x46\x46\x43\x39\x32\x36","\x23\x35\x46\x43\x46\x36\x38"];
var pgetColor={AB:_0x8d33[0],BC:_0x8d33[1],CL:_0x8d33[2],CI:_0x8d33[3],HB:_0x8d33[4],ON:_0x8d33[5],PM:_0x8d33[6],SR:_0x8d33[7],TS:_0x8d33[8],IS:_0x8d33[9],FREE:_0x8d33[10]};

但有时你真的想要使用字符串文字作为属性名称(例如,如果属性名称中有空格,或者是保留字)。