11.2 浏览器调试常用技巧

news2024/11/15 17:37:22

目录

1、开发者工具介绍

2、查看节点事件

3、断点调试

4、观察调用栈

5、恢复 JavaScript 执行

6、Ajax 断点

7、改写 JavaScript 文件


1、开发者工具介绍

由于需要学习 JavaScript 逆向,所以此文主要介绍与 JavaScript 逆向有帮助的功能。

以下链接为例:Scrape | Movie

右键 --> 检查,打开开发者工具,结果如下图所示:

这里可以看到多个面板标签,如 Elements 、 Console 、 Sources 等,这就是开发者工具的一个个面板,功能丰富而又强大。下面先对面板进行简单介绍。

  • Elements :元素面板,用于查看或修改当前网页 HTML 节点的属性、 CSS 属性、监听事件等。 HTML 和 CSS 都可以即时修改和即时显示。
  • Console :控制台面板,用于查看调试日志或异常信息。另外,我们还可以在控制台输入JavaScript 代码,方便调试。
  • Sources :源代码面板,用于查看页面的 HTML 文件源代码、 JavaScript 源代码、 CSS 源代码。此外,还可以在此面板对 JavaScript 代码进行调试,比如添加和修改 JavaScript 断点,观察 JavaScript 变量变化等。
  • Network :网络面板,用于查看页面加载过程中的各个网络请求,包括请求、响应等。
  • Performance :性能面板,用于记录和分析页面在运行时的所有活动,比如 CPU 占用情况、呈现页面的性能分析结果。
  • Memory :内存面板,用于记录和分析页面占用内存的情况,如查看内存占用变化,查看 JavaScript 对象和 HTML 节点的内存分配。
  • Application :应用面板,用于记录网站加载的所有资源信息,如存储、缓存、字体、图片等,同时也可以对一些资源进行修改和删除。
  • Lighthouse :审核面板,用于分析网络应用和网页,收集现代性能指标并提供对开发人员最佳实践的意见。(>>中)

了解了这些面板之后,我们来深入了解几个面板中对 JavaScript 调试很有帮助的功能。

2、查看节点事件

这里以进入下一页的节点为例,点击图中步骤 1 即可查看节点,步骤 2 查看鼠标指向节点,如下图:

步骤 2 过后,如下图:

右侧的 Styles 可以看到对应节点的 CSS 样式,可在这里自行增删样式,实时预览效果。

Computed 选项卡中,可以看到当前节点的盒子模型,可以看到当前节点最终计算出的 CSS 样式等,如下图:

 接下来,切换到右侧的 Event Listeners (事件监听器)选项卡,这里可以显示各个节点当前已经绑定的事件 ,都是 JavaScripl 原生支持的,下面简单列举几个事件。

  • click :用户点击 HTML 元素时会触发的事件。
  • keydown :用户按下键盘按键时会触发的事件。
  • mousedown:用户按下鼠标按钮时触发事件。可以监听这个事件来捕获鼠标按下的操作。
  • mouseup:用户松开鼠标按钮时触发事件。可以监听这个事件来捕获鼠标松开的操作。
  • change : HTML 元素改变时会触发的事件。
  • mouseover :用户在一个 HTML 元素上移动鼠标时会触发的事件。
  • mouseout :用户从一个 HTML 元素上移开鼠标时会触发的事件。
  •  load :浏览器完成页面加载时会触发的事件。

通常,按钮都会绑定一个点击事件,它的处理逻辑一般是由 JavaScript 定义的,这样在我们点击按钮的时候,对应的 JavaScript 代码便会执行。比如在下图中,我们切换到 第 2 页面的节点,右侧 Event Listeners 选项卡下会看到它的绑定事件。

这里有对应事件的代码位置,内容为一个 JavaScript 文件名称 chunk-vendors.77daf991.js,然后紧跟一个冒号,接着跟了一个数字 7 。所以对应的事件处理函数是定义在 chunk-vendors.77daf991.js 这个文件的第 7 行。点击这个代码位置,便会自动跳转到 Sources 面板,打开对应的 chunk-vendors.77daf991.js 文件并跳转到对应的位置,如下图所示:

