精华内容
下载资源
问答
  • JS逆向
    2021-08-30 20:53:06

    一、无限Debugger

    1.1 Questions

    1. 什么情况下会出现无限Debugger?
      分析请求、查看时间监听器、跟踪js时候,第一步就是打开浏览器的开发者工具,而打开这个工具的时候就出出现无限Debugger的死循环。
    2. 为什么反爬虫会用到无限Debugger?
      因为在反爬虫的过程中,我们会用到开发者工具,这个时候精准设防,不让我们获取代码逻辑,从而设计无限Debugger。

    1.2 无限Debugger的解决方案

    1. 方案一:禁用所有的断点
      将所有的断点都禁用之后,所有断点处都不执行,即可不在断点处循环,但这种方法不切实际,因为我们的目的就是要分析代码,不使用断点分析则不可能;
    2. 方案二:禁用某处的断点
      有可能会使我们在死循环中无法出来。
    3. 方案三:条件断点
      在可能断点处加上条件,不满足条件就不执行。
    4. 方案四:利用中间人替换原理
      将debugger关键字,使用字符串替换,替换后就没有这个关键字存在。
    5. 方案五:reres浏览器插件替换本地修改过的文件
    6. 方案六:重写关键函数
      将函数声明之后,执行之前的位置打上断点,然后在控制台中重新debugger函数,将这个函数内容置空,则后续遇到这个函数就不会停下来了。

    二、如何快速定位加密参数

    1. 快速定位——搜索
    2. 快速定位——断点
      XHR断点
      DOM断点
      Event断点
      自定义断点
    3. 快速定位——hook
      json
      cookie
      window attr
      eval/Function
      websocket

    三、JavaScript加密或混淆

    3.1 为什么要对JS代码加密或混淆

    • 因为JS代码是运行于客户端的
    • 因为JS代码是公开透明的

    3.2 如何对JavaScript进行保护

    • 代码压缩:去空格、换行
    • 代码加密:eval、emsscripten、webAssembly
    • 代码混淆:变量混淆、常量混淆、控制流扁平化、调试保护

    3.3 代码加密

    1. eval()加密:将一段JS代码进行eval函数包装后,得到一场串的JS代码,实际已经被加密过了,变得可读性很差,不过解密也很简单;
    2. EmScripten:将C/C++代码编译成JS代码,结果其实是asm.js文件,起到保护核心的效果;
    3. WebAssembly:核心是C/C++,经过加密后是wasm文件

    3.4 JavaScript混淆技术

    • 变量、字符常混淆:将变量名混淆成十六进制或者一大串字符的样式,使代码可读性变差,使用md5、base64等加密功能混淆字符串,使得无法通过搜索功能查到代码的关键字;
    • 属性加密:JS中属性的关系一般是键值对,用属性加密将key和value的关系混淆掉,使得难以寻找里面的逻辑;
    • 控制流平台化:打乱了原有逻辑的关系,将逻辑变复杂难读;
    • 僵尸代码注入:将无用的代码注入到原有代码里,使代码变得复杂;
    • 反调试:基于浏览器的特性,对代码加上debug语句,让代码变成无限debugger,用一些断点进行干扰;
    • 多态变异:JS代码一旦被调用,代码立刻发生变化,变成和之前完全不同的代码,避免代码被动态分析调试;
    • 锁定域名:JS代码必须运作在特定的域名下;
    • 反格式化:如果格式化之后,代码会用一些机制使得程序无法顺利运行
    • 特殊编码:将JS代码编译成符号、表情等等
    更多相关内容
  • 鬼鬼js调试工具7.5,js逆向必备工具。本工具中包含dll文件和ec文件,解压即可直接运行。是一款不可多得的好东西。
  • 猿人学js逆向第二题完整补环境js文件
  • X-Shard倒是没什么问题,一看就是兴趣点的经纬度,但x-uab看过之后就让人心里苦了,js加密啊,只能去逆向解密了。 2 js逆向求解 最直接的思路是根据“x-uab”关键字在所有关键中查找(chrome浏览器-so
  • JSreverse:js逆向和爬虫

    2021-05-06 16:15:44
    JSreverse记录一些js逆向和爬虫以及其他,侵删已包含以下内容:CrawlerLab爬虫攻防靶场今日头条大众点评抖音毛毛租房漫画柜烯牛数据空中网西瓜视频优酷掌上高考猿人学爬虫攻防验证码麻瓜OCR网易易盾极验(滑块,未...
  • js逆向调试工具,集成常用js加密函数,前端js几种加密集合
  • 主要介绍了Js逆向实现滑动验证码图片还原的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 这个网站应该是专门练习的,因为有个地方说不太通,在此只能算是练习,记录下,方便以后进行查阅。 首先访问主页: 他会设置一个cookie值,并且会把加密的salt ...password=H1uFJjwe8ZoS04VFZBOCBfma9qdoxrSd%2...

    这个网站应该是专门练习的,因为有个地方说不太通,在此只能算是练习,记录下,方便以后进行查阅。

    首先访问主页:

    他会设置一个cookie值,并且会把加密的salt

    带出来。还有个叫lt的东西也会用html的形式传出来。

    这个lt,会在发送请求的时候带出去。

    输入用户名密码后,点击登录,发送的是这样的body:

    username=admin888&password=H1uFJjwe8ZoS04VFZBOCBfma9qdoxrSd%2FND4gBK3%2F8YlVJaQ4ZJFSIO5PLjgZdYTkrgjILDmfXADSDtWJQpZCp%2FOUSX3nOo5zz6fuVHd%2FuU%3D&captchaResponse=hppx&lt=LT-3032376-qI7M4Pc15tRwukqt4nKojGlPuUL5gx1646621586496-mdSp-cas&dllt=userNamePasswordLogin&execution=e1s1&_eventId=submit&rmShown=1

    这里重新刷新了下页面,上面的salt和lt会改变,下面来分析下这个password。关键代码已经定位到此处,下个断点:

     

    function _gas(data, key0, iv0) {
        key0 = key0.replace(/(^\s+)|(\s+$)/g, "");
        var key = CryptoJS.enc.Utf8.parse(key0);
        var iv = CryptoJS.enc.Utf8.parse(iv0);
        var encrypted = CryptoJS.AES.encrypt(data, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.toString();
    }
    function encryptAES(data, _p1) {
        if (!_p1) {
            return data;
        }
        var encrypted = _gas(_rds(64) + data, _p1, _rds(16));
        return encrypted;
    }
    function _ep(p0, p1) {
        try {
            return encryptAES(p0, p1);
        } catch (e) {}
        return p0;
    }
    var $_chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    var _chars_len = $_chars.length;
    function _rds(len) {
        var retStr = '';
        for (i = 0; i < len; i++) {
            retStr += $_chars.charAt(Math.floor(Math.random() * _chars_len));
        }
        return retStr;
    }
    

    从中可以知道密码加密是这样的

    加密字符串:64位随机数+密码;

    密钥:登录首页时服务器给的16位字符串。

    偏移量:16位随机的字符串。

    加密方式:CBC;

    填充:pkcs7

    比如这样的:

     他的data是:fa7B3ixA4EP7YBQfjPtbn6PX8THKAYSWD6ncB8RhrNxy5aAcdQWc63PnkGbf8w5padmin888

    key0是:Jaj2b6QTiljjdd6J

    iv0是:XMZb5i5FEfP4YjSA

    用在线AES加密试下:

     GPUjEIFA0wavbfPL9xVlVPE0C/Id2lZfZtiuNfc0Dk4+nA2UD9syrng7xn3PhFrhVRiTI4sMrqfrd+x7Um6REyHwxvyJI38ZoykQAC+SelQ=

    看下程序他跑出来是多少

     发现是一样的。看看发的包是不是一样的:

    username=admin888&password=GPUjEIFA0wavbfPL9xVlVPE0C%2FId2lZfZtiuNfc0Dk4%2BnA2UD9syrng7xn3PhFrhVRiTI4sMrqfrd%2Bx7Um6REyHwxvyJI38ZoykQAC%2BSelQ%3D&captchaResponse=apcf&lt=LT-3032840-P9cGjCTq3ciu0bTqOitzoL2nzmTLRv1646622551540-mdSp-cas&dllt=userNamePasswordLogin&execution=e1s3&_eventId=submit&rmShown=1

    从中可以看到是一样的,只是转成了URI。

    注:这里服务器在解码时,必须要偏移量,而从这提交的包中,没有看到对偏移量相关的加密等。在此感觉,这个站点仅仅是个测试站点。但对我也很有启发,后面一篇博文,用这种方式,实现密钥和偏移量的交换。

    展开全文
  • 狂徒推出的易语言+js逆向课程[视频课程].txt打包整理.zip
  • JS逆向练习题100题

    2021-10-25 08:18:03
    练完这100题,随便找个月入1W工作不闹着玩?
  • 知识点:1.js包为 recast 2.Recast除了parse/print/builder以外, 还有三项主要功能: run: 通过命令行读取js文件,并转化成ast以供处理。 tnt(recast.types.namedTypes): 通过assert()和check(),可以验证ast...
  • 但由于开发者工具功能十分复杂,本节主要介绍对 JavaScript 逆向有一些帮助的功能,学会了这些,我们在做 JavaScript 逆向调试的过程会更加得心应手。 本节我们以一个示例网站 https://spa2.scrape.center/ 来做演示...

    这是「进击的Coder」的第 592 篇技术分享

    作者:崔庆才

    注:本文来自《Python3网络爬虫开发实战(第二版)》一书。

    现在越来越多的网站也已经应用了这些技术对其数据接口进行了保护,在做爬虫时如果我们遇到了这种情况,我们可能就不得不硬着头皮来去想方设法找出其中隐含的关键逻辑了,这个过程我们可以称之为 JavaScript 逆向。

    既然我们要做 JavaScript 逆向,那少不了要用到浏览器的开发者工具,因为网页是在浏览器中加载的,所以多数的调试过程也是在浏览器中完成的。

    工欲善其事,必先利其器。本节我们先来基于 Chrome 浏览器介绍一下浏览器开发者工具的使用。但由于开发者工具功能十分复杂,本节主要介绍对 JavaScript 逆向有一些帮助的功能,学会了这些,我们在做 JavaScript 逆向调试的过程会更加得心应手。

    本节我们以一个示例网站 https://spa2.scrape.center/ 来做演示,用这个示例来介绍浏览器开发者工具各个面版的用法。

    1. 面板介绍

    首先我们用 Chrome 浏览器打开示例网站,页面如图所示:

    414de1868977dfef59eccdb57faf2dd4.png
    示例网站页面

    接下来打开开发者工具,我们会看到类似图 xx 所示的结果。

    f91f2dc05115b341d2639d09501bec13.png
    打开开发者工具

    这里可以看到多个面板标签,如 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. 查看节点事件

    之前我们是用 Elements 面板来审查页面的节点信息的,我们可以查看当前页面的 HTML 源代码及其在网页中对应的位置,查看某个条目的标题对应的页面源代码,如图所示。

    db1c41aebcd7397e4d59ce06048adeec.png
    查看源代码

    点击右侧的 Styles 选项卡,可以看到对应节点的 CSS 样式,我们可以自行在这里增删样式,实时预览效果,这对网页开发十分有帮助。

    在 Computed 选项卡中还可以看到当前节点的盒子模型,比如外边距、内边距等,还可以看到当前节点最终计算出的 CSS 的样式,如图所示。

    b987366ceaffbf7bd6d7a65f3d6324fd.png
    盒子模型

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

    • change:HTML 元素改变时会触发的事件。

    • click:用户点击 HTML 元素时会触发的事件。

    • mouseover:用户在一个 HTML 元素上移动鼠标会触发的事件。

    • mouseout:用户从一个 HTML 元素上移开鼠标会触发的事件。

    • keydown:用户按下键盘按键会触发的事件。

    • load:浏览器完成页面加载时会触发的事件。

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

    b9638b1bb40f4541b4b1cbd5707c9c04.png
    选中切换到第 2 页的节点

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

    bb7c423c0723f01d81e2a1dadb622a18.png
    跳转到对应的代码位置

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

    3. 代码美化

    刚才我们已经通过 Event Listeners 找到了对应的事件处理方法所在的位置并成功跳转到了代码所在的位置。

    但是,这部分代码似乎被压缩过了,可读性很差,根本没法阅读,这时候应该怎么办呢?

    不用担心,Sources 面板提供了一个便捷好用的代码美化功能。我们点击代码面板左下角的格式化按钮,代码就会变成如图所示的样子。

    88f29383d4de07e9f5be8aa58cbc51a4.png
    代码格式化按钮
    e6ba4f3e5a09ee95700aa210fdae5ebb.png
    格式化后的代码

    此时会新出现一个叫作 chunk-vendors.77daf991.js:formatted 的选项卡,文件名后面加了 formatted 标识,代表这是被格式化的结果。我们会发现,原来代码在第 7 行,现在自动对应到了第 4445 行,而且对应的代码位置会高亮显示,代码可读性大大增强!

    这个功能在调试过程中非常常用,用好这个功能会给我们的 JavaScript 调试过程带来极大的便利。

    4. 断点调试

    接下来介绍一个非常重要的功能——断点调试。在调试代码的时候,我们可以在需要的位置上打断点,当对应事件触发时,浏览器就会自动停在断点的位置等待调试,此时我们可以选择单步调试,在面板中观察调用栈、变量值,以更好地追踪对应位置的执行逻辑。

    那么断点怎么打呢?我们接着以上面的例子来说。首先单击如图所示的代码行号。

    321d6e3968aefc8d4b664dac925e5b6f.png
    单击代码行号

    这时候行号处就出现了一个蓝色的箭头,这就证明断点已经添加好了,同时在右侧的 Breakpoints 选项卡下会出现我们添加的断点的列表。

    由于我们知道这个断点是用来处理翻页按钮的点击事件的,所以可以在网页里面点击按钮试一下,比如点击第 2 页的按钮,这时候就会发现断点被触发了,如图所示。

    7f3cfb407e654375e8c8c5a2beb33e88.png
    断点被触发

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

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

    b23c7b308ead6bfd33a41400badd6609.png
    查看 Local 域

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

    6298d185be2be63e3019025db5731889.png
    查看 Closure(Jr) 域

    我们可以看到,FunctionLocation 又指向了方法 o ,点击之后便又可以跳到指定位置,用同样的方式进行断点调试即可。

    在 Scope 面板还有多个域,这里就不再展开介绍了。总之,通过 Scope 面板,我们可以看到当前执行环境下的变量的值和方法的定义,知道当前代码究竟执行了怎样的逻辑。

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

    25eb94577f007297c535a7dd33c59937.png
    Watch 面板

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

    我们还可以切换到 Console 面板,输入任意的 JavaScript 代码,便会执行、输出对应的结果,如图所示。

    80c3ff9fb902dce4cc9a6d5d4a14d22f.png
    Console 面板

    如果我们想看看变量 arguments 的第一个元素是什么,那么可以直接敲入 arguments[0],便会输出对应的结果 MouseEvent,只要在当前上下文能访问到的变量都可以直接引用并输出。

    此时我们还可以选择单步调试,这里有 3 个重要的按钮,如图所示。

    31973ceff0155ff9fc7796f5ff41b8b0.png
    单步调试按钮

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

    • Step Over Next Function Call:逐语句执行

    • Step Into Next Function Call:进入方法内部执行

    • Step Out of Current Function:跳出当前方法

    用得较多的是第一个,相当于逐行调试,比如点击 Step Over Next Function Call 这个按钮,就运行到了 4447 行,高亮的位置就变成了这一行,如图所示。

    0fceab8669ed03bae393855589d5ad26.png
    点击 Step Over Next Function Call 按钮

    5. 观察调用栈

    在调试的过程中,我们可能会跳到一个新的位置,比如点击上述 Step Over Next Function Call 几下,可能会跳到一个叫作 ct 的方法中,这时候我们也不知道发生了什么,如图所示。

    6f6b08bb48d29b2def0226c4efd2c310.png
    跳到 ct 方法中

    那究竟是怎么跳过来的呢?我们可以观察一下右侧的 Call Stack 面板,就可以看到全部的调用过程了。比如它的上一步是 ot 方法,再上一步是 pt 方法,点击对应的位置也可以跳转到对应的代码位置,如图所示。

    62dd2a9208298cee7f5c37d86dc19ad0.png
    Call Stack 面板

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

    6. 恢复 JavaScript 执行

    在调试过程中,如果想快速跳到下一个断点或者让 JavaScript 代码运行下去,可以点击 Resume script execution 按钮,如图所示。

    ba0e312c350483d44eeab02ace4b3ec3.png
    Resume script execution 按钮

    这时浏览器会直接执行到下一个断点的位置,从而避免陷入无穷无尽的调试中。

    当然,如果没有其他断点了,浏览器就会恢复正常状态。比如这里我们就没有再设置其他断点了,浏览器直接运行并加载了下一页的数据,同时页面恢复正常,如图所示。

    b8018fca65ae43e2c601a6db72c46d0b.png
    浏览器恢复正常状态

    7. Ajax 断点

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

    接下来我们再介绍一个方法—— Ajax 断点,它可以在发生 Ajax 请求的时候触发断点。对于这个例子,我们的目标其实就是找到 Ajax 请求的那一部分逻辑,找出加密参数是怎么构造的。可以想到,通过 Ajax 断点,使页面在获取数据的时候停下来,我们就可以顺着找到构造 Ajax 请求的逻辑了。

    怎么设置呢?

    我们把之前的断点全部取消,切换到 Sources 面板下,然后展开 XHR/fetch Breakpoints,这里就可以设置 Ajax 断点,如图所示。

    af63518beb35eb2ef348aea866431c62.png
    展开 XHR/fetch Breakpoints

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

    4fdce6e6beb8bde717d6ab8be56b6fcb.png
    请求的 URL

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

    ee832b597d90b4bb48b2bba3fa36330b.png

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

    f6a5626ba7e6846d0f06c930144c24ab.png
    断点调试模式

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

    54f5569a47b20d8d4c58bd04d0371d01.png
    找到 onFetchData 方法

    接下来切换到 onFetchData 方法并将代码格式化,可以看到如图所示的调用方法。

    8096abb1bb9a09e4076ff9b6cc09ada9.png
    调用方法

    可以发现,可能使用了 axios 库发起了一个 Ajax 请求,还有 limitoffsettoken 这 3 个参数,基本就能确定了,顺利找到了突破口!我们就不在此展开分析了,后文会有完整的分析实战。

    因此在某些情况下,我们可以在比较容易地通过 Ajax 断点找到分析的突破口,这是一个常见的寻找 JavaScript 逆向突破口的方法。

    要取消断点也很简单,只需要在 XHR/fetch Breakpoints 面板取消勾选即可,如图所示。

    c5c3add8199d4f904fd82e7bf8105df8.png
    取消断点

    8. 改写 JavaScript 文件

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

    • 发现 JavaScript 文件中包含很多阻挠调试的代码或者无效代码、干扰代码,想要将其删除。

    • 调试到某处,想要加一行 console.log 输出一些内容,以便观察某个变量或方法在页面加载过程中的调用情况。在某些情况下,这种方法比打断点调试更方便。

    • 调试过程遇到某个局部变量或方法,想要把它赋值给 window 对象以便全局可以访问或调用。

    • 在调试的时候,得到的某个变量中可能包含一些关键的结果,想要加一些逻辑将这些结果转发到对应的目标服务器。

    这时候我们可以试着在 Sources 面板中对 JavaScript 进行更改,但这种更改并不能长久生效,一旦刷新页面,更改就全都没有了。比如我们在 JavaScript 文件中写入一行 JavaScript 代码,然后保存,如图所示。

    86617b8776d94206915ccbcaf4f2ad70.png
    在 JavaScript 文件中写入一行 JavaScript 代码

    这时候可以发现 JavaScript 文件上出现了一个感叹号标志,提示我们做的更改是不会保存的。这时候重新刷新页面,再看一下更改的这个文件,如图所示。

    bace90839f672f3239ae321a68ebe016.png
    刷新页面后的 JavaScript 文件

    有什么方法可以修改呢?其实有一些浏览器插件可以实现,比如 ReRes。在插件中,我们可以添加自定义的 JavaScript 文件,并配置 URL 映射规则,这样浏览器在加载某个在线 JavaScript 文件的时候就可以将内容替换成自定义的 JavaScript 文件了。另外,还有一些代理服务器也可以实现,比如 Charles、Fiddler,借助它们可以在加载 JavaScript 文件时修改对应 URL 的响应内容,以实现对 JavaScript 文件的修改。

    其实浏览器的开发者工具已经原生支持这个功能了,即浏览器的 Overrides 功能,它在 Sources 面板左侧,如图所示。

    febfd95f77c05662630ea742a9f73ac6.png
    Overrides 功能

    我们可以在 Overrides 面板上选定一个本地的文件夹,用于保存需要更改的 JavaScript 文件,我们来实际操作一下。

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

    002d48c748b36fa49feaa17c7de484c2.png

    我们打算在 Ajax 请求成功获得 Response 的时候,在控制台输出 Response 的结果,也就是通过 console.log 输出变量 a

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

    2158dcd7ecb1d4ed7cfa91ffe87b9cfd.png
    弹出提示

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

    69acead5922eb6c2b228913f7dc61911.png
    Overrides 面板下出现 ChromeOverrides 文件夹

    我们可以看到,现在所在的 JavaScript 选项卡是 chunk-19c920f8.012555a2.js:formatted,代码已经被格式化了。因为格式化后的代码是无法直接在浏览器中修改的,所以为了方便,我们可以将格式化后的文件复制到文本编辑器中,然后添加一行代码,修改如下:

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

    接着把修改后的内容替换到原来的 JavaScript 文件中。这里要注意,切换到 chunk-19c920f8.012555a2.js 文件才能修改,直接替换 JavaScript 文件的所有内容即可,如图所示。

    1cf68c421ba983dec423bb484f53df54.png
    替换 JavaScript 文件的所有内容

    替换完毕之后保存,这时候再切换回 Overrides 面板,就可以发现成功生成了新的 JavaScript 文件,它用于替换原有的 JavaScript 文件,如图所示。

    13f4d23861c2dc7d42707d38362d8d19.png
    生成了新的 JavaScript 文件

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

    5a65d68def331a7166b7d113a260c3e3.png
    Reponse 结果

    正如我们所料,我们成功将变量 a 输出,其中的 data 字段就是 Ajax 的 Response 结果,证明改写 JavaScript 成功!而且刷新页面也不会丢失了。

    我们还可以增加一些 JavaScript 逻辑,比如直接将变量 a 的结果通过 API 发送到远程服务器,并通过服务器将数据保存下来,也就完成了直接拦截 Ajax 请求并保存数据的过程了。

    修改 JavaScript 文件有很多用途,此方案可以为我们进行 JavaScript 的逆向带来极大的便利。

    9. 总结

    本节总结了一些浏览器开发者工具中对 JavaScript 逆向非常有帮助的功能,熟练掌握了这些功能会对后续 JavaScript 逆向分析打下坚实的基础,请大家好好研究。

    86f169d9f78d76c162f10ea0517ff22a.png

    End

    本节内容来自于崔庆才的新书《Python3网络爬虫开发实战(第二版)》,书中详细介绍了零基础用 Python 开发爬虫的各方面知识,同时相比第一版新增了 JavaScript 逆向、Android 逆向、异步爬虫、深度学习、Kubernetes 相关内容,‍同时本书已经获得 Python 之父 Guido 的推荐,目前本书正在七折促销中!

    内容介绍:《Python3网络爬虫开发实战(第二版)》内容介绍

    95398895bbe31276591c133f9dbcbcb4.png

    扫码购买

    7e7f45a54fb837182a4f567e0d8178cc.png

    好文和朋友一起看~

    展开全文
  • reres映射本地js文件 可以拦截js请求并替换本地的js
  • 前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结。

    前段时间尝试对某音的 PC 端进行了逆向,目前已经全部逆向出来了,在这里总结下一些调试技巧和总结。

    本文不会涉及任何的详细代码,仅仅是作为技术来讨论。

    一、加密分析

    在这里以账户下的视频列表为例,可以看到,在 dy 中,加密的 JS 是 webmssdk.js,其中最主要的加密参数有以下两个
    视频列表请求参数

    在 Postman 中进行测试,发现这两个参数缺一不可,所以逆向过程就是对这两个参数进行分析。

    _signature 是由两部分组成,一部分是由 X-Bogus 生成,记为 a。一部分则是根据后端的一个接口动态下发数据,进行加密拼接在 a 后面,然后再根据(a + b) 一起生成一个 c,再截取拼接在(a + b)之后。

    所以 _signature = a + b + 截取后的 c

    整体上逆向难度比较大,如果感兴趣的可以尝试去分析下,本文就不详细说了。

    二、调试技巧

    1、日志分析

    在 chrome 中,如果有一段代码比较难以分析,可以通过插桩分析,具体就是打「日志」
    在这里插入图片描述

    一般情况下,通过日志的分析,可以看到代码的运行情况,然后再根据代码的运行日志,找出可疑点,进行「条件断点」,一步一步调试基本上就可以找出其中的算法。

    其中可以通过 v_jstoools 进行「仅变量压缩」,然后得到一份比较容易看的源代码。

    2、常见算法

    2.1)MD5

    其中如果遇到一些 32 位长度的字符串,那么很可能是 MD5 加密算法得到的,因此对这一类的数据必须要重视起来,其中可以多尝试,还有一种可能会「加盐」处理,所以遇到 32 或者 16 位字符串,可以多次验证。

    2.2)Base64

    如果一个数据是由 Base64 编码得到的,那么在代码中一定会出现的一个字符串是 “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”,如果出现了这个字符串,就很可能是 Base64 编码处理了

    2.3)进制处理

    常见的进制处理是 16 转 10 进制,或者是 10 转 16 进制,对这一部分数据一定要敏感。如果发现有一些可疑的数据转换,可以尝试看看是不是做了进制处理

    三、Chrome 调试技巧

    善用堆栈分析,有很多的逻辑处理,都是可以通过堆栈进行逆推出来的,如果遇到不知道的逻辑,尝试看下堆栈会有一定的帮助。

    XHR 的提取断点也可以多尝试下,可以直接定位到参数生成的地方,非常的方便
    在这里插入图片描述

    展开全文
  • python爬虫之JS逆向

    2022-06-11 12:51:02
    Python爬虫之JS逆向案例由于在爬取数据时,遇到请求头限制属性为动态生成,现将解决方式整理如下:JS逆向有两种思路:本文介绍的是第二种使用Python重写JS的方法第一步:在浏览器中使用开发者工具找到相应的接口...
  • js逆向之加密算法介绍

    千次阅读 2021-12-05 18:11:52
    目录 前言 一、js常见的加密方式 Md5加密 对称加密DES/AES 非对称加密RSA ...何为逆向:与逆向相对的是正向,正向即采用某种加密方式对数据进行加密,或...接下来就对如何进行js逆向,找出其加密算法做一个分析。 一
  • CrackJs记录一下js逆向的网站先写到这里吧~~~~ 下次再会(2020.08.25)如果多人关注的话,会继续更新,且更新更频繁,你给的星星star就是我的动力,越多,更新越快!综合类: ☆ ☆ ☆ ☆☆ ☆☆ ☆☆ ☆☆ ☆☆☆爬虫...
  • JS逆向精品课程

    2022-06-11 15:27:38
    JS逆向课程
  • JsSpider:js逆向

    2021-05-31 09:04:53
    Python3 SpiderAuthor:smiling_face_with_sunglasses:11:smiling_face_with_sunglasses:Email:heart_suit::heart_suit:QQ:heart_suit:1399569097:heart_suit:一、案例:dolphin:最后本项目不定期更新, 如果本项目帮助...
  • 作为逆向的开始,这个自然是无法避免的,毕竟js逆向的环境是浏览器,而浏览器自然为开发做了很多工具,方便再开发的时候检测开发过程中是否有问题,就像开发过程中debug。而本篇就是简单聊一下浏览器的这些功能,...
  • 在学习js逆向思路之前,我们先来了解参数的几种常见的加密方式 加密: 就是通过某种算法将原本的数据内容加密为特殊位数的参数 加密方式: (1)Md5加密: 通过md5加密会生成一个16位或者32位的加密参数. 特征位数: ...
  • JavaScript 逆向爬取实战

    千次阅读 多人点赞 2020-05-01 23:37:34
    “ 阅读本文大概需要 25分钟。 ”在上一节总结一些网站加密和混淆技术中,我们介绍了网页防护技术,包括接口加密和 JavaScript 压缩、加密和混淆。这就引出了一个问题,如果我们碰...
  • 手把手操作JS逆向爬虫入门(一)

    千次阅读 2022-01-05 21:54:43
    本文爬取的网站如下(可以找解密工具解码) aHR0cHM6Ly9uZXdyYW5...然后用python代码编写函数生成该加密参数,或者抠出JS代码,然后再python中调用生成加密参数,然后出入post请求,实现爬虫。 逆向过程: 1、搜索.
  • js逆向_知识小结

    千次阅读 多人点赞 2021-06-16 23:05:43
    目录1、开发者工具小技巧2、Fiddler使用小技巧3、python代码小技巧4、js代码知识点
  • js的作用域分两种,全局和局部,基于我们所熟悉的作用域的知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,...
  • JS逆向之新榜登录

    2021-01-20 01:56:36
    文章目录1. 模拟登录2. 解决 `password` 参数3. 解决`nonce`参数4. 解决`xyz`参数5. login 源码 1. 模拟登录 原创文章 401获赞 72访问量 3万+ 关注 私信 展开阅读全文 ...作者:保护我方豆豆
  • Js逆向の参数定位方法

    千次阅读 2021-01-20 18:36:48
    介绍下几个调试方式,主要感觉后面的js扩展脚本挺好用 ctrl+F 全局搜索、页面搜索、行内搜索什么的不多说了 堆栈调试 这是我很喜欢的调试方式,新版本的谷歌才有,如果没有记得更新浏览器。 console.log 可以方便...
  • 浅谈_(js逆向)基础必备知识

    千次阅读 2021-01-10 02:08:10
    加粗样式随着技术的发展,js逆向成为爬虫必不可少的必备技术。我这里只是浅谈一下,根据自己的经验来说的。大蛇勿喷。 js逆向,你首先得懂函数吧 例子: . function per(x,y){ return x+y;} 比如这个函数 ...
  • 加载html---- 加载js ----运行js初始化 ---- 用户触发某个事件---- 调用某段js ---- 加密函数 --- -- 给服务器发信息(XHR-SEND) ---- 接收到服务器数据 ---- 解密函数 ---- 刷新网页渲染 ''' DOM 定位比较准确...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,988
精华内容 11,195
关键字:

JS逆向