python爬虫-请求参数和返回结果AES加密案例:某土地交易网

友情链接:

这是我在政万通平台上的知识岛屿账号,我会不定时在平台发布一些有深度的技术文章,欢迎大家一起来学习交流:https://www.zwtoon.com/islandSearch

声明:

该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关


学习目标:

通过本文章的学习可以完整的学习到逆向爬虫的一个流程思路,废话不多说,开干


一、找出需要加密的参数

1、js运行 atob(“aHR0cHM6Ly90ZC5obmdnenkuY29tLyMvbm90aWNl”) 拿到网址,F12打开调试工具,点击分页发送请求,找到affiche/newList 请求。

2、分析请求头、参数、响应结果会发现请求参数 zylbS,pageNum,pageSize 和响应结果 dat 均有加密

3、鼠标右击请求找到Copy>Copy as cUrl(cmd),打开网站:https://spidertools.cn/#/curl2Request,把拷贝好的curl转成python代码,新建 demo.py,把代码复制到该文件:
在这里插入图片描述
4、新建 a.js 文件,用于放扣下的代码

二、分析参数、zylbS,pageNum,pageSize

1、通过翻页查看参数可以发现 zylbS,pageSize都是固定值,只有 pageNum是变化的,那我们只需要先分析 pageNum ,直接使用搜索大法,全局搜索 pageNum ,根据搜索结果我们不难找出 pageNum 的加密位置,结果如下图所示。
在这里插入图片描述
2、然后在加密位置打上断点,点击翻页让断点断到我们的断点为止,在控制台输出,加密函数,容然后点击进入加密函数。
在这里插入图片描述
3、然后断点打在return处,点击跳过断点,复制结果到控制台和浏览器里边进行对比,发现这个正式加密参数,然后把这个加密函数全扣下来,放到a.js里边
在这里插入图片描述4、经分析得知,我们可导入crypto-js包引入CryptoJS 直接替换 s.CryptoJS,然后运行测试和浏览器里边的结果对比是一致的,那这样的话我们的pageNum就扣代码成功,如下图所示:
在这里插入图片描述

二、解密返回结果dat加密

1、我们的目的是为了学习,那这次找函数的加密入库就换另一种方式,这次采用hook的方式,hook也是常见的寻找加密入口的方式之一,根据经验可知,一般返回结果加密都会有parse的一个过程,那我们的hook就可以这样写,如下图所示:
在这里插入图片描述
2、其实根据上图,我们写好hook,然后运行hook,点击翻页,就直接hook到了我们要找的返回加密函数的入口了,对应的解密数据也直接返回在了我们的控制台。
3、然后我们跟进去加密函数,在函数里边打断点,跳转下一个断点就断到了我们的想要的结果处,在控制台打印 i 就得到了我们想要的明文信息,到此我们的解密函数也已经找到了。
在这里插入图片描述
4、我们把解密函数扣下来执行,和pageSize参数加密一样,导入crypto-js包引入CryptoJS 直接替换 s.CryptoJS,然后测试运行发现结果就是我们想要的明文信息了,如下图所示:
在这里插入图片描述

三、改写代码为python可执行程序,验证结果

1、在pycharm里边引入execjs包,导入js,然后改写程序,测试成功,如下图所示:
在这里插入图片描述

四、下边是项目的全部代码,有同学需要测试可亲自去测试

1.js代码

代码如下(示例):

const CryptoJS = require('crypto-js')

function kjq(t) {
    if (null != t && "" != t) {
        var e = CryptoJS.enc.Utf8.parse("1234567891234569")
          , a = CryptoJS.enc.Utf8.parse(t);
        return CryptoJS.AES.encrypt(a, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        }).toString()
    }
}

console.log(kjq(5))


function kjq2(e) {
    var a = CryptoJS.AES.decrypt(e.dat, CryptoJS.enc.Utf8.parse("1234567891234569"), {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    })
        , i = CryptoJS.enc.Utf8.stringify(a);
    tableData = JSON.parse(i)
    
    return tableData
}

