• AST反混淆实战|某国外混淆框架一小段混淆js还原分析


    关注它,不迷路。       

    本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!

    1. 需求

    我相信做币圈爬虫的兄弟,或多或少的见过类似下面的混淆js:

    860b681b9aace0e4dd4a76ea38907f53.png

    大部分的变量名,主要以 "__p_" 开头,分析下来,其实是ob混淆上面再套了一层壳。

    再去掉第一层壳以后,发现还套了一层,它的函数如下:

    1. function __p_1295650017_calc(__p_0552970006, __p_6576181459) {
    2. switch (__p_3757655876) {
    3. case 12:
    4. return !__p_0552970006;
    5. case 26:
    6. return -__p_0552970006;
    7. case -29:
    8. return __p_0552970006 + __p_6576181459;
    9. case -6:
    10. return __p_0552970006 - __p_6576181459;
    11. case 57:
    12. return ~__p_0552970006;
    13. case 35:
    14. return __p_0552970006 / __p_6576181459;
    15. case 3:
    16. return __p_0552970006 * __p_6576181459;
    17. case 2:
    18. return typeof __p_0552970006;
    19. case 6:
    20. return void __p_0552970006;
    21. }
    22. }

    这个混淆函数很有意思,它有两个形参,函数里面有包含一个全局变量 

    __p_3757655876,而这个全局变量,又由下面的函数来控制:

    1. function __p_2245858992(a) {
    2. a = __p_3757655876 + (__p_3757655876 = a, 0);
    3. return a;
    4. }

    而上面的 混淆函数,它的函数调用有这样的:

    __p_1295650017_calc(1940, __p_3757655876 = 26)

    函数的结果很明显是 -26;

    也有这样的:

    __p_1295650017_calc(_0x10e09f(746), "e", __p_2245858992(-29))

    函数的结果很明显是 _0x10e09f(746) + "e";

    还有一个,就是,对于不同版本的混淆文件,它的这个函数定义是变化着的,如:

    1. function __p_0807818337_calc(__p_9916442306, __p_4970943498) {
    2. switch (__p_3679524284) {
    3. case 13:
    4. return !__p_9916442306;
    5. case 7:
    6. return -__p_9916442306;
    7. case 31:
    8. return __p_9916442306 + __p_4970943498;
    9. case 3:
    10. return __p_9916442306 - __p_4970943498;
    11. case 21:
    12. return ~__p_9916442306;
    13. case 50:
    14. return __p_9916442306 / __p_4970943498;
    15. case -47:
    16. return __p_9916442306 * __p_4970943498;
    17. case 18:
    18. return typeof __p_9916442306;
    19. case 55:
    20. return void __p_9916442306;
    21. }
    22. }

    2. 共同点

    如果想要写出通用的插件,就得找出它的共同点。先来看看有哪些共同点:

    1. 函数名不一样,但都以 _calc 结尾

    2. 函数体结构是一样的,但是 每个case 后面的值不一样。

    3. case体是一样的,都是 return 语句。

    很快写出代码:

    1. const getCalcFunction =
    2. {
    3. FunctionDeclaration(path)
    4. {
    5. let {scope,node} = path;
    6. let {id,body,params} = node;
    7. let name = id.name;
    8. if (!name.endsWith('calc'))
    9. {
    10. return;
    11. }
    12. }
    13. }

    因为整个混淆js,只有它是以 "calc" 结尾的,因此,只需简单的判断一下就可以了。

    接下来怎么写呢?

    根据每个case 里的return语句来写?

    3. 隐藏的彩蛋

    观察 每个case里的return语句,拿到在线解析网站上观察,只有两种类型:

    BinaryExpression  UnaryExpression 类型,而它们有个共同点,都有 operator 这个子节点,即操作符。因此,我们可以使用 一个 Object类型的变量来保存它.即通过每个 case的值 和 operator 来注册一个键值对,保存起来。遍历的时候去取就可以了。

    1. const getCalcFunction =
    2. {
    3. FunctionDeclaration(path)
    4. {
    5. let {scope,node} = path;
    6. let {id,body,params} = node;
    7. let name = id.name;
    8. if (!name.endsWith('calc'))
    9. {
    10. return;
    11. }
    12. let newMap = new Object();
    13. let cases = body.body[0].cases;
    14. for (let eachCase of cases)
    15. {
    16. let {test,consequent} = eachCase;
    17. let value = test.value || -test.argument.value;
    18. let operator = consequent[0].argument.operator;
    19. newMap[value] = operator;
    20. }
    21. console.log(newMap);
    22. }
    23. }

    打印结果:

    1d51aaaa2a64cca71667c04e6f9cecf6.png

    拿到了 case 的值和 它的操作符,再去构造节点就简单了。

    这里也许你有个疑问,就是 BinaryExpression  UnaryExpression 它们有个共同的操作符:  "-",如何区分呢?

    当然是根据它函数调用的实参个数来区分了。实参是2个的时候,它肯定是UnaryExpression  类型;实参是3个的时候,它肯定是 BinaryExpression 类型。

    文件demo在星球里,请星友们完成后续的还原工作:

    https://t.zsxq.com/13Sv5Igr1

    今天的文章就分享到这里,后续分享更多的技巧,敬请期待。

    6e592ed211219aabdfeb2264206fbbc0.jpeg

    欢迎加入知识星球,学习更多AST和爬虫技巧。

  • 相关阅读:
    Node.js 入门教程 22 将所有 Node.js 依赖包更新到最新版本
    RedisTemplate 与StringRedisTemplate区别
    [附源码]Python计算机毕业设计SSM开放实验室管理系统(程序+LW)
    【每日一题】1146. 快照数组
    极简UVM RAL示例(PART3--后门访问,PART4--内建ral sequence)
    linux库-----树莓派外设开发
    #Day Day Plan# 《NCB_PCI_Express_Base 5.0.1.0》pdf 译文笔记
    docker基础
    解决VSCODE 终端中显示中文乱码的问题
    无人机遥控中应用的2.4GHz无线芯片
  • 原文地址:https://blog.csdn.net/qq523176585/article/details/133937892