如何简化给定的混淆JavaScript单行代码为易读的常规JS代码
混淆JS代码还原说明
原混淆代码
return 12 === selector ? (data = data >> 4, outstring = outstring + String.fromCharCode(data)) : 18 === selector && (data = data >> 2, outstring = outstring + String.fromCharCode((65280 & data) >> 8), outstring = outstring + String.fromCharCode(255 & data)), outstring;
等价易读JS代码
这段代码用了三元运算符、逗号运算符、逻辑短路的特性做了压缩,拆分后逻辑清晰的版本如下:
if (selector === 12) { // data右移4位 data = data >> 4; // 转换为对应字符追加到输出字符串 outstring += String.fromCharCode(data); } else if (selector === 18) { // data右移2位 data = data >> 2; // 取data高8位转字符追加 outstring += String.fromCharCode((65280 & data) >> 8); // 取data低8位转字符追加 outstring += String.fromCharCode(255 & data); } // 其余selector值不对outstring做修改,直接返回 return outstring;
核心逻辑说明
- 代码最终返回值是拼接完成的
outstring字符串 - 仅当
selector为12或18时才会修改outstring,其余取值直接返回原有outstring - 65280对应的二进制是
1111111100000000,和data做与运算的作用是提取data的高8位;255对应的二进制是0000000011111111,和data做与运算的作用是提取data的低8位
对应Python参考实现
如果你需要转成Python代码,可以参考以下写法:
if selector == 12: data = data >> 4 outstring += chr(data) elif selector == 18: data = data >> 2 # 提取高8位转字符 outstring += chr((65280 & data) >> 8) # 提取低8位转字符 outstring += chr(255 & data) return outstring
内容的提问来源于stack exchange,提问作者nihi nivi
相关产品推荐
相关产品推荐

