爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB

这篇具有很好参考价值的文章主要介绍了爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、网站分析

  • 三年前的案例,我的原始文章
  • 网站 ,如图我们直接点击标题进入到详情页,链接会发生跳转,且与我们在详情看到的链接,与在列表页看到的链接完全不一样,如果拿列表页的链接直接新建标签页打开的话,详情页也是403,而只有触发点击的模式才能拿看到真实的详情链接
  • 假详情链接 http://ggzy.zwfwb.tj.gov.cn:80/jyxxcggg/1025448.jhtml
  • 真详情链接 http://ggzy.zwfwb.tj.gov.cn/jyxxcggg/Hw5fFNS%5EhnOR3wD5T5hxxA.jhtml
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

二、定位监听

  • 谷歌浏览器点中a标签
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
  • 火狐浏览器有自带的event事件监听爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

三、熟悉AES-ECB

  • 1、分析前,需要熟悉下aes加密是什么,熟悉的可能是md5加密,md5加密是哈希算法,不可逆不能从结果推出明文;而aes是对称加密算法,区别之一可加密可解密,即可反推明文
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
  • 2、 AES的ECB模式,只需要找到key密钥,就可以加密解密了 ,在线调试AES加密解密
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
  • 3、AES加密解密代码

四、调试分析

  • 以谷歌浏览器为例子
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

  • 开始添加断点,嗯~ 在定义变量这里打个断点试试,然后在点击列表链接,会发现js停在了断点处,然后咱们就一步一步的往下调试,会发现列表的url是如何加密的了,而其中最核心的加密算法,其实是用了CryptoJS的对称加密AES加密,并且使用的是ECB模式,Pkcs7填充,密钥在调试这部分的时候可以看到是何值
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

  • 抠出js:将整个js文件全部复制下来,在console面板可直接运行,以下是将关键js扣出来并在新建js脚本运行后的结果,大功告成,下面我用python来还原
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript文章来源地址https://www.toymoban.com/news/detail-611444.html

五、node运行js

  • 前端定义的CryptoJS我并没有直接复制,而是通过本地的node直接导入CryptoJS库,此时只需要将关键代码扣出来即可;
  • 本地需安装node环境,然后再安装crypto-js库: npm install crypto-js -g
  • 重要参数:key是密钥;指定模式默认ECB模式;padding是用来填充数据的,如果需要加密的数据的字节码的长度不是块大小的整数倍就需要填充
  • 方式1:扣js,缺啥补啥
    var CryptoJS = require('crypto-js');
    var req = function(hh) {
    var s = "qnbyzzwmdgghmcnm";
    var ee = "_blank";
    var aa = hh.split("/");
    var aaa = aa.length;
    var bbb = aa[aaa - 1].split('.');
    var ccc = bbb[0];
    var cccc = bbb[1];
    var r = /^\+?[1-9][0-9]*$/;
    if (r.test(ccc) && cccc.indexOf('jhtml') != -1) {
        var srcs = CryptoJS.enc.Utf8.parse(ccc);
        var k = CryptoJS.enc.Utf8.parse(s);
        var en = CryptoJS.AES.encrypt(srcs, k, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        var ddd = en.toString();
        ddd = ddd.replace(/\//g, "^");
        ddd = ddd.substring(0, ddd.length - 2);
        var bbbb = ddd + '.' + bbb[1];
        aa[aaa - 1] = bbbb;
        var uuu = '';
        for (i = 0; i < aaa; i++) {
            uuu += aa[i] + '/'
        }
        uuu = uuu.substring(0, uuu.length - 1);
        return uuu;
    }
    }
    console.log(req("http://ggzy.xzsp.tj.gov.cn:80/jyxxcggg/948547.jhtml"));
    
  • 方式2:js自带的模块CryptoJS,加理解的逻辑
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key,text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.AES.encrypt(l, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        })
        return a.toString()  // 此方式返回base64  
        // return a.ciphertext.toString() // 返回hex格式的密文  
    }
    
    // ECB模式加密base64
    console.log(encrypt_req('qnbyzzwmdgghmcnm', '1025528'));
    
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

六、Python执行js

  • python调用js三种方式:
    • 要么用python现有的模块替换js相同的逻辑,即python还原
    • 要么通过execjs/ py_mini_racer等执行
    • 要么通过node部署服务开接口执行
  • python的execjs库调用js
    """通过execjs执行js"""
    import execjs  # pip install execjs
    from loguru import logger
    list_url = 'http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml'
    with open('./aes.js', "r", encoding='utf-8') as f:
        ctx = execjs.compile(f.read())
    true_url = ctx.call('req', list_url)
    logger.info(f"详情的url:{list_url} >真实的url: {true_url}")
    
    #######分割线#######
    import execjs  # pip install execjs
    from loguru import logger
    list_url = 'http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml'
    ccc = list_url.split('/')[-1].rstrip('.jhtml')
    with open('./aes.js', "r", encoding='utf-8') as f:
        ctx = execjs.compile(f.read())
    suffix = ctx.call('encrypt_req', 'qnbyzzwmdgghmcnm', '1025528').replace('/', '^')[:-2]
    true_url = f"http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/{suffix}.jhtml"
    logger.info(f"详情的url:{list_url} >真实的url: {true_url}")
    
    
  • python自带的aes库还原逻辑:pip install pycryptodome
    from loguru import logger
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad
    import base64
    
    
    def aes_ecb_encrypt_text(decrypt_text: str, key: str) -> str:
        """
        加密AES_ECB明文
        :param decrypt_text: 待加密的字符串
        :param key: 密钥
        :return:  加密后的数据
        """
        aes2 = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        encrypt_text = aes2.encrypt(pad(decrypt_text.encode('utf-8'), AES.block_size, style='pkcs7'))
        encrypt_text = str(base64.encodebytes(encrypt_text), encoding='utf-8').replace("\n", "")
        return encrypt_text
    
    
    list_url = 'http://ggzy.zwfwb.tj.gov.cn:80/jyxxcgjg/1025528.jhtml'
    ccc = list_url.split('/')[-1].rstrip('.jhtml')
    decrypt_str = ccc
    key_str = "qnbyzzwmdgghmcnm"
    encrypt_str = aes_ecb_encrypt_text(decrypt_str, key_str).replace('/', '^')[:-2]
    true_url = list_url.replace(decrypt_str, encrypt_str)
    logger.info(f"详情的url:{list_url} >真实的url: {true_url}")
    
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

