JavaScript加解密基础——附案例
好的,我现在需要帮用户总结一篇文章的内容,控制在100字以内。首先,我得仔细阅读用户提供的文章内容,了解主要结构和重点。 文章分为几个部分:Elements、Network、TCP与UDP、顶层协议、HTTP到HTTPS、WebSocket、调试基础和案例。每个部分都有详细的说明,比如Elements介绍了断点、JS路径复制等;Network部分提到了缓存设置和网速限制;HTTP到HTTPS详细解释了请求头和响应头;调试基础则介绍了断点管理器和其他调试工具。 接下来,我需要提炼每个部分的核心内容,并确保在100字以内涵盖所有要点。可能的结构是先概述主要内容,然后提到具体工具和技术,比如断点调试、网络设置等。 最后,要确保语言简洁明了,不使用复杂的术语,让用户能够快速理解文章的核心内容。 </think> 文章介绍了网页开发与调试的基础知识,包括断点调试、网络请求分析、HTTP/HTTPS协议、WebSocket通信及常用调试工具的使用方法。内容涵盖JS代码调试技巧、网络数据包抓取与解析、协议原理及实际案例分析。 2026-2-27 01:11:39 Author: www.freebuf.com(查看原文) 阅读量:2 收藏

一、Elements

第一:我们可以在任何地方下断点。

1772072039_699fac672d9d94fb49b00.png!small?1772072041654

第二:我们可以复制 JS 路径。

1772072618_699faeaa5a9fb36a88b8a.png!small?1772072621011

1772072636_699faebce930f5c69fde9.png!small?1772072639301

第三:事件列表。

1772072654_699faecef3fe15cb44eab.png!small?1772072658239

第四:Ctrl+f这里面搜得到的内容,是 JS 已经渲染好的内容,这里边可以搜得到,不代表他没有加密。

1772072672_699faee0175fdb2408ddc.png!small?1772072674841

第五:UA 头设置。

1772072688_699faef0025b99bfe6fdc.png!small?1772072690352

第六:F1进入设置界面,可以进行基本的设置。

1772072706_699faf02d718ad75a212a.png!small?1772072709425

有时候,下断点会直接下到 webpack 文件中,导致我们断不上,这时候我们需要去取消掉这个勾选。

1772072723_699faf1387c247eff0c77.png!small?1772072726016

第七: map 文件还原 webpack。

https://gitee.com/BobZ/webpack-sourcemap-unpacker

二、Network

第一:这两个选项是禁止输出和禁止缓存。

1772072837_699faf854d8ab1bca20ac.png!small?1772072839678

1772072851_699faf93b8df54837346f.png!small?1772072854739

不勾选的话,直接使用内存缓存,我们会出现 Hook 不到的情况,所以我们勾选上这个选项。

1772072867_699fafa3405e6f5bf9d04.png!small?1772072869772

第二:设置浏览器网速,设置上传下载的网速。

1772072889_699fafb9481b45a9bc027.png!small?1772072891847

1772072910_699fafce52437ba9f7503.png!small?1772072912696

第三:这里是筛选包信息。

1772072928_699fafe0bafa0ee7e22b1.png!small?1772072931538

XMLHttpRequest类似于Request

关键字搜索。

1772072947_699faff3bc2fa763c8b30.png!small?1772072950689

浏览器数据储存的总览,包括 cookies......

三、TCP 与 UDP

TCP协议:是底层协议,安全,但是速度慢,当前网站上的所有协议都是 TCP 协议。

UDP协议:不安全,不能保证数据完成性,速度快。

四、顶层协议

HTTP,HTTPS,FTP,SMTP,POP3,MQTT。
HTTP --> HTTPS
HTTPS://		协议
baidu.com		一级域名
hao.baidu.com	        二级域名
/xx/xxx.jsp		网站路径

http 的默认端口是 80,https 的默认端口是 443。

五、HTTP --> HTTPS

5.1、请求头

我们一般查看的话,只关注两种,一种是xhr,另一种是document

1772073440_699fb1e096c42f7887a23.png!small?1772073443874

请求头 url:

