JavaScript 代码混淆实战(五):仿obfuscator混淆变量名
【摘要】
obfuscator混淆我相信大家耳熟能详,做爬虫的或多或少的都应该见到过这样混淆的代码,其官网地址:
https://obfuscator.io/
经过其混淆的代码,其变量名或者函数名多以 "_0x" 开头,例如
while (!![]) { switch (_0x3020e4[_0x3ef040++]) { case '0': var _0x2db...
obfuscator混淆我相信大家耳熟能详,做爬虫的或多或少的都应该见到过这样混淆的代码,其官网地址:
https://obfuscator.io/
经过其混淆的代码,其变量名或者函数名多以 "_0x" 开头,例如
-
while (!![]) {
-
switch (_0x3020e4[_0x3ef040++]) {
-
case '0':
-
var _0x2dbd28 = _0x2005cb[_0x214d6f] || _0x60c1db;
-
continue;
-
case '1':
-
_0x60c1db[_0x419025(-0x2b5, -0x2b0, -0x29d, -0x24a, -0x348) + _0x512a3d(-0x322, -0x3cf, -0x387, -0x3b0, -0x402)] = _0x2dbd28[_0x512a3d(-0x22f, -0x2b0, -0x363, -0x35c, -0x2b5) + _0x1edf16(-0x441, -0x3cf, -0x402, -0x3e7, -0x447)][_0x3fe046(-0x3c8, -0x3e6, -0x488, -0x3a5, -0x395)](_0x2dbd28);
-
continue;
-
case '2':
-
var _0x214d6f = _0x4eb06f[_0x46bad8];
-
continue;
-
case '3':
-
_0x2005cb[_0x214d6f] = _0x60c1db;
-
continue;
-
case '4':
-
var _0x60c1db = _0x489981[_0x1edf16(-0x26d, -0x2ae, -0x306, -0x315, -0x327) + _0x1edf16(-0x3ce, -0x3be, -0x41d, -0x3c1, -0x437) + 'r'][_0x419025(-0x402, -0x403, -0x46c, -0x487, -0x385) + _0x419025(-0x3c5, -0x321, -0x382, -0x3a3, -0x2fe)][_0x1edf16(-0x3af, -0x3e6, -0x3a4, -0x340, -0x423)](_0x489981);
-
continue;
-
case '5':
-
_0x60c1db[_0x419025(-0x3db, -0x396, -0x338, -0x3df, -0x43a) + _0x1edf16(-0x40b, -0x3c5, -0x473, -0x376, -0x3e3)] = _0x489981[_0x2faf8f(-0x3f1, -0x3e6, -0x407, -0x485, -0x3d5)](_0x489981);
-
continue;
-
}
-
break;
-
}
-
-
总之就是面目全非了,混淆的连它爹妈都不认识了,大大降低了可读性。
这种混淆使用 AST再简单不过了。
举个实例来说明插件的功能。
处理前:
-
var a = 123,b = 456;
-
function add(a,b)
-
{
-
return a + b;
-
}
-
-
-
var s = add(a,b);
处理后:
-
var _0x79gc0a = 123,
-
_0xcge991 = 456;
-
-
-
function _0xc51af2(_0x3d6994, _0xbe984a) {
-
return _0x3d6994 + _0xbe984a;
-
}
-
-
-
var _0xd15dfd = _0xc51af2(_0x79gc0a, _0xcge991);
可以说,名字已经被严重混淆了。
下面来看看怎么编写插件。
首先呢,我们需要一个 可以随机生成变量名 的函数,如下:
-
function getRandomName(length)
-
{
-
let puzzleArr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f","g"];
-
-
let randomName = "_0x";
-
-
for (var i=0;i<length;i++)
-
{
-
randomName += puzzleArr[Math.round(Math.random() * 16)];
-
}
-
-
return randomName;
-
}
再遍历 Identifier 类型的节点,获取节点名称,再使用scope.rename方法进行替换,非常的简单。
当然,为了防止可能生成相同的变量名,可以声明一个Array类型的数组,用于存放之前生成过的变量名,再进行过滤即可。
插件源代码:
-
let names = [];
-
-
-
const renameIdentifier =
-
{
-
"Identifier"({node,scope})
-
{
-
let oldName = node.name,newName;
-
if (oldName.startsWith("_0x")) return;
-
do
-
{
-
newName = getRandomName(6);
-
-
}while (names.includes(newName))
-
scope.rename(oldName,newName);
-
},
-
}
好了,这就是今天的内容,感谢阅读。
如果觉得好,还希望可以点个赞哟。
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/112856249
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)