datas = {
    "code": "01",
    "msg": "处理成功",
    "dat": "SyOeeFpkuR3sEASTCUYax+IuuRv2ghO0JvVUDrLwnAeU0NdWh5Onmih2J1A0R8XX6WQghvWtlh9KoEV08d4tz2DpD+cUR6008K06cj1KiGHsU3p8I6lOdm211fDSQh9PLxV9RgXT5HV63uaKu5EaPQ7twD3dScKLoItoXYJIwyJ4sFC/wvVP8jMoozYxXK4kc+2X5kI0IRPPbqssomt1LRUNFb5rT6iNeyjs2XxN2Y98wkg7EJ6y9P2nNBO33JwCfo3gggLkxzEY7xsY5Xkbu7er5vMvy56OgUNCcKJpjueah09jZeG/ROGA+16KbNfLrPBpoYz0WEt8ZQ3xs5WL5LFm+AhemkusQRlPBTcSM8EvASTwHs47DmUuUa7wFS1hICRCryvQAJq3pHk5e7u7Pu5AzHly5rgJTl4A2sGfFKg5YQ54mF3Lg8jEwT8pojNPZvVeeh7U52hvVLh6n6rpjDsnOuOzqj46n2bWX1sqoTKHv4BHwKGXVaQ81JvmcE3+R+tuvbRSYCwpKaFXuIpzyYLHEhqcMzkZ59irFoZmYA6qhRhooiKSXlp28s935zIkAQTPyGyrBiES1ILydc27nAs4ThMzRZybqBm0ChNt87J2ZSzkglGQrvIybRHAEy7UM2CwCNgylCbHcZHa4/HxrJhzvZhcTbxUTRn9tPNeaPsQR7vRkm9AsupNt4N1PIkNNgP+fY5fgzjUbo7+LLa2GLYR1gIVej9QOZMDozZJVsLwWuW1AeXzhtoRXXa6IcP8TTCVbyAfQ9ek6NRC/Mo4SnhFDo4ugQtaGcWfTqemlPzWQ9LEXPRhR4jZZqXOvwf1nV7O5CXAq1FHvTdXbv6T0ELFH1GszzmLZ7rM5zwVJbB1JM13UKecfrxj42TEnAyOOWPen3p4NL05W81/9UPEwsy/s0GIw+tBBv8bx9Wsgb4CwzwmFFfSJ7OG2OaPhd4Fil3gVUDNi3f0/kaS84+kROsxP+q/+9HULajGtSVrgaBF5/hODptt/xHfF7eGlhNu1AG4zRPwPAGU/v8/L8zbbtAO+UqFFiaawAUHI2CA9UrCU87u+Bgfg1uA/gNCgjCCa6dHPThlN11nXqGrDJDx8g==",
    "count": 8027
}
console.log(kjq2(datas))

2.python代码

代码如下(示例):

# -- coding: utf-8 --

import requests,execjs

headers = {
    "DataEncrypt": "dataEncrypt",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
}
url = "https://td.hnggzy.com/affiche/newList"
params = {
    "zylbS": "BxW0COuaiuD38mZdOQ3w3A==",
    "pageNum": "hKLfR+V5tlcuYS4Qf4UwSQ==",
    "pageSize": "+MOHdv4WgNlVz8m2VlJZrA=="
}

page_num = 1
with open('./a.js','r',encoding='utf-8') as js_file:
    js = execjs.compile(js_file.read(),cwd=r'C:\Users\w33d6\AppData\Roaming\npm\node_modules')
    page_jm = js.call('kjq',page_num)
    params['pageNum'] = page_jm
    response = requests.get(url, headers=headers, params=params)
    if response.json().get('msg') == '处理成功':
        data_json = js.call('kjq2',response.json())
        print(data_json)

总结

以上就是这个网站的全部内容了,这个案例比较简单,大家有不懂的欢迎留言讨论。

  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值