https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_10169502174917163033%22%7D&n_type=-1&p_from=-1

请求方法:

常见的有:GET,POST,HEAD,PUT。

1772073457_699fb1f155b8cbb62fc03.png!small?1772073459825

服务器处理返回的结果。

这里显示为 200。

IP 地址:1772073478_699fb206527bc426f04c5.png!small?1772073480841

这里显示的 IPV6 地址。

请求头:

客户端希望接收的响应体的数据类型。

1772073500_699fb21c1e7d0c0fffc35.png!small?1772073502541

请求流文件所需的。

1772153878_69a0ec167d88f292cbf3f.png!small?1772153879882

Cookie 中红框中的可能就是身份标识。

1772073531_699fb23bbee48069862ee.png!small?1772073538053

显示网站来源,很多网站都有检测网站来源的校验。

1772073544_699fb248a3232d2641841.png!small?1772073548838

可以自定义的 User-Agent。

1772073557_699fb25545edb2bd6e00c.png!small?1772073561591

除了上述描述的内容,其他都可以省略。

1772073571_699fb2636a1e7bba5ce8b.png!small?1772073574306

5.2、响应头

1772073587_699fb273a5bec8da49957.png!small?1772073591155

有百度或者其他网站自带的字段,可以删除,下面的 set-cookie 是服务器返回的,非常重要,其他字段都可以删除。

1772073601_699fb281783c65c2f8cec.png!small?1772073603918

5.3、 响应体:

下面是响应体内容。

1772073615_699fb28f1f02b576c75ec.png!small?1772073617589

5.4、XMLHttpRequest

XMLHttpRequest会有sendajax方法,是因为XMLHttpRequest中包含send方法,所以当加载XHR的时候,会加载 send 等等方法。

1772073636_699fb2a44a5c9cccff9a5.png!small?1772073638659

1772073647_699fb2af0cce3ebd32f83.png!small?1772073649411

时间轴顺序。

1772073663_699fb2bf756f85b21e1e5.png!small?1772073666119

六、WebSocket

6.1、响应体

websocket --> websockets

1772073680_699fb2d05b38d1d52a3f2.png!small?1772073682955

101 代表协议升级,我们的 websocket 是通过 http 升级上来的,不能删除。

1772073698_699fb2e23438995aa1cb4.png!small?1772073700663

这里的 key 大多数都是随机生成的,但是有些网站是固定的。

1772073725_699fb2fdaaffdd1868610.png!small?1772073728490

HTTP是send 出来的,但是 websocket 是 new 出来的。

1772073745_699fb311567045539f2bc.png!small?1772073748425

HTTP是你发送一条数据,服务器立马返回一条,就完成一次请求,而 websocket是一直连接的,所以说 websocket 是持续的。

6.2、小计

怎么去查看数据包中的字段(加密),在 Type 字段查看:XML->document->......

1772073770_699fb32ae4474c7a5a0d2.png!small?1772073774192

七、调试基础

我们在刷新的时候,任意选择 js,选择在来源面板打开,就会进入到调试页面。

1772074013_699fb41dc1acd4ae9a133.png!small?1772074016289

第一件事,我们选择格式化代码。

1772074028_699fb42c66c555084cb5a.png!small?1772074030826

7.1、按钮介绍

F8此功能,就是我们下好断点,运行到断点处,继续点击此处会运行到下一个断点,没有断点,会一直执行到结束。

1772074043_699fb43b6c7014e4ccd67.png!small?1772074046227

在行号前进行下断点。

1772074058_699fb44ac66b60c6c9490.png!small?1772074061525

一行会有很多方法,只有当我们手动点亮的时候,才能断住,全部点亮时,会挨个断住。

1772074088_699fb468c00645c3b5b03.png!small?1772074091693

当我们点击大括号的时候,它会帮我们括住一个方法体,就是括号下面会出现一个小横线。

1772074108_699fb47c17e1168972507.png!small?1772074111704

F10 面这个标志,是跳到下一个方法。

1772074123_699fb48b41922420b8c81.png!small?1772074126062

