JavaScript代码出现怪异命名如何解码?
混淆JavaScript代码的常见问题解答
为什么变量和函数命名毫无意义?
这是代码混淆的典型特征,发布者使用混淆工具处理了代码:
- 主要目的是压缩代码体积,同时阻止他人逆向工程(比如抄袭功能逻辑、破解付费限制);
- 混淆工具会自动将所有有语义的变量名、函数名替换成随机十六进制字符串(比如
_0xe65c19),还会把直接调用的内置方法、字符串转成间接索引引用(比如_0x4fb109(0x1cd)实际对应某个内置函数名)。
这属于编码吗?能否还原成可读代码?
- 这不叫编码,而是代码混淆,和Base64这类编码的字符映射逻辑完全不同,它是对代码结构、命名的破坏性改造;
- 可以通过反混淆还原,但难度取决于混淆工具的强度:
- 你用在线工具失败,是因为这段代码用了较复杂的混淆策略(比如字符串数组映射、控制流变形),普通在线工具无法处理;
- 手动反混淆的核心步骤:
- 定位核心映射函数
_0x2e18ad,它的作用是从一个隐藏的字符串数组中,根据传入的十六进制索引(比如0x1cd)取出真实的方法名或字符串; - 把所有
_0x4fb109(0xXXX)这类调用替换成对应的真实值,比如Math[_0x4fb109(0x1cd)]实际是Math.floor; - 替换完成后,给变量、函数重新命名为有语义的名称(比如
_0xe65c19是时间格式化函数,可改为formatTime)。
- 定位核心映射函数
示例代码的部分反混淆结果
比如原_0x4b3607函数反混淆后是一个数字补零工具:
function padNumber(num, targetLength) { num = num.toString(); while (num.length < targetLength) { num = '0' + num; } return num; }
内容的提问来源于stack exchange,提问作者Viktor Trunov
相关产品推荐
相关产品推荐

