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

文章目录

  • 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逆向变得更加简单

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库的备份模式(完全备份,增量备份,差异备份)

数据库的备份 备份原因 数据的丢失 数据的删除 备份目标 数据的一致性 数据的可用性 备份技术 物理备份/冷备份 直接复制数据库文件,适用于大型数据库环境,不受存储引擎的限制,但不能恢复到不同的MySQL版本。 常用的冷备份工具 ta…

利用iSCSI服务部署IP SAN网络存储服务

一、配置环境(Vmware WorkStation虚拟环境) 服务端与客户端OS:openEuler 22.03-LTS CPU:1U1C 内存:2G 硬盘:5个SCSI磁盘,其中一个作为系统盘,另外四个配置为RAID5阵列 服务器IP…

Leetcode刷题笔记题解(C++):83. 删除排序链表中的重复元素

思路:链表相关的问题建议就是画图去解决,虽然理解起来很容易,但就是写代码写不出来有时候,依次去遍历第二节点如果与前一个节点相等则跳过,不相等则遍历第三个节点 /*** Definition for singly-linked list.* struct …

实现Slider 滑块组件标记动态变化

实现以上效果&#xff0c;下拉框、slider滑块、按钮都在同一行&#xff0c;设置flex布局后&#xff0c;发现silider滑块最右边的标记数字一直都如下竖着显示&#xff0c;后来通过给源组件的标记区.el-slider__marks-text增加一个宽度后解决该问题。 <template><div>…

Polyspace静态检测步骤

Polyspace 是一个代码静态分析和验证的工具&#xff0c;隶属于MATLAB&#xff0c;用于检测代码中的错误和缺陷&#xff0c;包括内存泄漏、数组越界、空指针引用等。帮助开发团队提高代码质量&#xff0c;减少软件开发过程中的错误和风险。 1、打开MATLAB R2018b 2、找到Polys…

基于java,springboot和vue房屋租赁租房销售平台设计

摘要 在现代城市生活中&#xff0c;房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展&#xff0c;基于Spring Boot和Vue的房屋租赁系统应运而生&#xff0c;旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势&#xff0c;后端…

护眼台灯哪个品牌质量比较好?五大热门产品点评

护眼台灯作为孩子书桌上的照明神器&#xff0c;因为能起到护眼作用和很好的照明体验&#xff0c;得到了不少的认可。不过如今市场中也有很多劣质台灯&#xff0c;存在各种不足、做工差、选材廉价&#xff0c;导致光线无法起到护眼作用&#xff0c;甚至会引起近视。那么护眼台灯…

说一下 JVM 有哪些垃圾回收算法?

一、标记-清除算法 标记无用对象&#xff0c;然后进行清除回收。 标记-清除算法&#xff08;Mark-Sweep&#xff09;是一种常见的基础垃圾收集算法&#xff0c;它将垃圾收集分为两个阶段&#xff1a; 标记阶段&#xff1a;标记出可以回收的对象。清除阶段&#xff1a;回收被标…

Flutter插件开发指南02: 事件订阅 EventChannel

Flutter插件开发指南02: 事件订阅 EventChannel 视频 https://www.bilibili.com/video/BV1zj411d7k4/ 前言 上一节我们讲了 Channel 通道&#xff0c;但是如果你是卫星定位业务&#xff0c;原生端主动推消息给 Flutter 这时候就要用到 EventChannel 通道了。 本节会写一个 1~…

Fiddler工具 — 18.Fiddler抓包HTTPS请求(一)

1、Fiddler抓取HTTPS过程 第一步&#xff1a;Fiddler截获客户端发送给服务器的HTTPS请求&#xff0c;Fiddler伪装成客户端向服务器发送请求进行握手 。 第二步&#xff1a;服务器发回相应&#xff0c;Fiddler获取到服务器的CA证书&#xff0c; 用根证书&#xff08;这里的根证…

redis的搭建 RabbitMq搭建

官网 Download | Redis wget https://github.com/redis/redis/archive/7.2.4.tar.gz 编译安装 yum install gcc g tar -zxvf redis-7.2.4.tar.gz -C /usr/localcd /usr/local/redis make && make install 常见报错 zmalloc.h:50:10: fatal error: jemalloc/jemal…

创作无版权素材:解放创意的利器

title: 创作无版权素材&#xff1a;解放创意的利器 date: 2024/2/21 13:52:09 updated: 2024/2/21 13:52:09 tags: 无版权创作自由法律合规节省成本提升质量多样素材创意工具 在当今数字化时代&#xff0c;内容创作成为了一种非常重要的方式来传达信息和表达创意。 然而&#…

07 Redis之持久化(RDB+AOF)

4 Redis持久化 Redis 是一个内存数据库&#xff0c;然而内存中的数据是不持久的&#xff0c;若主机宕机或 Redis 关机重启&#xff0c;则内存中的数据全部丢失。 当然&#xff0c;这是不允许的。Redis 具有持久化功能&#xff0c;其会按照设置以快照或操作日志的形式将数据持…

电脑开机蓝屏错误代码c000021a怎么办 电脑蓝屏报错c000021a的解决办法

很多小伙伴在电脑开机的时候出现蓝屏代码c000021a都不知道该怎么去解决&#xff0c;所以今天就给你们带来了c000021a蓝屏解救方法&#xff0c;如果你还没解决的话就快来看看吧。 解决办法&#xff1a; 原因&#xff1a; c000021a蓝屏的原因有很多&#xff0c;主要有以下几种…

office 2021安装教程(官方自动批量激活,无付费)

全程不需要第三方软件&#xff0c;所有用到的工具都是微软官方的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 基于KMS的 GVLK&#xff1a;https://learn.microsoft.com/zh-cn/deployoffice/vlactivation/gvlks 首先我们需要去下载 office 软件部署工具&a…

开发模式:分支开发主干发布

基于分支开发 该操作必须基于某稳定代码版本&#xff0c;来支持新的feature和bugfix、improvement。 分支命名规则 建议以版本号前三位命名分支&#xff08;1.0.1.12&#xff09; 备注填写分支简介&#xff0c;如&#xff1a;feature *** or ****** 关于提测准入及发布上线…

华清远见作业第三十九天——Qt(第一天)

思维导图&#xff1a; 登录界面&#xff1a; 代码&#xff1a; #include "mainwindow.h" #include<QToolBar> #include<QPushButton> MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(600,400);this->setFixedSize…

PMP考试难度怎么样?

PMP考试整体难度并不大&#xff0c;因为目前的考试题型都是选择题&#xff0c;所以通过率相对较高。然而&#xff0c;新考纲中增加了更多关于敏捷方法的题型&#xff0c;这些题目相对更加变化多样&#xff0c;也有不少考生觉得难以抉择&#xff0c;四个选项都似乎都是正确的。P…

Python学习-列表1

十二、列表1 1、创建列表及基本运算 1&#xff09;使用中括号&#xff0c;将所有准备放入列表中的元素&#xff0c;包裹起来&#xff0c;不同元素之间使用逗号分隔。 举例&#xff1a; [1,2,3,4,5]2&#xff09;列表可以容纳不同类型的数据。 举例&#xff1a; [1,2,3,4,5,…

SmartForms笔记

目录 表Table表体区域脚标效果展示 带自增编号的结构新建循环设置变量的位置运行结果 表Table 右击“创建”—“表”&#xff1a; 绘制布局如下所示&#xff1a; 选择第一行&#xff0c;选择成“%LTYPE1”&#xff1a; 选择第二行&#xff0c;选择成“%LTYPE2”&#xff0c…