AST反混淆|某练习平台混淆代码彻底还原及逆向请求

news2024/12/28 17:46:49

关注它,不迷路。       

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

一.目标地址

https://match.yuanrenxue.cn/match/2

二.代码还原

初次请求抓包,停止debugger位置:

31dc881ff756121b5ca6d1cd8564fc43.png

往上跟堆栈,看到混淆代码,将整个混淆代码保存下来:

daee11404d26904a197241f0e63cf070.png

分析得知,这是典型的ob混淆,使用星球里的插件先还原字符串:

https://t.zsxq.com/shQFg

字符串解密替换后:

f264a1c6e5ce14503fd8da71de7eb6b4.png

接下来就是后处理了,继续使用星球里的插件:

https://t.zsxq.com/G61wD

处理完毕后,发现更新了 cookie 值:

86592956eaac3b34f94d94f1f55f054f.png

 接下来就是删除垃圾代码,确保整个代码可以直接用起来。

三.分析和删除

  1. 最外层的自执行函数还原:

a77432ccc06072cd50fea678a94daaf8.png

代码可以很简单:

ExpressionStatement(path)
  {
    let {parentPath,node} = path;
    if (!parentPath.isProgram())
    {
      return;
    }
    let {expression} = path.node;
    if (types.isCallExpression(expression) && types.isFunctionExpression(expression.callee))
    {
      path.replaceWithMultiple(expression.callee.body.body);
    }
  },

2.接着看到这个函数:

3f168de9a4aefac270e6ef62bf987d07.png

分析可以后得知,它做了两件事,qz进行了赋值,try语句走的是catch分支,因此整个函数其实就是返回 navigator["vendorSub"],浏览器上是"".所以,可以将它引用的地方全部替换成"",代码也很容易:

TryStatement(path) {


    let { param, body } = path.node.handler;


    if (body.body.length == 1 && types.isReturnStatement(body.body[0])) {
      let functionParent = path.getFunctionParent();


      let binding = functionParent.scope.getBinding(functionParent.node.id.name);


      if (!binding) {
        return;
      }


      for (let referPath of binding.referencePaths) {
        let { parentPath } = referPath;


        if (parentPath.isCallExpression()) {
          parentPath.replaceWith(types.valueToNode(""));
        }
      }
      functionParent.remove();
    }
  },

 3.上一步看到了 qz 被赋值了,因此在它引用的地方:

81db4ccb714ccfcd138ce9a75cdd532f.png

代码会执行if分支,写个插件直接替换:

IfStatement(path) {
    let { test, consequent, alternate } = path.node;
    if (test.name == "qz") {
      path.replaceWithMultiple(consequent.body);
    }
  },

4.删除与加密无关的函数调用,有两处,分别是:

372e7deffad62a71b4e2962076ffc3c0.png

和:

e004c693c1272115fc3e976c7fccd107.png

代码如下:

CallExpression(path) {
    if (path.node.callee.name == "setInterval") {
      path.remove();
      return;
    }
    if (types.isMemberExpression(path.node.callee)) {
      let { object, property } = path.node.callee;
      if (types.isIdentifier(object, { "name": "location" }) && types.isStringLiteral(property, { "value": "reload" })) {
        path.remove();
      }
    }


  },

5.改造加密函数,使之可以直接调用。

改造前:

function _0x3e163b(_0x24b4ad, _0x12406a) {
    document["cookie"] = "m" + "" + "=" + _0x59d4f4(_0x24b4ad) + "|" + _0x24b4ad + "; path=/";
  }

改造后:

function _0x3e163b(_0x24b4ad, _0x12406a) {
   cookie = "m" + "" + "=" + _0x59d4f4(_0x24b4ad) + "|" + _0x24b4ad + "; path=/";
   return cookie;
  }

插件代码:

AssignmentExpression(path) {
    let { parentPath, node, scope } = path;
    if (!parentPath.isExpressionStatement()) {
      return;
    }
    let { left, operator, right } = node;
    if (types.isMemberExpression(left)) {
      let { object, property } = left;
      if (types.isIdentifier(object, { "name": "document" }) && types.isStringLiteral(property, { "value": "cookie" })) {
        path.node.left = types.Identifier(property.value);
        parentPath.insertAfter(types.ReturnStatement(path.node.left));
      }
    }
  },

