前言
js加密实际其实将javascript代码进行混淆,无论加密混淆的再厉害,前端还是释义成可执行的代码,这期对sojson.v4版本的进行解密
解密过程
function hi() {
console.log("Hello World!");
}
hi();
encode后
['sojson.v4']["\x66\x69\x6c\x74\x65\x72"]["\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72"](((['sojson.v4']+[])["\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72"]['\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65']['\x61\x70\x70\x6c\x79'](null,"102x117m110e99c116x105I111Q110y32Q104O105a40f41T32D123A10j32A32p99t111I110d115M111S108u101t46k108D111U103O40P34Q72e101G108I108G111n32m87N111q114R108d100g33F34V41t59a10U125M10a104T105M40T41F59"['\x73\x70\x6c\x69\x74'](/[a-zA-Z]{1,}/))))('sojson.v4');
首先对代码进行UTF16解码
['sojson.v4']["filter"]["constructor"](((['sojson.v4'] + [])["constructor"]['fromCharCode']['apply'](null, "102x117m110e99c116x105I111Q110y32Q104O105a40f41T32D123A10j32A32p99t111I110d115M111S108u101t46k108D111U103O40P34Q72e101G108I108G111n32m87N111q114R108d100g33F34V41t59a10U125M10a104T105M40T41F59" ['split'](/[a-zA-Z]{1,}/))))('sojson.v4');
false => ![]
true => !![]
undefined => [][[]]
NaN => +[![]]
0 => +[]
1 => +!+[]
2 => !+[]+!+[]
10 => [+!+[]]+[+[]]
Array => []
Number => +[]
String => []+[]
Boolean => ![]
Function => []["filter"]
eval => []["filter"]["constructor"]( CODE )()
window => []["filter"]["constructor"]("return this")()
根据上面可知,eval => [][“filter”]“constructor”(),去除eval,再去console执行,得到如下图:

至此,得到源代码,结束。
工具(直接开发者工具调用)
((['sojson.v4'] + [])["constructor"]['fromCharCode']['apply'](null, "这里填写解密的代码" ['split'](/[a-zA-Z]{1,}/)))