【爬虫JS逆向-工具篇】浏览器内存漫游加密参数Hook实战教程

news2024/11/22 18:44:51

文章目录

  • 1. 写在前面
  • 2. 环境搭建
  • 2. 加密定位实战

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  相信很多爬虫工程师在进行Web端JS逆向的时候,面对加密参数无从下手,不知道如何进行定位与分析。本期作者将介绍一款针对Web端逆向Hook定位加密的辅助工具给大家!内存漫游确实听起来有些虚高大上、实则就是检索浏览器内存数据…

以下是该工具功能与原理的部分描述:

    • 访问目标网站时设置浏览器走自定义的代理服务器,这个代理服务器要支持能够使用代码处理请求,这里选择是anyproxy
    • 在代理服务器这里,对请求做处理,对于JavaScript响应和HTML响应里的JS代码,使用AST实时处理,注入Hook逻辑
    • Hook逻辑就是所有涉及到变量的地方都经过我们的Hook方法,所以实现页面上所有的变量值都可以捕获到,可以把这个理解为内存中变量级别的抓包监控
    • 抓到的变量会被保存到一个变量数据库中,然后当你访问页面请求时带上加密参数的请求之后,从Chrome开发者工具的网络中把那个加密参数复制出来,切换到控制台调用本工具提供的api在变量数据库中搜索一下,可以搜索到存储该字符串的变量及变量所在的代码位置,点击代码位置可以自动切换到源面板并自动定位到变量位置
    • 变量级抓包监控,根据加密参数秒秒钟定位到加密逻辑的代码位置(追加密逻辑代码位置的通杀方案)

然后打断点往前找加密逻辑抠出来就可以,如果有多个加密参数或者加密参数为多个地方拼接生成,无脑重复此步骤即可!!

按照上述项目的描述,对Web端进行JS逆向中,在我们有时候无法快速精准的定位到加密参数入口时,确实可以用以辅助

2. 环境搭建

首先,第一步我们需要下载项目到本地,安装依赖:

npm install -g anyproxy
npm install shelljs

在这里插入图片描述

缺什么根据提示安装即可,如果在这里出现npm异常,可以尝试:

npm cache clean --force
npm config set strict-ssl false
npm config set registry https://npm.aliyun.com/

接下来,需要启动两个本地服务,我们分别来看一下代码实现,proxy-server.js代码如下所示:

const AnyProxy = require("anyproxy");

const options = { 
    port: 10086,
    rule: require("./rules"),
    webInterface: {
        enable: true,
        webPort: 8002
    },  
    throttle: 10000,
    forceProxyHttps: true,
    wsIntercept: false, // 不开启websocket代理
    silent: false
};
const proxyServer = new AnyProxy.ProxyServer(options);

proxyServer.on("ready", () => { /* */ }); 
proxyServer.on("error", (e) => { /* */ }); 
proxyServer.start();

首先导入一个代理服务的包Anyproxy,这个包的话在之前已经安装好了。端口设置的是10086,这个我们是可以自行修改的,然后引用了一个rules文件,这个文件内引用的就是核心的Hook逻辑。另外Web端口是8002,可以直接访问类似mit抓包界面

另一个需要启动的api-server.js服务代码如下所示:

const express = require("express");
const bodyParser = require("body-parser");
const {injectHook} = require("../components/global-assign-hook-component/core/inject-hook");

const app = express();

app.use(bodyParser.raw({
    verify: function (req, res, buf, encoding) {
        if (buf && buf.length) {
            req.rawBody = buf.toString("UTF-8");
        }   
    }, type: function () {
        return true
    }   
}));
// 将传过来的js代码注入hook
app.post("/hook-js-code", function (request, response) {
    const jsCode = decodeURIComponent(request.body.toString());
    let newJsCode = jsCode;
    try {
        newJsCode = injectHook(jsCode);
    } catch (e) {
        console.error(e);
    }   
    response.setHeader("Content-Type", "text/plain; charset=utf-8");
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Methods", "*");
    response.send(encodeURIComponent(newJsCode));
    response.end();
})

// 以后如果能够和页面上双向通信,上报各种数据到这里,就能够实现功能更强的分析之类的

const server = app.listen(10010, function () {
    console.log("启动成功");
})

代码中同样导入了一个NodeJS的Web服务器包express,有时候我们做爬虫可能会用到它来开发接口服务