注意:通常情况下一个小括号就是一个方法,我们有时候也要依据情况而定。

F11下面的按钮是步入到当前的方法,进入方法里面。

1772074139_699fb49bee05d1d9ad989.png!small?1772074142820

Shift+F11下面按钮是执行完当前的方法,步出方法。

1772074161_699fb4b1be66019c267c3.png!small?1772074164216

F9当前这一行,有好几个方法,我们运行到下一个方法,也就是运行一小步。

1772074174_699fb4bea80e4beeb7348.png!small?1772074177291

忽略所有断点。(DOM 断点和异常捕获断点除外)

1772074189_699fb4cdb87e5dd1969d7.png!small?1772074192162

异常捕获。

1772074211_699fb4e39eb3eedb7105a.png!small?1772074214158

1772074230_699fb4f6c335614b44a86.png!small?1772074233730

try{
    var name = window.zhangsan.name;
}catch{
    console.log("您写错了");
}
代码行断点:
    1、debugger
    2、点击行号断点

7.2、抽屉栏介绍

1772074264_699fb518dc1cd4fa2ad1a.png!small?1772074267237

7.2.1、断点管理器

断点管理器,这里我们可以取消断点,也可以添加断点。

1772074279_699fb527a122604b4c5d9.png!small?1772074281995

7.2.2、DOM 断点

也就是页面元素断点,我们在元素区进行断点。

1772074291_699fb53317e5127a1899b.png!small?1772074294283

可以两个都选择上,就可以在 DOM 列表里面看见我们所下载的断点,也可以进行断点的取消。

1772074306_699fb542d46fec20dbeff.png!small?1772074309173

7.2.3、全局的事件断点

1772074322_699fb552b70fd4e854726.png!small?1772074326132

7.2.4、xhr fetch断点

发包断点,说白了就是 send 断点,也就是说,在底层 hook 了 send 函数。

hook:控制原函数的执行流程。

1772074342_699fb566b9799d144e323.png!small?1772074345150

7.2.5、条件断点

条件断点:有些断点会一直在循环里面执行,我们就可以设置一个值,来快速的结束当前断点,执行下面的流程。

条件断点的作用:

1、过滤断点

2、跳过断点

1772074363_699fb57b096d485a430f5.png!small?1772074365852

当前行,如果条件设置为 flase,则当前行的所有断点不生效。

1772074375_699fb5879023315999eb2.png!small?1772074378115

7.2.6、变量监控

1772074388_699fb59424b5f151c895a.png!small?1772074390606

可以将变量写在监视里面,查看变量是否变化。

1772074401_699fb5a119aa49ae7eb14.png!small?1772074403491

7.2.7、方法栈和作用域

1772074509_699fb60d7fa9a4800f991.png!small?1772074512884

栈里面清楚的表明了调用关系,和使用了那个 js 和行号。

1772074521_699fb619a4c34cf1c87f8.png!small?1772074524313

当前本地作用域。

1772074536_699fb62880ab6c3cb1a01.png!small?1772074539114

当前方法作用域。

1772074551_699fb63764809a4e79a67.png!small?1772074554065

全局作用域。(Window)

1772074566_699fb64602077dd924de0.png!small?1772074568678

在作用域找值得时候,是一层一层的找,直到找到全局作用域的时候,如果没有就出现undefined

本地->闭包->全局

8、案例

8.1、案例一:

aHR0cHM6Ly9wYXNzcG9ydC54aW1hbGF5YS5jb20vcGFnZS93ZWIvbG9naW4/ZnJvbVVyaT1odHRwczovL3N0dWRpby54aW1hbGF5YS5jb20=

1772074627_699fb6835fdc8e3f0a2b6.png!small?1772074630331

输入账号密码,点击登录,找到登录包。

1772074691_699fb6c3a4e454a4e6679.png!small?1772074694971

发现 password 字段被加密,我们进入被加密的 js 代码中,这里点击源代码/来源,即可进入 js 代码中。

1772074707_699fb6d31207a90eea622.png!small?1772074709385第一种:Ctrl+f寻找 password 字段。