七、知识星球-时光漫漫

  • web端查看如下
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
  • app端查看如下
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript
    爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB,python爬虫逆向案例小白初级,爬虫,javascript

到了这里,关于爬虫小白-如何调试列表页链接与详情链接不一样并三种方式js逆向解决AES-ECB的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue列表跳转详情,记录列表滚动不变

    记录主元素 当引入keep-alive的时候,页面第一次进入,钩子的触发顺序created- mounted- activated,退出时触发deactivated。 当再次进入(前进或者后退)时,只触发activated。

    2024年02月07日
    浏览(52)
  • 黑马本地生活(列表页面,详情页面)

    🏡浩泽学编程 :个人主页  🔥 推荐专栏 :《深入浅出SpringBoot》《java项目分享》               《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 在学习微信小程序时,黑马给出了列表页面讲解,这里我再补充一个黑马没有讲诉的商家详情页面代码

    2024年01月21日
    浏览(43)
  • h5移动端页面调试工具Chii与 weinre 一样的远程调试工具

    与 weinre 一样的远程调试工具,主要是将 web inspector 替换为最新的 chrome devtools frontend. 电脑上跑一个chii服务,把对应的js嵌入h5页面内,用手机访问h5页面,chrome内看chii服务地址即可找到对应管理控制台     可以通过 npm 安装。   用下面的命令开启服务。   在你的页面中使

    2024年02月08日
    浏览(63)
  • 列表进入详情页传参问题(vue的问题)

    例如商品列表页面前往商品详情页面,需要传一个商品id; c页面的路径为 http://localhost:8080/#/detail?id=1 ,可以看到传了一个参数 id=1 ,并且就算刷新页面id也还会存在。此时在c页面可以通过id来获取对应的详情数据,获取id的方式是 this.$route.query.id vue传参方式有:query、params+动

    2024年01月21日
    浏览(36)
  • 【Django | 开发】面试招聘信息网站(美化admin站点&添加查看简历详情链接)

    🤵‍♂️ 个人主页: @计算机魔术师 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: 宝藏网站 |笔试题库|面试经验|实习招聘内推| 该文章收录专栏 ✨—【Django | 项目开发】从入门到上线 专栏—✨ 由于前文所开发的简历投递,并将简

    2023年04月20日
    浏览(51)
  • 列表进入详情页的传参问题(vue的问题)

    c页面的路径为 http://localhost:8080/#/detail?id=1 ,可以看到传了一个参数id=1,并且就算刷新页面id也还会存在。此时在c页面可以通过id来获取对应的详情数据,获取id的方式是 this.$route.query.id vue传参方式有:query、params+动态路由传参。 说下两者的区别: 1.query通过path切换路由,

    2024年01月19日
    浏览(35)
  • uniapp:返回上页刷新的方式,常用于详情返回列表

    在使用uniapp开发的过程中,我相信,我们都一定遇见过如下的场景: 进入了一个列表页,列表页进入详情页,在详情页进行了一些操作,比如,删除,修改,编辑,提交,成功之后返回到列表页,那么这个时候,如果我们的列表页不进行数据的刷新,就会给用户一种错觉,我

    2024年02月16日
    浏览(35)
  • 管理后台项目-05-SKU列表-上下架-详情抽屉效果-深度选择器

    目录 1-SKU列表 2-SKU上下架  3-SKU详情 当用户点击Sku管理,组件挂载的时候,我们需要获取sku列表信息;但是获取列表方法在分页列表改变页码和每页显示大小的时候也需要触发,我们封装为一个方法。 //sku列表的接口 /admin/product/list/{page}/{limit} export const reqSkuList = (page,limit)=

    2023年04月24日
    浏览(39)
  • 爬虫学习记录之Python 爬虫实战:爬取研招网招生信息详情

    【简介】本篇博客 为爱冲锋 ,爬取北京全部高校的全部招生信息,最后持久化存储为表格形式,可以用作筛选高校。 此处导入本次爬虫所需要的全部依赖包分别是以下内容,本篇博客将爬取研招网北京所有高校的招生信息,主要爬取内容为学校,考试方式,所在学院,专业

    2024年01月24日
    浏览(50)
  • 钉钉对接打通金蝶云星空获取流程实例列表详情(宜搭)接口与其他应收单接口

    钉钉(DingTalk)是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台,提供PC版,Web版和手机版,有考勤打卡、签到、审批、日志、公告、钉盘、钉邮等强大功能。 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式;通过标准的业务架构:

    2024年02月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包