启动第一个代理服务,运行命令如下:

node src/proxy-server/proxy-server.js

运行服务可能会提示缺少根证书(CA),在AnyProxy中,为了进行HTTPS代理,需要使用根证书进行中间人攻击,解决方法我们需要运行anyproxy-ca命令来生成根证书,如下图所示:

在这里插入图片描述
在这里插入图片描述

记得设置Anyproxy证书信任,不然无法进行有效的Hook

在这里插入图片描述

证书信任完成后,重新启动Server服务,如下:

在这里插入图片描述

接下来进入项目api-server文件下,同样方式启动监听服务:

在这里插入图片描述

服务启动后,在浏览器中配置IP地址跟端口,这里推荐使用Chrome搭建单独的调试环境,配合使用Proxy Switchy0mega或者其它类似的插件作为代理路由辅助,配置信息如下:

在这里插入图片描述

除了以上浏览器插件配置的方式,也可在网络设置中进行配置,具体方案不限,只要能够实现流量走AnyProxy代理就可以

2. 加密定位实战

服务已经搭建完成,接下来,这里我找了一个有加密参数的网站进行测试,这是一个翻页请求中带sign签名加密参数的接口,点击更多翻页,可以看到sign的值如下所示:

在这里插入图片描述

ATS实时处理JS文件会比较慢,同时会生成一个缓存目录来存放JS文件,加载文件如下:

在这里插入图片描述

这个时候我们直接将上面截图中sign签名的值拿到控制台进行Hook搜索,如下所示:

在这里插入图片描述

可以看到在上图的控制台中,会展示很多重要的信息字段,我们重点需要知道的就是sign这个值是在什么地方生成的,可以看到e是生成后的结果,执行的方法是Xt,我们点击跳转到代码处,如下所示:
在这里插入图片描述

这里会发现出现了很多名为cc11001100_hook的函数,可以把这个函数理解为它会直接返回第二个参数的值,对整体逻辑没有影响,分析时忽略它即可!

这里可能很多职业玩家会质疑,有的加密参数,直接使用参数名搜索或者轻量级Hook跟栈甚至是XHR跟栈那不是更加简便?没错!这个网站中的sign参数使用关键词搜索就能够定位到入口,如下所示:

在这里插入图片描述

可以看到加密方法Xt接受一个参数n,控制台打印看一下:

在这里插入图片描述

n是翻页接口请求URL所拼接的一堆参数,测试了一下Xt是一个标准的MD5加密算法:

在这里插入图片描述

有点讲的跑题了,本期还是回归主题说的是利用Hook工具去辅助我们JS逆向定位加密参数

最后,按照作者自己的说法本项目本身就是一个通杀工具,它并不针对某一个站。所以在爬虫Web端JS逆向分析中大家可以根据经验来选择合适的方案与工具!毕竟,一款好用的工具确实能够让JS逆向变得更加简单

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

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

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

相关文章

如何高效测试APP,快速定位bug?

一般提到测试,很多人会想到考试,但任意一个APP面世之前,也都需要多次测试,确保可以正常使用之后才会面世。有的公司会有专门的测试工程师,而在一般的互联网公司,大多由产品经理、工程师、设计师等兼职&…

vulnhub练习 DC-1复现及分析