如果显示的代码可读性很差(上述图片中是优化了的结果),点击上述图片中的 { }就能优化代码。

我们在 JavaScipt 逆向过程中利用好 Event Listeners ,可以轻松找到各个节点绑定事件的处理方法所在位置,帮助找到一些突破口。

3、断点调试

接下来,我们介绍一个非常重要的功能——断点调试。在调试代码的时候,我们可以在需要的位置上打断点,当对应事件触发时,浏览器就会自动停在断点的位置等待调试,此时我们可以选择单步调试,在面板中观察调用栈、变量值,以更好地追踪对应位置的执行逻辑。
那么断点怎么打呢?我们接着以上面的例子来说。首先单击上图红线的下一行代码,会出现如下图效果:

这时候行号处就出现了一个蓝色的箭头,这就证明断点已经添加好了,同时在右侧的 Breakpoints 选项卡下会出现我们添加的断点的列表。
由于我们知道这个断点是用来处理翻页按钮的点击事件的,所以可以在网页里面点击按钮试一下,比如点击第 2 页的按钮,这时候就会发现断点被触发了,如下图所示:

这时候我们可以看到页面中显示了一个叫作 Paused in debugger 的提示,这说明浏览器执行到刚才我们设置断点的位置处就不再继续执行了,等待我们发号施令执行调试。

此时代码停在了该行,回调参数 e 就是对应的点击事件 PointerEvent 。在右侧的 Scope 面板处,可以观察到各个变量的值,比如在 Local 域下有当前方法的局部变量,我们可以在这里看到 PointerEvent 的各个属性,如下图所示:

另外,我们关注到有一个方法 o ,它在 Jr 方法下面,所以切换到 Closure(Jr) 域,可以查看它的定义及其接收的函数,如下图所示:

我们可以看到, Functionlocation 又指向了方法 o ,点击之后便又可以跳到指定位置,用同样的
方式进行断点调试即可。
在 Scope 面板还有多个域,这里就不再展开介绍了。总之,通过 Scope 面板,我们可以看到当前执行环境下变量的值和方法的定义,知道当前代码究竟执行了怎样的逻辑。

接下来,切换到 Watch 面板,在这里可以自行添加想要查看的变量和方法。点击右上角的+按钮。我们可以任意添加想要监听的对象,如下图所示:

假如这里我们比较关注 o._wrapper 方法,于是点击添加 o._wrapper ,这里就会把对应的方法定义呈现出来,展开之后再点击 FunctionLocation 定位其源码位置。

我们还可以切换到 Console 面板,输入任意的 JavaScript 代码,此时便会执行、输出对应的结果,比如输入 arguments[0] ,此时便会输出对应的结果,如下图所示:

我们还可以选择单步调试,这里有三个重要的按钮,如下图所示:

这3个按钮都可以做单步调试,但功能不同。

  • 第一个 Step Over Next Function Call:逐语句执行,跳过下一个函数调用。当遇到函数调用时,它会直接执行该函数并跳过函数内部的逐步执行,直接移到函数调用后的下一行代码。这对于不想深入函数内部执行细节,而是只关注函数调用的结果的情况非常有用。
  • 第二个 Step Into Next Function Call:逐步进入下一个函数调用。这意味着如果当前行包含函数调用,使用Step Into会跳转到该函数内部并逐步执行函数内部的代码。
  • 第三个 Step Out of Current Function:跳出当前方法。

用得较多的是第一个,相当于逐行调试,即跳转至下一行。(若点击多次Step Over Next Function Call后调用栈中没有方法了,且Step Over Next Function Call点击不了可能是因为执行的函数中没有其他函数调用或者调用的函数已经执行完毕,或者当前代码处于异步执行状态,比如正在等待某个异步操作的结果,这时候该按钮可能会被禁用,因为执行下一行代码可能会导致未知的行为。或者当前代码处于某个循环或递归中,如果想继续执行代码,可以尝试使用Step Into Next Function Call)

4、观察调用栈

在调试的过程中,有时候也会直接跳转至非下一行的新位置。那究竟是如何跳转过来的了?比如我们点击 Step Into Next Function Call,跳转到了一个叫作 nt 的方法中,如下图:

在 Call Stack中我们可以看到全部的调用过程,直接点击其中的方法,就可以跳转到对应的代码位置。

有时候调用栈是非常有用的,可以回溯某个逻辑的执行流程,从而快速找到突破口。

5、恢复 JavaScript 执行

在调试过程中,如果想快速跳到下一个断点或者让 JavaScript 代码运行下去,可以点击 Resume script execution 按钮,即上图三个按钮旁边的蓝色三角形按钮。

6、Ajax 断点

上面我们介绍了一些DOM 节点的监听器(Listener),通过监听器我们可以手动设置断点并进行调试。但其实针对这个例子,通过翻页的点击事件监听器是不太容易找到突破口的。

接下来我们再介绍一个方法——Ajax断点,它可以在发生 Ajax 请求的时候触发断点。对于这个例子,我们的目标其实就是找到Ajax 请求的那一部分逻辑,找出加密参数是怎么构造的。可以想到,通过Ajax断点,使页面在获取数据的时候停下来,我们就可以顺着找到构造Ajax请求的逻辑了。怎么设置呢?
我们把之前的断点全部取消,切换到Sources 面板下,然后展开 XHR/fetch Breakpoints,这里就可以设置Ajax断点,如下图所示:

要设置断点,就要先观察 Ajax 请求。和之前一样,我们点击翻页按钮 2,在Network面板里面观察Ajax 请求是怎样的,请求的 URL 如图11-23所示。

可以看到,URL里面包含 /api/movie 这样的内容,所以我们可以在刚才的 XHR/fetch Breakpoints 面板中添加拦截规则。点击+按钮,可以看到一行 Break when URL contains: 的提示,意思是当Ajax 请求的 URL 包含填写的内容时,会进入断点停止,这里可以填写 /api/movie,如下图所示:

这时候再点击翻页按钮 3 ,触发第 3 页的 Ajax 请求,会发现点击后页面走到断点停下来了,如下图:

看一下右侧的代码,发现它停到了 Ajax 最后发送的那个时候,即底层的 XMLHttpRequest 的 send 方法,可是似乎还是找不到 Ajax 请求是怎么构造的。前面我们讲过 Call Stack ,通过它可以顺着找到前序调用逻辑,所以顺着它一层层找,也可以找到构造 Ajax 请求的逻辑,最后会找到一个叫作 onFetchData 的方法,如下图:

接下来,切换到 onFetchData 方法并将代码格式化(右下角{ },下图是以优化的代码),可以看到如下图所示的调用方法:

可以发现,这里可能使用 axios 库发起了一个 Ajax 请求,还有 limit 、 offset 、 token 这3个参数,基本就能确定了,顺利找到突破口!我们就不在此展开分析了。

因此在某些情况下,我们可以比较容易地通过 Ajax 断点找到分析的突破口,这是一个常见的寻找 JavaScript 逆向突破口的方法。
要取消断点也很简单,只需要在 XHR / fetch Breakpoints 面板取消勾选即可。

7、改写 JavaScript 文件

我们知道,一个网页里面的 JavaScript 是从对应服务器上下载下来并在浏览器执行的。有时候,我们可能想要在调试的过程中对 JavaScript 做一些更改,比如说有以下需求。

  • 发现 JavaScript 文件中包含很多阻挠调试的代码或者无效代码、干扰代码,想要将其删除。
  • 调试到某处,想要加一行 console.log 输出一些内容,以便观察某个变量或方法在页面加载过程中的调用情况。在某些情况下,这种方法比打断点调试更方便。
  • 调试过程遇到某个局部变量或方法,想要把它赋值给 window对象以便全局可以访问或调用。
  • 在调试的时候,得到的某个变量中可能包含一些关键的结果,想要加一些逻辑将这些结果转发到对应的目标服务器。

这时候我们可以使用浏览器的 Overrides 功能,它在 Sources 面板左侧,如下图所示:


下面来使用一下 Overrides 功能。
首先,根据前面设置 Ajax 断点的方法,找到对应的构造 Ajax 请求的位置,根据一些网页开发知识,我们可以大体判断出 then 后面的回调方法接收的参数 a 中就包含了 Ajax 请求的结果,如下图所示:

点击 Overrides ,点击+按钮,这时候浏览器会提示我们选择一个本地文件夹,用于存储要替换的 JavaScript 文件。这里我选定了一个新建的文件夹 ChromeOverrides ,注意这时候可能会遇到如下图所示的提示,如果没有问题,直接点击"允许"即可。

这时,在 Overrides 面板下就多了一个 ChromeOverrides 文件夹,用于存储所有我们想要的 JavaScript 文件,如下图:

我们可以看到,现在所在的 JavaScript 选项卡是 chunk-10192a00.243cb8b7.js,可以直接在浏览器中修改的,添加一行代码 console.log()(输出内容,该行代码是为了在 Ajax 请求成功获得响应的时候,在控制台输出响应的结果。) ,修改如下:

then((function(a) {
	        console.log('response', a) // 添加一行代码
                        var e = a.data
                          , s = e.results
                          , n = e.count;
                        t.loading = !1,
                        t.movies = s,
                        t.total = n
                    }

写入时,会弹出提示,直接按照提示输入即可,输入完毕后保存,之后切换回 Overrides 面板,就可以发现成功生成了新的 JavaScript 文件,它用于替换原有的 JavaScript 文件,如下图:

此时我们取消所有断点,然后刷新页面,就可以在控制台看到输出的响应结果了,如下图所示:


正如我们所料,我们成功将变量 a 输出,其中的 data 字段就是 Ajax 的响应结果,证明改写 JavaScript 成功!而且刷新页面也不会丢失了。
我们还可以增加一些 JavaScript 逻辑,比如直接将变量 a 的结果通过 API 发送到远程服务器,并通过服务器将数据保存下来,也就完成了直接拦截 Ajax 请求并保存数据的过程了。
修改 JavaScript 文件有很多用途,此方案可以为我们进行 JavaScript 逆向带来极大的便利。

文章到此结束,本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢大家,一起加油吧!

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

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

相关文章

国内:深圳交通流量数据集

数据来源:深圳政府数据开放平台(深圳市政府数据开放平台),这个官网上还有其他类数据集,值得收藏!!! 数据集介绍:宝安区-G4高速西乡大道入口车流量统计 第一行每列的标题…

记一次Debug与Release版程序输出不一致的问题解决

问题叙述: 在x86平台下无论Debug还是Release都没问题,而在arm平台下Debug版本程序无问题,Release版本程序(-O3编译)发现输出值不正确,怀疑值被篡改,于是在调用前后分别使用printf打印出参数值&…

vitepress系列-04-规整sideBar左侧菜单导航

规整左侧菜单导航 新建navConfig.ts 文件用来管理左侧导航菜单: 将于其他的配置分开,避免config.mts太大 在config目录下,新建 sidebarModules文件目录用来左侧导航菜单 按模块进行分类: 在config下新建sidebarConfig.ts文件&…

3dmax经常染失败?优化方法提升染质量!

在三维建模和渲染的过程中,优化模型和场景的效率是至关重要的。以下是一些提升效率的方法: 模型简化:在创建模型时,应尽量减少使用的命令和修改器的数量。这是因为命令和修改器越多,消耗的内存和CPU资源也就越多&…

vitepress系列-05-其他优化设置

其他优化设置 设置底部上一页和下一页 设置: import { defineConfig } from vitepress// https://vitepress.dev/reference/site-config export default defineConfig({lang: en-US,title: "东东爱编码的技术博客",description: "记录日常学习点点…

Cute Background FX

Cute Background FX是环境背景粒子系统的集合。非常适合作为菜单的背景。 该包包括: -20个独特预制件+20个URP预制件 -5种独特的环境设计 -15种纹理 -2个自定义着色器+2个URP着色器 -共59项独特资产 -一个演示场景,您可以在其中概述所有内容。 所有纹理都是512x512分辨率的P…

布隆过滤器详解及java实现

什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种数据结构,用于判断一个元素是否属于一个集合。它的特点是高效地判断一个元素是否可能存在于集合中,但是存在一定的误判率。 布隆过滤器的基本原理是使用一个位数组…

原型变量、原子操作、原子性、内存序

一、原子变量、原子操作 锁竞争:互斥锁、条件变量、原子变量、信号量、读写锁、自旋锁。在高性能基础组件优化的时候,为了进一步提高并发性能,可以使用原子变量。性能:原子变量 > 自旋锁 > 互斥锁。 操作临界资源的时间较长…

第十讲 Query Execution Part 1

1 处理模型【Processing Model】 DBMS 的处理模型【Processing Model】定义了系统如何执行【execute】查询计划【Query Plan】。 针对不同的工作负载进行不同的权衡。 方法1:迭代器模型【Iterator Model】 方法2:物化模型【Materialization Model】 方…

linux虚拟机上安装,使用以及远程连接mysql

1. 安装mysql 5.7 1) 首先更新软件源 sudo apt-get update 2) 安装MySQL数据库软件 ​ sudo apt-get install mysql-server 3) 安装MySQL数据库管理软件​ sudo apt-get install mysql-client 4) 安装MySQL数据库客户端,用户访问数据库 sudo apt-get install…