经过上面的处理以后,整个混淆代码可以直接运行起来。

四.请求代码

分析得知,第一个实参是13位的时间戳,第二个参数没有用到,写下Python代码:

import time
import execjs
import requests


session = requests.Session()


session.headers = {
    "User-Agent": "yuanrenxue.project",
    }
 
 
url = "http://match.yuanrenxue.com/match/2"


r = session.get(url)


with open("2.js",'r') as fp:
    jscode = fp.read()


ctx = execjs.compile(jscode)


timestamp = str(int(time.time()*1000))


cookie = ctx.call("_0x3e163b",timestamp)




session.cookies.set("m",cookie[2:])


sum = 0
 
 
for i in range(1,2):
    api_url =f"http://match.yuanrenxue.com/api/match/2?page={i}"
    r = session.get(api_url)
    print (r.text)
    data = r.json()
    values = data["data"]
    for value in values:
        print (value)
        sum += value["value"]
 
 
print (sum)

请求结果:

cc34d00ddb7625ffbb815137b363b515.png

四.插件源码

完整源代码:

https://t.zsxq.com/kELKD

今天的分享就到这里,感谢阅读。

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

b60e027c97eea805a363477943d30856.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1872626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MongoDB:JSON and BSON

目录 什么是 JSON MongoDB-JSON连接 什么是 BSON MongoDB 使用 BSON 还是 JSON JSON 与 BSON 架构灵活性和数据治理 JSON 和 BSON 是近亲,正如它们几乎相同的名称所暗示的那样JSON(即 JavaScript 对象表示法)是网络上广泛流行的数据交换…

CVPR上新 | 从新视角合成、视频编解码器、人体姿态估计,到文本布局分析,微软亚洲研究院精选论文

编者按:欢迎阅读“科研上新”栏目!“科研上新”汇聚了微软亚洲研究院最新的创新成果与科研动态。在这里,你可以快速浏览研究院的亮点资讯,保持对前沿领域的敏锐嗅觉,同时也能找到先进实用的开源工具。 本周&#xff0…

2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-C证证考试题库及湖北省安全员-C证试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特种设备作业人员上岗证考试…

uni-app通过配置package.json实现环境变量、自定义条件编译

