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

代码样本

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

https://obfuscator.io/

按照它给的原代码:

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

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

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

var _0x1201 = ['\x6c\x6f\x67', '\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21'];
(function(_0x2b91f5, _0x120157) {
    var _0x2e36e7 = function(_0x40e9dc) {
        while (--_0x40e9dc) {
            _0x2b91f5['\x70\x75\x73\x68'](_0x2b91f5['\x73\x68\x69\x66\x74']());
        }
    };
    _0x2e36e7(++_0x120157);
}(_0x1201, 0xa3));
var _0x2e36 = function(_0x2b91f5, _0x120157) {
    _0x2b91f5 = _0x2b91f5 - 0x0;
    var _0x2e36e7 = _0x1201[_0x2b91f5];
    return _0x2e36e7;
};
function hi() {
    var _0x379bb0 = _0x2e36;
    console[_0x379bb0('\x30\x78\x31')](_0x379bb0('\x30\x78\x30'));
}
hi();


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

'\x6c\x6f\x67'

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

插件功能

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

处理实例

处理前:

var a = 0x25,b = 0b10001001,c = 0o123456,
d = "\x68\x65\x6c\x6c\x6f\x2c\x41\x53\x54",
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

插件源码

const transform_literal = {
  NumericLiteral({node}) {
    if (node.extra && /^0[obx]/i.test(node.extra.raw)) {
      node.extra = undefined;
    }
  },
  StringLiteral({node}) 
  {
    if (node.extra && /\\[ux]/gi.test(node.extra.raw)) {
      node.extra = undefined;
    }
  },
}

插件原理

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

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

注意事项

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

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 JavaScript 的 `length` 属性来统计字符串的长度,但是这个属性只能统计英文字符和 ASCII 码字符的个数。对于中文字符,它的长度会被统计成 2。 如果想要正确地统计字符串中中文字符的个数,可以使用以下代码: ``` function getStringLength(str) { var len = str.length; for (var i = 0; i < str.length; i++) { if (str.charCodeAt(i) > 127 || str.charCodeAt(i) == 94) { len++; } } return len; } ``` 这段代码会遍历字符串中的每一个字符,如果发现字符的 ASCII 码大于 127(即该字符为中文字符)或者等于 94(即该字符为特殊字符 ^),就将 `len` 加 1。 ### 回答2: 要实现统计字符串长度,包括中文、英文和特殊字符,可以使用JavaScript。下面是一个示例代码: ```javascript function countStringLength(str) { // 将字符串转为Unicode编码数组 var arr = Array.from(str); var count = 0; for (var i = 0; i < arr.length; i++) { // 判断是否为汉字 if (arr[i].charCodeAt(0) > 255) { count += 2; // 汉字长度计为2 } else { count += 1; // 英文和特殊字符长度计为1 } } return count; } // 测试示例 var str = "Hello, 你好!"; console.log(countStringLength(str)); // 输出:11 ``` 上述代码首先将输入的字符串转换为Unicode编码的数组,然后遍历数组中的每个字符。通过判断字符的Unicode编码是否大于255,可以确定是中文字符还是其他字符。如果是中文字符,则长度计为2;如果是英文或特殊字符,则长度计为1。最后累加每个字符的长度并返回结果。 运行上述的示例代码,输出结果为11,表示字符串"Hello, 你好!"的长度为11个字符,其中包括4个英文字母、2个标点符号和2个中文字符。 ### 回答3: 要实现统计字符串长度包含中文英文特殊字符,可以使用JavaScript字符串处理方法。 首先,我们可以使用字符串的`length`属性来获取字符串的长度。但是需要注意的是,它只能统计字符的个数,并不能区分中文和英文字符。比如,对于字符串"hello 你好",使用`length`属性将返回9,而不是6。 为了能够正确统计包含中文、英文和特殊字符的字符串长度,我们可以使用正则表达式来匹配并计算字符的个数。我们可以使用`/[\u0000-\u00FF]/`来匹配所有的英文和特殊字符,使用`/[^\u0000-\u00FF]/`来匹配所有的中文字符。 下面是一个使用JavaScript实现统计字符串长度的例子: ```javascript function getStringLength(str) { var len = str.length; var chineseCharCount = str.match(/[^\u0000-\u00FF]/g) || []; // 匹配中文字符的正则表达式 var chineseCount = chineseCharCount.length; return len - chineseCount + chineseCount * 2; // 英文字符长度为1,中文字符长度为2 } var str = "hello 你好!@#$%^"; console.log(getStringLength(str)); // 输出18 ``` 在这个例子中,我们定义了一个名为`getStringLength`的函数,它接收一个字符串作为参数。在该函数中,我们首先使用`length`属性获取字符串的长度,并赋值给变量`len`。 然后,我们使用`match`方法匹配所有中文字符,并将匹配结果保存在变量`chineseCharCount`中。使用`|| []`的目的是,如果没有匹配到中文字符,`match`方法将返回`null`,我们希望始终保持变量`chineseCharCount`是一个数组,而不是`null`。 接下来,我们使用`len`减去中文字符的个数`chineseCount`,得到英文和特殊字符的个数。最后,我们将`chineseCount`乘以2,表示中文字符的长度为2,将其加到总长度上,得到最终的字符串长度。 在例子中,我们使用`console.log`方法将函数的返回值输出到控制台,得到字符串长度18。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值