JAVA—抽象—定义抽象类Converter及其子类WeightConverter

同样,我们由这道题引出抽象类,抽象方法这个概念。 按下面要求定义类Converter及其子类WeightConverter 定义抽象类:Converter: 定义一个抽象类Converter,表示换算器,其定义的如下: 一个私有…

HarmonyOS实战开发DLP-如何实现一个安全类App。

介绍 本示例是一个安全类App,使用ohos.dlpPermission 接口展示了在eTS中普通文件加密受限的过程。 效果预览 使用说明: 1.启动应用后点击“”按钮可以添加一个普通文件; 2.长按点击加密按钮,出现加密权限弹窗,选择需要设置的权限并点击确定…

【C语言】_文件类型,结束判定与文件缓冲区

目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式,数据文件被称为文本文件或二进制文件; 数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进…

蓝桥杯刷题-13-子矩阵-二维滑动窗口 ಥ_ಥ

给定一个 n m (n 行 m 列)的矩阵。 设一个矩阵的价值为其所有数中的最大值和最小值的乘积。求给定矩阵的所有大小为 a b (a 行 b 列)的子矩阵的价值的和。 答案可能很大,你只需要输出答案对 998244353 取模后的结果。…

Redis 的主从复制、哨兵和cluster集群

目录 一. Redis 主从复制 1. 介绍 2. 作用 3. 流程 4. 搭建 Redis 主从复制 安装redis 修改 master 的Redis配置文件 修改 slave 的Redis配置文件 验证主从效果 二. Redis 哨兵模式 1. 介绍 2. 原理 3. 哨兵模式的作用 4. 工作流程 4.1 故障转移机制 4.2 主节…

Java开发测试(第一篇):Java测试框架JUnit5

目录 1.基本介绍 2.maven中安装JUnit5 3.使用 4.JUnit5命名规则 5.JUnit5常用注解 6.JUnit5断言 7.JUnit5多个类之间的继承关系 8.JUnit5参数化 (1)使用场景: (2)使用前需在pom.xml文件中导入依赖 &#xff…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

怀俄明探空站数据解算PWV和Tm

1. Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明探空站数据解算PWV和Tm&#xff09;&#xff0c;或者咸鱼关注&#xff1a;WZZHHH123 怀俄明探空站数据解算PWV和Tm&#xff1a; 有关 Matlab 获取代码可关注公众号WZZHHH回复&#xff08;怀俄明多线程下载&#…

最新怎么订阅OnlyFans上喜欢的博主,详细教程

大家好&#xff0c;本文教大家如何用虚拟信用卡在 Onlyfans 订阅&#xff0c;链接在浏览器打开地址https://bewildcard.com/i/GPT310&#xff0c;虚拟卡开好之后&#xff0c;用支付宝充值就可以进行订阅OnlyFans平台的博主了。 什么是OnlyFans&#xff1f; OnlyFans 是一个提…

毅速解析:金属3D打印模具工件性能如何?

3D打印技术&#xff0c;在模具随形水路、异形模具制造以及模具排气结构等方面的独特优势&#xff0c;已成为模具升级的重要技术方向&#xff0c;并受到众多注塑、压铸等模具行业的青睐。 然而&#xff0c;面对这一新兴技术&#xff0c;不少人不免心生疑虑&#xff1a;3D打印技术…