e.accoutLogin = function(t) {
  var e = t.type
    , r = void 0 === e ? "h5" : e
    , n = t.account
    , o = t.password
    , a = l(t, ["type", "account", "password"]);
  return (0,
          u.getNonce)(r).then((function(t) {
    n = (0,
         u.getEncryptPwd)(n),
      o = (0,
           u.getEncryptPwd)(o);
    var e = (0,
             u.getSignature)({
      account: n,
      password: o,
      nonce: t
    });
    return (0,
            i.request)({
      url: "/".concat(r, "/login/pwd/v2"),
      method: "post",
      data: c({
        account: n,
        password: o,
        nonce: t,
        signature: e
      }, a)
    })
  }
                              ))
};

找到加密函数段。

1772074746_699fb6fa116df55685c80.png!small?1772074748780

打上断点,断点位置分别在(函数开始前,加密函数处,函数结束后),然后继续输入账号密码,进入断点调试。

1772074779_699fb71bd62ee326b4d71.png!small?1772074782274

可以很明显看出来,我们输入的内容。

找到加密方法,并去除花指令。

n = (0,u.getEncryptPwd)(n) = n = u.getEncryptPwd(n)
o = (0,u.getEncryptPwd)(o) = o = u.getEncryptPwd(o)

可以看出来,加密函数就是getEncryptPwd

第二种:堆栈寻找法,输入账号密码,进行抓包,找到加密字段。

1772074803_699fb7330a41358f5caac.png!small?1772074805503

进入第一个 js 打上断点。

1772074818_699fb742e0ae1cc671c9e.png!small?1772074821393

继续登录,断住断点。

1772074869_699fb775cb38d59f282cc.png!small?1772074872649

调用堆栈一个一个向上寻找。

1772074885_699fb785ba1ac5b6340f5.png!small?1772074888143

当走到e.accoutLogin这个栈时,找到加密函数。

8.2、案例二:

aHR0cDovL3d3dy5haXdlaTM2NS5jb20vbG9naW4=

1772074933_699fb7b5b617a9847a2b9.png!small?1772074936061

输入账号密码,找到请求包中的字段。

1772074945_699fb7c19ac06d68f736f.png!small?1772074948069

可以看到 password 被加密了。

1772074968_699fb7d8bc517a921bbe0.png!small?1772074971157

点击 send,进入 js 代码。

1772074996_699fb7f40b27dbd8b81dd.png!small?1772074998562

调用堆栈这里,第一个是 send,第二个是 ajax,不用看,它们是封装的方法,我们看第三个堆栈。

1772075020_699fb80cb67df13eab330.png!small?1772075023247

可以看到方法中第二个参数,传递了值。

1772075036_699fb81cbfd5166e843f7.png!small?1772075039232

这里第一个参数为空,第二个参数,对密码进行了 MD5 加密,且有一个固定的盐。

1772075046_699fb826b447d2f6519b3.png!small?1772075049540

最终加密代码。

username: $('input[name=username]').val();
password: CryptoJS.MD5(pwd).toString();

8.3、案例三:

aHR0cHM6Ly93d3cuNTEuY29tL3MvOTY1Mi8/dGc=

1772075065_699fb8392b340452df47b.png!small?1772075068064

输入账号密码,登录抓包。

1772075077_699fb845b540a8c7d07fa.png!small?1772075081113

第一种:找到加密数据包。

1772075094_699fb856ac5a187befdc8.png!small?1772075097492

发现是script,直接利用栈。

1772075108_699fb86498300cea02591.png!small?1772075110975

直接找到加密函数传输处。

第二种:像这种 callback,jsonp 的直接去搜索红框中的接口。

1772075122_699fb872e8d0bbbd3c6f0.png!small?1772075125305

Ctrl+Shift+f进行全局搜索/login/submit

1772075137_699fb8812e4afe9184218.png!small?1772075140598

8.4、案例四:

aHR0cHM6Ly9wYXNzcG9ydC41OC5jb20vbG9naW4=

1772075158_699fb896a26fd67574300.png!small?1772075161091

找到请求包,发现密码加密,进入响应的 js 代码中。

