JavaScript反混淆插件一:处理十六进制、中英文Unicode字符串或数值

代码样本

打开著名的JavaScript在线混淆网站:

https://obfuscator.io/

  

按照它给的原代码:


   
  1. // Paste your JavaScript code here
  2. function hi() {
  3. console.log("Hello World!");
  4. }
  5. hi();

选择下图所示的选项,其他的不变:

然后点击 Obfuscator 按钮,这它帮我们混淆了代码:


   
  1. var _0x1201 = ['\x6c\x6f\x67', '\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21'];
  2. (function(_0x2b91f5, _0x120157) {
  3. var _0x2e36e7 = function(_0x40e9dc) {
  4. while (--_0x40e9dc) {
  5. _0x2b91f5['\x70\x75\x73\x68'](_0x2b91f5['\x73\x68\x69\x66\x74']());
  6. }
  7. };
  8. _0x2e36e7(++_0x120157);
  9. }(_0x1201, 0xa3));
  10. var _0x2e36 = function(_0x2b91f5, _0x120157) {
  11. _0x2b91f5 = _0x2b91f5 - 0x0;
  12. var _0x2e36e7 = _0x1201[_0x2b91f5];
  13. return _0x2e36e7;
  14. };
  15. function hi() {
  16. var _0x379bb0 = _0x2e36;
  17. console[_0x379bb0('\x30\x78\x31')](_0x379bb0('\x30\x78\x30'));
  18. }
  19. hi();

可以看到,有很多类似这样的字符串:

'\x6c\x6f\x67'

  

可以说,非常的不直观,下面就来介绍,如何将这种不直观的字符串还原成人容易阅读的字符串。

插件功能

处理人难以阅读的字符串或者数值。简单来说就是将不直观的字符串或者数值变得直观。

处理实例

处理前:


   
  1. var a = 0x25,b = 0b10001001,c = 0o123456,
  2. d = "\x68\x65\x6c\x6c\x6f\x2c\x41\x53\x54",
  3. e = "\u0068\u0065\u006c\u006c\u006f\u002c\u0041\u0053\u0054";

处理后:

var a = 37,b = 137,c = 42798,d = "hello,AST",e = "hello,AST";

  

插件来源

官方插件 plugin-transform-literals,略有修改,地址:

https://babeljs.io/docs/en/babel-plugin-transform-literals

  

插件源码


   
  1. const transform_literal = {
  2. NumericLiteral({node}) {
  3. if (node.extra && /^0[obx]/i.test(node.extra.raw)) {
  4. node.extra = undefined;
  5. }
  6. },
  7. StringLiteral({node})
  8. {
  9. if (node.extra && /\\[ux]/gi.test(node.extra.raw)) {
  10. node.extra = undefined;
  11. }
  12. },
  13. }

插件原理

官网手册查询得知,NumericLiteral、StringLiteral类型的extra节点并非必需,这样在将其删除时,不会影响原节点。

对照在线网站进行解析时,其value节点是可阅读的字符串,难以识别的字符串放在了extra节点里,所以直接进行删除即可。

注意事项

此插件无法处理非ASCII码的字符,而对于我们来说也不需要处理,如果需要处理中文Unicode,请将 babel库反混淆代码模板 这篇文章最后生成代码处稍微修改下即可。

let {code} = generator(ast,opts = {jsescOption:{"minimal":true}});

  

请大家用上面的插件还原下文章开头被混淆了的代码,试试效果。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/109507668

(完)