如何去除此JavaScript代码的泡沫?

如何去除此JavaScript代码的泡沫?,javascript,obfuscation,reverse-engineering,deobfuscation,Javascript,Obfuscation,Reverse Engineering,Deobfuscation,可能重复: 问题: 我有以下javascript代码: var _0xe91d=["\x28\x35\x28\x24\x29\x7B\x24\x2E\x32\x77\x2E ... x5F\x63\x6F\x6E\x74\x5F\x64\x75\x72\x7C\x76\x5F\x74\x61\x62\x73\x5F\x61\x6C\x69\x67\x6E\x7C\x76\x5F\x74\x61\x62\x73\x5F\x64\x75\x72\x7C\x76\x5F\x73\x63\x72

可能重复:

问题:

我有以下javascript代码:

var _0xe91d=["\x28\x35\x28\x24\x29\x7B\x24\x2E\x32\x77\x2E

...


x5F\x63\x6F\x6E\x74\x5F\x64\x75\x72\x7C\x76\x5F\x74\x61\x62\x73\x5F\x61\x6C\x69\x67\x6E\x7C\x76\x5F\x74\x61\x62\x73\x5F\x64\x75\x72\x7C\x76\x5F\x73\x63\x72\x6F\x6C\x6C\x7C\x63\x6F\x6E\x74\x5F\x61\x6E\x69\x6D\x7C\x63\x6F\x6E\x74\x5F\x66\x78\x7C\x74\x61\x62\x5F\x66\x78\x7C\x72\x65\x70\x6C\x61\x63\x65\x7C\x62\x61\x6C\x69\x67\x6E\x7C\x61\x6C\x69\x67\x6E\x5F\x7C\x75\x6E\x6D\x6F\x75\x73\x65\x77\x68\x65\x65\x6C\x7C\x73\x77\x69\x74\x63\x68\x7C\x64\x65\x66\x61\x75\x6C\x74\x7C\x6A\x51\x75\x65\x72\x79","","\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65","\x72\x65\x70\x6C\x61\x63\x65","\x5C\x77\x2B","\x5C\x62","\x67"];eval(function (_0x173cx1,_0x173cx2,_0x173cx3,_0x173cx4,_0x173cx5,_0x173cx6){_0x173cx5=function (_0x173cx3){return (_0x173cx3<_0x173cx2?_0xe91d[4]:_0x173cx5(parseInt(_0x173cx3/_0x173cx2)))+((_0x173cx3=_0x173cx3%_0x173cx2)>35?String[_0xe91d[5]](_0x173cx3+29):_0x173cx3.toString(36));} ;if(!_0xe91d[4][_0xe91d[6]](/^/,String)){while(_0x173cx3--){_0x173cx6[_0x173cx5(_0x173cx3)]=_0x173cx4[_0x173cx3]||_0x173cx5(_0x173cx3);} ;_0x173cx4=[function (_0x173cx5){return _0x173cx6[_0x173cx5];} ];_0x173cx5=function (){return _0xe91d[7];} ;_0x173cx3=1;} ;while(_0x173cx3--){if(_0x173cx4[_0x173cx3]){_0x173cx1=_0x173cx1[_0xe91d[6]]( new RegExp(_0xe91d[8]+_0x173cx5(_0x173cx3)+_0xe91d[8],_0xe91d[9]),_0x173cx4[_0x173cx3]);} ;} ;return _0x173cx1;} (_0xe91d[0],62,284,_0xe91d[3][_0xe91d[2]](_0xe91d[1]),0,{}));
var\u 0xe91d=[”\x28\x35\x28\x24\x29\x7B\x24\x2E\x32\x77\x2E
...
X6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 2\x5F\x66\x78\x7C\x72\x65\x70\x6C\x61\x63\x65\x7C\x62\x61\x6C\x69\x67\x6E\x7C\x61\x6C\x69\x67\xX6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6\x5C\x62“,“\x67”];函数(0x0x173CX1)、0x0x173CX1、0x0x173CX2、0x173cx2、0x173cx2、0x173cx5、以及0x173cx6)、函数(0x1730x173CX5)、函数(0x0x0x173CX1)、函数(0x0x173CX1)、函数(0x0x0x173CX1)、函数(0x0x0x173CX1)、函数(0x0x1731-0x173cx1-1-1-1)、函数(0x1-0x1-0x1-0x1-1-1-1-1-1-1-1-1-1-1-1-3-1-1-1-1-1-1-1-1-1-1)、函数)、函数(0x1-3-3-1-1-1-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-3-1)、函数)、函数(函数(函数)以及函数(函数)以及功能(函数)以及124;0x173cx5(0x173cx3);};0x173cx4=[函数(0.00x173CX5)以及(0.000x173CX5)两个(0.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7)返回返回;返回返回;返回(返回返回;返回;返回;返回;返回(返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回;返回(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0}(0xe91d[0],62284,0xe91d[3][[u0xe91d[2]](0xe91d[1]),0,{}));
我如何准确地解读它,并找出它的作用?

这种混淆背后的原理是什么?

它只是字符串中的十六进制代码\x20是十进制32的一个空格

print _0xe91d

它只是字符串中的十六进制代码\x20是十进制32的一个空格

print _0xe91d

它使用正则表达式对某些文本进行替换。 表达式是十六进制代码,您可以使用.toString()将其恢复为unicode: 例如:

"\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65".toString() : fromCharCode


它使用正则表达式对某些文本进行替换。 表达式是十六进制代码,您可以使用.toString()将其恢复为unicode: 例如:

"\x66\x72\x6F\x6D\x43\x68\x61\x72\x43\x6F\x64\x65".toString() : fromCharCode



首先确定字符串,但我认为您已经这样做了。然后合理地格式化它。然后开始阅读它。不确定“原则”是什么意思,你是在问为什么它会被混淆吗?在我看来,这段代码似乎是某种自动案例设计包的生成输出。多年前,我不得不反转整个应用程序,这在C语言中也是一样的,所有的函数和变量都只是无意义的数字名称。@Dave Newton:你不能只是r用toString读取它,它是加密的。幸运的是,它必须提供解密功能才能在eval中使用它,这可以被google chrome javascript控制台截获:)什么意思,它是加密的?是十六进制。在上使用“十六进制”框。使用toString()。@Dave Newton:Nono,它不仅仅是十六进制。在字符串被加密之前,它被加密了。因此,为了逆转它,它需要先解除性爱,然后解密。只有在这之后,才会有纯文本代码。唯一没有加密的是decrypt函数,它在执行toString时显示。实际上,它首先进行regex替换以获得decrypt函数,但是可以在调试控制台中截取该结果:)首先确定字符串,但我假设您已经这样做了。然后合理地编排格式。然后开始读它。不确定你所说的“原则”是什么意思,你是在问为什么它会被混淆?在我看来,代码似乎是某种自动案例设计包的生成输出。很多年前,我不得不将整个应用程序反转,这在C语言中也是一样的,所有函数和变量都只是无意义的数字名称。@Dave Newton:你不能用toString读取它,它是加密的。幸运的是,为了在eval中使用它,它必须提供解密功能,这可以被googlechrome的javascript控制台截获:)什么意思,它是加密的?是十六进制。在上使用“十六进制”框。使用toString()。@Dave Newton:Nono,它不仅仅是十六进制。在字符串被加密之前,它被加密了。因此,为了逆转它,它需要先解除性爱,然后解密。只有在这之后,才会有纯文本代码。唯一没有加密的是decrypt函数,它在执行toString时显示。事实上,它首先进行正则表达式替换以获得解密函数,但是可以在调试控制台中截获该结果:)除此之外还有更多内容-向右滚动,但现在您知道如何将其转换为除十六进制代码以外的其他代码。你是说你不明白变量名也是十六进制代码吗?根据您的调试技能,您只需要10分钟到2小时就可以编写一个脚本,将所有十六进制代码更改回字符串。我确实理解这一点,但您的目的是回答问题或提供解决方案的见解。我在指出你的答案并没有真正实现这一点。我不相信我说过任何关于我的调试技巧的话,因为这个问题不是关于我的。问题是:我如何确切地解读它,并找出它的作用?这种混淆背后的原理是什么?对我来说,这并不是破译这个。这是真的——你的问题是一个有帮助的第一点——但还有比这更多的东西。因此我说“不止这些”不止这些-向右滚动,但现在你知道如何将其转换为除十六进制代码以外的其他代码。你是说你不明白变量名也是十六进制代码吗?根据您的调试技能,您只需要10分钟到2小时就可以编写一个脚本,将所有十六进制代码更改回字符串。我确实理解这一点,但您的目的是回答问题或提供解决方案的见解。我在指出你的答案并不是很有说服力