1772075179_699fb8ab7c5e632b1d410.png!small?1772075182229

发现为document的,我们需要去页面搜它的接口。

1772075197_699fb8bd779eaa558f2dc.png!small?1772075199797

<form target="iframeName" id="sdkSubmitForm" method="post" name="formName" action="//passport.58.com/58/login/pc/dologin" style="position: absolute; left: -1000px; top: -1000px;"><input name="username" type="hidden" value="13333333333"><input name="password" type="hidden" value="17d2df70fcda219079515963e885294cc3957c1a85f0e5786b492252aa132117cff07ab468e48bab3fd10934cb007f7b6326981d42fe9643a6b635dcc68401b6772510fda067c99e9c1539b87eaefdcef91159f8f0660fed32c53673b7f34982b1dda54dbdfbcc16d097093c4f2e50295235213218a66f05237a07f1c155f113"><input name="token" type="hidden" value="oSa9U0d1AwLoYvLe1sG--WIVoDuRpGt3"><input name="source" type="hidden" value="58-default-pc"><input name="path" type="hidden" value="http%3A%2F%2Fmy.58.com%2F%3Fpts%3D1714891786849"><input name="domain" type="hidden" value="58.com"><input name="finger2" type="hidden" value="zh-CN|24|1.25|12|1536_864|1536_816|-480|1|1|1|undefined|undefined|unknown|Win32|unknown|5|false|false|false|false|false|0_false_false|d41d8cd98f00b204e9800998ecf8427e|50031ef15f1a0a49d5e2817efb623905"><input name="isremember" type="hidden" value="false"><input name="autologin" type="hidden" value="false"><input name="isredirect" type="hidden" value="false"><input name="psid" type="hidden" value="c2c3e701-d93b-4a59-87c7-d8a3bacffb2a"><input name="fullScreenAbPage" type="hidden" value="2"><input name="psdk-d" type="hidden" value="jsdk"><input name="psdk-v" type="hidden" value="1.1.4"><input name="xxzlbbid" type="hidden" value="pfmbM3wxMDI5M3wxLjcuMHwxNzE0ODkyMjUxNzEwfGUvbUlRV3NVSjFxR05zd1Q2WEEyejR6NVdlTFl5cVFCZklxc2VSd3JiYTQ9fGU3NGE2MTQ3MTQ5NjI4NTkzNjEyZWY3MGY1M2I0ODg3XzE3MTQ4OTEzNTg0MDNfZDE0M2UyMjYyNGFlNGI0YjlmMDAxNDgwOGVkNTEwOGNfMTg2MzUyODIyMnxhMTkzYjFhMDBhNGU1OTQ1ZDk1YWZjNjg4ZjgzODU5Zl8xNzE0ODkxNzg2Njc0XzEzOA==_pfmx9Io0ieooL0dORzdQ9Ori51GB2DEm71AfFf0PlyaqVuJrXqouIgPqQGIc/js9Rrjg"><input name="xxzl_staticvalue" type="hidden" value="e74a6147149628593612ef70f53b4887_1714891358403_d143e22624ae4b4b9f0014808ed5108c_1863528222"><input name="xxzl_dynamicvalue" type="hidden" value="a193b1a00a4e5945d95afc688f83859f_1714891786674_138"><input name="xxzl_namespace" type="hidden" value="zhaq_pc"><input name="fingerprint" type="hidden" value="ajcgHPOorHsQdaQuTuzUIjo8W9InfGgZ"><input name="callback" type="hidden" value="SDK_CALLBACK_FUN_1714891786723.successFun"></form>

接下来,我们可以搜索它的target="iframeName"id="sdkSubmitForm"class等等。

1772075219_699fb8d326f7d388b9569.png!small?1772075221703

到响应的 js 中,我们搜素它的usernamepassword字段,如果他多的话,可以。

username:
username :
username=
username =
password:
password :
password=
password =

找到了加密函数。

1772075234_699fb8e2dae5e8b4f8407.png!small?1772075237518


文章来源: https://www.freebuf.com/articles/web/471720.html
如有侵权请联系:admin#unsafe.sh