【JS逆向】【多图+附源码】 2023 python获取某蜂窝 _sn

2023-06-14,,

声明:本文/代码/软件/网站等内容仅供学习交流使用,不涉及任何商业目的或利益。如有侵犯版权或其他问题,请联系作者删除。作者对本文/代码/软件/网站等内容的正确性、完整性、可靠性、安全性等不作任何保证,使用者需自行承担风险和责任。

又相亲失败了,写个文章吧。今天介绍的是一个关于蜜蜂窝学习一下评论获取。其中在请求数据时有一个_sn参数需要处理一下。简单说一下思路。

第一步 抓包

这里随便先进一个酒店的介绍页
想要找到包含评论数的数据包,首先在请求中搜索一下,不过根据结果来看是没有找到的,接下来就在数据包中一个一个查看

尴尬的是找了一遍也没看到,试着切换下一页在请求一下

这里可以看到在点击下一页的时候马上跳出来了一个请求,那这个大概率就是数据包了。

在请求数据时携带了一些参数,下边比较关键的几个标注出来了,其中_sn就是这次的主角

在请求相应回来的数据可以看到有一个html属性,里面是一个包含了样式和内容的html标签

参数和请求url先拿到

第二步 找到加密位置

从调用栈跟值应该都有点了解,我这里就直接上图了

直接从发起程序这里找调用栈,不过数据加密一般都在中间的几个请求

例如我这里从第一个e.send进去,直接打断点从调用栈往回一个一个找。
这里再ajax这个调用栈中发现了一个位置,url参数在上一行还是/hotel/info/comment_list,在下一行就拼接上了_ts_sn,所以大概率是在这里面完成的加密操作

进去函数中经过一番调试,发现在函数中有这么一行代码

第一次调用的时候没有做任何操作,在通过return第二次进入的时候
就会跳转到这么一个乱七八糟的js文件中

第三步 加密逻辑

通过运行了几次发现了一些其中的逻辑

黄色框中的结果就是_sn的值
红色框中的返值就是黄色框中的结果

此外,红色框中的运算逻辑就是 浏览器传递的参数
即下图中
1. 参数:除了_sn以外所有参数组成的对象 通过 JSON.stringify转换后的字符串
2. 盐 即固定值(c9d6618dbc657b41a66eb0af952906f1)

这二者拼接后的字符串经过md5(32位)加密后使用·slice(2,12)取出的字符串
将内容转换为明文即


而_0xe7fex2.hash 就是md5加密

无需进入方法内部查看,具体是否为标准的md5加密一试便知

至此 _sn的解密操作就已经完成了

通过Nodejs 补环境实现

因为可以直接把文件拿下来用这个方法就不过多说了,说一下怎么补环境吧
可以通过nodejs的jsdom来实现,这里就直接贴核心代码了

const jsdom = require("jsdom")
const {JSDOM} = jsdom const resourceLoader = new jsdom.ResourceLoader({
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Edg/110.0.1587.63"
}) const html = `<!DOCTYPE html><p>Hello world</p>` const dom = new JSDOM(html) document = dom.window.document
window = dom.window // 这三个是从文件中抠出来的,也可以直接用整个文件,但是这三个是必须有的
var _0xe7fex1 = {...}
var _0xe7fex2 = {...}
function _0xe7fex35(_0xe7fex36){...} let ls = process.argv.slice(2) // 接收命令行调用时的参数
obj = {"poi_id": 40061,"type": 0,"keyword_id": 0,"page": ls[0],"_ts": ls[1]}
console.log(_0xe7fex35(obj)) //打印/返回结果

python调用需要配置一下node环境

# coding=utf-8
import requests, os, subprocess,requests,time
from lxml import etree os.environ["NODE_PATH"] = "./node_modules"
# obj = {"poi_id": 40061,"type": 0,"keyword_id": 0,"page": 3,"_ts": 1678937379585} page = 6
ts = int(time.time()*1000)
sn = subprocess.getoutput(f'node jiudian.js {page} {ts}')
print(sn)
通过Python算法还原实现

通过python的hashlib库进行md5操作,其中的参数值通过字符串拼接完成

import hashlib
import json # 创建一个md5对象
m = hashlib.md5()
# 将字典转换为JSON格式的字符串并传入md5对象
ts = int(time.time()*1000)
params = {
"_ts": f"{ts}",
"keyword_id": "0",
"page": "7",
"poi_id": "40023",
"type": "0"
} salt = "c9d6618dbc657b41a66eb0af952906f1" m.update((json.dumps(params, separators=(',', ':')) + salt).encode())
# 获取md5加密后的十六进制字符串
result = m.hexdigest()[2:12]
params.update({"_sn":_result})
# 打印结果
print(result)

完整代码已上传至 Gitee

【JS逆向】【多图+附源码】 2023 python获取某蜂窝 _sn的相关教程结束。

《【JS逆向】【多图+附源码】 2023 python获取某蜂窝 _sn.doc》

下载本文的Word格式文档,以方便收藏与打印。