友情链接:
这是我在政万通平台上的知识岛屿账号,我会不定时在平台发布一些有深度的技术文章,欢迎大家一起来学习交流: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)
总结
以上就是这个网站的全部内容了,这个案例比较简单,大家有不懂的欢迎留言讨论。