JavaScript 代码混淆实战(五):仿obfuscator混淆变量名

举报
悦来客栈的老板 发表于 2021/01/20 01:27:13 2021/01/20
【摘要】 obfuscator混淆我相信大家耳熟能详,做爬虫的或多或少的都应该见到过这样混淆的代码,其官网地址: https://obfuscator.io/ 经过其混淆的代码,其变量名或者函数名多以 "_0x" 开头,例如 while (!![]) { switch (_0x3020e4[_0x3ef040++]) { case '0': var _0x2db...

obfuscator混淆我相信大家耳熟能详,做爬虫的或多或少的都应该见到过这样混淆的代码,其官网地址:

https://obfuscator.io/

  

经过其混淆的代码,其变量名或者函数名多以 "_0x" 开头,例如


   
  1. while (!![]) {
  2. switch (_0x3020e4[_0x3ef040++]) {
  3. case '0':
  4. var _0x2dbd28 = _0x2005cb[_0x214d6f] || _0x60c1db;
  5. continue;
  6. case '1':
  7. _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);
  8. continue;
  9. case '2':
  10. var _0x214d6f = _0x4eb06f[_0x46bad8];
  11. continue;
  12. case '3':
  13. _0x2005cb[_0x214d6f] = _0x60c1db;
  14. continue;
  15. case '4':
  16. 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);
  17. continue;
  18. case '5':
  19. _0x60c1db[_0x419025(-0x3db, -0x396, -0x338, -0x3df, -0x43a) + _0x1edf16(-0x40b, -0x3c5, -0x473, -0x376, -0x3e3)] = _0x489981[_0x2faf8f(-0x3f1, -0x3e6, -0x407, -0x485, -0x3d5)](_0x489981);
  20. continue;
  21. }
  22. break;
  23. }

总之就是面目全非了,混淆的连它爹妈都不认识了,大大降低了可读性。

这种混淆使用 AST再简单不过了。

举个实例来说明插件的功能。

处理前:


   
  1. var a = 123,b = 456;
  2. function add(a,b)
  3. {
  4. return a + b;
  5. }
  6. var s = add(a,b);

处理后:


   
  1. var _0x79gc0a = 123,
  2. _0xcge991 = 456;
  3. function _0xc51af2(_0x3d6994, _0xbe984a) {
  4. return _0x3d6994 + _0xbe984a;
  5. }
  6. var _0xd15dfd = _0xc51af2(_0x79gc0a, _0xcge991);

可以说,名字已经被严重混淆了。

下面来看看怎么编写插件。

首先呢,我们需要一个 可以随机生成变量名 的函数,如下:


   
  1. function getRandomName(length)
  2. {
  3. let puzzleArr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f","g"];
  4. let randomName = "_0x";
  5. for (var i=0;i<length;i++)
  6. {
  7. randomName += puzzleArr[Math.round(Math.random() * 16)];
  8. }
  9. return randomName;
  10. }

再遍历 Identifier 类型的节点,获取节点名称,再使用scope.rename方法进行替换,非常的简单。

当然,为了防止可能生成相同的变量名,可以声明一个Array类型的数组,用于存放之前生成过的变量名,再进行过滤即可。

插件源代码:


   
  1. let names = [];
  2. const renameIdentifier =
  3. {
  4. "Identifier"({node,scope})
  5. {
  6. let oldName = node.name,newName;
  7.     if (oldName.startsWith("_0x")) return;
  8. do
  9. {
  10. newName = getRandomName(6);
  11. }while (names.includes(newName))
  12. scope.rename(oldName,newName);
  13. },
  14. }

好了,这就是今天的内容,感谢阅读。


如果觉得好,还希望可以点个赞哟。

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

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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。