文章目录 前言官方提示使用方法微信小程序配置如下自定义条件编译使用方法 前言 uni-app 官方概括 官方文档 在开发web时,有时需要一套代码编译发布到不同的站点,比如主站和微信h5站。(注意不是一套代码内部自适应不同浏览器,是真…

CentOS 生命周期结束指南

2019 年 9 月,Red Hat 宣布打算废止 CentOS,并将其替换为 CentOS Stream。 CentOS 7 和 8 是 CentOS Linux 的最终版本。CentOS 7 和 8 的生命周期结束日期为: CentOS 8 - 2021 年 12 月 31 日 CentOS 7 - 2024 年 6 月 30 日 相关内容推荐 点…

MySQL数据库存储引擎

MySQL数据库存储引擎 存储引擎概念 存储引擎也称为表类型 通过不同的技术比如说,存储机制,索引技巧,锁定水平等等,来提供不同的功能。 查看MySQL支持的存储引擎 show engines\G; 常用引擎比较 对事务有需求 innodb …

MySQL丢失更新问题的出现和解决

MySQL丢失更新问题的出现和解决 丢失更新问题(Lost Update)指的是两个或多个事务在读同一数据并基于此数据进行更新操作时,某些更新操作被覆盖或丢失。例如,事务A和事务B都读取了某个数据,然后事务A更新了该数据&…

谷歌Gemma 2:开源模型的新里程碑

引言: 在人工智能领域,谷歌一直是创新的先行者。最近,谷歌DeepMind团队在I/O Connect大会上发布了Gemma 2,这是其开源模型系列的最新力作,标志着AI技术的又一大步。 Gemma 2的前身,Gemma,已经因…

0-30 VDC 稳压电源,电流控制 0.002-3 A

怎么运行的 首先,有一个次级绕组额定值为 24 V/3 A 的降压电源变压器,连接在电路输入点的引脚 1 和 2 上。(电源输出的质量将直接影响与变压器的质量成正比)。变压器次级绕组的交流电压经四个二极管D1-D4组成的电桥整流。桥输出端…

中电金信:时代有命题,运营有答案——咨询服务为金融机构运营加上智慧“基因”

这两年,很多搞运营的“卷王”都开始迷茫了 原因其实没别的:时代变了 与此同时,条线集中趋于成熟 跨条线共享障碍多多 运营模式创新所带来的变革红利 也达到了发展瓶颈 想破局就必须引入一些新“变量” 基于中电金信多年来对银行业的实践…

多行业预约门店服务小程序源码系统 支持多门店预约 带完整的安装代码包以及搭建教程

系统概述 该系统基于先进的云计算和大数据技术,采用模块化设计,具有高度的可扩展性和可定制性。无论是餐饮、美容美发、健身房还是其他服务行业,都可以通过该系统轻松实现多门店预约功能。同时,我们还提供了丰富的接口和插件&…

Linux防火墙【SNAT,DNAT】

NAT: 支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链 请求报文:修改源/目标IP, 响应报文:修改源/目标IP,根据跟踪机制自动实现 NAT的实现分为下面类型: SNAT:source…

goLang小案例-获取从控制台输入的信息

goLang小案例-获取从控制台输入的信息 1. 案例代码展示 package mainimport ("bufio""fmt""log""os" )var pl fmt.Printlnfunc main() {//控制台输出欢迎提示pl("Hello Go")fmt.Print("what is your name? ")…

【技术追踪】SDSeg:医学图像的 Stable Diffusion 分割(MICCAI-2024)

这医学图像分割领域啊,终究还是被 Stable Diffusion 闯进去了~ SDSeg:第一个基于 Stable Diffusion 的 latent 扩散医学图像分割模型,在五个不同医学影像模态的基准数据集上超越了现有的最先进方法~ 论文:Stable Diffusion Segmen…

安宝特分享 | 数字化革命,AR技术打造智慧城市的未来

随着城市化进程的加速和科技创新的不断推进, AR技术正逐步融入智慧城市建设的方方面面,为城市居民提供更智能、便捷、舒适的生活体验,开启了智慧城市的新时代。 01 优化城市规划与建设 AR技术在城市规划和建设中发挥着重要作用。城市规划师和…

leetcode提速小技巧

据我所知,leetcode可能是按最难那个用例给你打分的,非难题的用时好坏不完全看复杂度,因为可能都差不多,O(n/2)和O(n)虽然都是O(n),但是反应到成绩上是不同的,所以,尽可能的在条件足够的情况下提…

宏集物联网工控屏通过 S7 ETH 协议采集西门子 1200 PLC 数据

前言 为了实现和西门子PLC的数据交互,宏集物联网HMI集成了S7 PPI、S7 MPI、S7 Optimized、S7 ETH等多个驱动来适配西门子200、300、400、1200、1500、LOGO等系列PLC。 本文主要介绍宏集物联网HMI如何通过S7 ETH协议采集西门子1200 PLC的数据,文中详细介…

JVM专题五:类加载器与双亲委派机制

通过上一篇Java的类加载机制相信大家已经搞明白了整个类加载从触发时机,接着我们就来看下类加载器,因为类加载机制是有加载器实现的。 类加载器的分类 启动类加载器 Bootstrap ClassLoader 是 Java 虚拟机(JVM)的一部分&#x…

Sqlserver双活

要实现Sqlserver双活不是一件简单的事情,什么是双活,就是两边都活着,两边都可以访问,也就是A服务器部署一个sqlserver服务,B服务器部署一个sqlserver服务,两边数据双向同步保持一致,当A数据库服…

web前端之文档流、浮动、定位详解

目录 一、文档流 二、浮动 1.添加浮动 2.清除浮动 三、定位 1.相对定位 2.绝对定位 一、文档流 什么是文档流? ● 文档流指的是文档中的标签在排列时所占用的位置。 将窗体自上而下分成一行行 ,并在每 行中按从左至右的顺序排放标签&#xff0c…