一、搭建环境 1.工具 靶机:DC-1 192.168.200.17 攻击机:kali 192.168.200.13 2.注意 攻击机和靶机的网络连接方式要相同,另外DC-1的网络连接方式我这里采用NAT模式,是与kali的网络连接模式相同的(当然亦可以选用桥…

unity学习(28)——登录功能

有之前注册的知识,登录就很容易处理了。 登陆成功返回id: 登录失败返回null: 测试同一账号不能重复登陆!登录成功后最好可以跳到新的场景中 结果是好的,去服务器看一下对应部分的代码,可见,登…

多端开发围炉夜话

文章目录 一、多端开发 一、多端开发 uni-app 官网 UNI-APP中的UI框架:介绍常用的UI框架及其特点 uView UIVant WeappColor UIMint UI uniapp嵌入android原生开发的功能 uniapp使用安卓原生sdk uni-app中的uni.requireNativePlugin Qt for iOS Qt for Android

Deep Layer Aggregation(CVPR 2018)原理与代码解析

paper:Deep Layer Aggregation official implementation:https://github.com/ucbdrive/dla third-party implementation:https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/dla.py 本文的创新点 骨干网络的设计…

Spring Boot利用Kaptcha生成验证码

生成验证码 我们在登录或注册某个网站的时候,会需要我们输入验证码,才能登录注册,那么如何生成验证码呢?其实,生成验证码我们可以用Java Swing在后台内存里的区域画一个出来,但是非常麻烦,所以…

Linux系统——nginx服务介绍

一、Nginx——高性能的Web服务端 Nginx的高并发性能优于httpd服务 1.nginx概述 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间是2004年10月4日,版本…

KubeSphere 镜像构建器(S2I)服务证书过期解决方案

目前 KubeSphere 所有 3.x.x 版本,如果开启了 DevOps 模块并使用了镜像构建器功能(S2I)都会遇到证书过期问题。 解决方法 已开启 DevOps 模块 下载这个更新 S2I 服务证书压缩包,上传到任一可以访问 K8s 集群的节点; …

Java Web(一)--介绍

Java Web 技术体系图 三大组成部分: 前端: 前端开发技术工具包括三要素:HTML、CSS 和 JavaScript;其他高级的前端框架,如bootstrap、jquery,VUE 等。 后端: 后端开发技术工具主要有&am…

PiflowX-组件UnionAll

UnionAll组件 组件说明 Union多个输入源。输入源必须具有相同的字段类型。 计算引擎 flink 组件分组 common 端口 Inport:Any outport:默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子inportsInports“”无否Inports string are…

Atcoder ABC341 A - Print 341

Print 341(输出 341) 时间限制:2s 内存限制:1024MB 【原题地址】 所有图片源自Atcoder,题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例输入1】 …

基于python-socket构建任务服务器(基于socket发送指令创建、停止任务)

在实现ia业务服务器时需要构建一个python-socket客户端,1、要求能与服务器保持心跳连接,每10秒钟发送一次心跳信号;2、要求能根据socket服务器发送的指令创建或终止一个定时任务。 为此以3个类实现该功能,分别为socket通信类&…

Hypervisor是什么

Hypervisor 通常指的是虚拟机监视器(VirtualMachine Monitor),它是一种软件或硬件,可以在物理服务器上创建和管理多个虚拟机(VirtualMachine)。 Hypervisor 提供了一个抽象层,将物理服务器的资源…

基于SpringBoot的农产品智慧物流系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

Redis之缓存击穿问题解决方案

文章目录 一、书接上文二、介绍三、解决方案1. 单例双检锁2. 缓存预热和定时任务 一、书接上文 Redis之缓存雪崩问题解决方案 二、介绍 缓存击穿就是大量并发访问同一个热点数据,一旦这个热点数据缓存失效,则请求压力都来到数据库。 三、解决方案 1…

​LeetCode解法汇总106. 从中序与后序遍历序列构造二叉树

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给定两个…

惠尔顿 网络安全审计系统 任意文件读取漏洞复现

0x01 产品简介 惠尔顿网络安全审计产品致力于满足军工四证、军工保密室建设、国家涉密网络建设的审计要求,规范网络行为,满足国家的规范;支持1-3线路的internet接入、1-3对网桥;含强大的上网行为管理、审计、监控模块&#xff1b…

Dockerfile文件中只指定挂载点会发生什么?

当你在VOLUME指令中只指定容器内的路径(挂载点)而不指定宿主机的目录时,Docker会为该挂载点自动生成一个匿名卷。这个匿名卷存储在宿主机的某个位置,但这个具体位置是由Docker自动管理的,用户通常不需要关心这个存储位…

哪些工具可以改变手机电脑网络IP地址?

在互联网时代,网络已经成为了我们日常生活中不可或缺的一部分。然而,随着网络的普及和技术的不断发展,网络安全问题也日益凸显。为了保护个人隐私和信息安全,我们需要了解一些工具可以改变手机电脑网络IP地址的知识。 首先&#x…

谈谈我对低代码开发平台的理解

目录 一、前言 二、低代码谜团 三、低代码能解决哪些问题 四、好用的低代码平台 五、总结 一、前言 低代码“灵活、快速、低门槛”的标签,为其带来了诸多争议。在低代码平台上是否只能搭建极其简单、无亮点的小功能?低代码带来的“全民程序员”化是…