免责声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!
前言
这篇文章关于一个请求头中的hexin-v自定义字符串进行逆向。同时也是一种思维的转换。
本篇使用会使用到jsdom技术。简单来说jsdom就是在本地模拟浏览器环境,从而达到一个沙箱的目的。关于jsdom的安装,在工作目录下npm install jsdom --save
即可安装js三方包。本篇文章只是对jsdom的一个简单使用。在后续的高级逆向中,会遇到更困难的环境检测。
逆向目标
-
某花顺:cookie中的v(hexin-v) -
逆向首页:aHR0cDovL3EuMTBqcWthLmNvbS5jbi8= -
逆向接口:aHR0cDovL3EuMTBqcWthLmNvbS5jbi9pbmRleC9pbmRleC9ib2FyZC9hbGwvZmllbGQvemRmL29yZGVyL2Rlc2MvcGFnZS8xL2FqYXgvMS8= -
脱敏处理(base64编码) -
涉及知识点:jsdom、函数导出
网络抓包分析
1、打开网页并打开开发者工具后,将网页拉倒最底
然后选择1/那个包,在请求 头中就可以看见今天的主角
2、考大家个问题:在首次进行逆向时,你会选择什么方法?
笔者在第一次逆向的时候选的是xhr断点,但是被揍的满地找牙。。。
依据之前的逆向经验,我们通常会去全局搜索hexin-v
或者hexin-v:
,但是在这次逆向过程中得到的结果:
可以看到都是无结果。
hexin-v逆向分析
1、细心的小伙伴会发现hexin-v与cookie的v值是一模一样的,所以既然hexin-v无法查找到,所以可以针对cookie下手,直接全局搜索cookie:
可以发现搜索的结果很多,不便于我们进行过滤分析。那怎么办呢?
2、搜索setcookie
看看?
进入这个js文件,然后格式化代码,再次点击搜素
3、可以看到找到了4个结果,既然不知道到底是哪个,那么就进入将这4个都断下断点。
最后一个结果在一个数组中,所以就没必要下断点了
接下来就点击下一页
4、可以看到在1048行断住了,也就是第三个断点
其中n的值就与加密的cookie的v值十分相似
5、输出setCookie中的Fn、n、o[248]、A、t[215]
6、到这里就可以肯定了,n就是我们要的值,所以进行溯源n。n就是rt.update();
,进入rt.update
,在控制台输入rt.update
,点击进入其中。来到如图中的D
函数:
7、从头到尾大概看看这个js文件的全部代码。发现了几点:
-
整体是一个自执行函数; -
对于这种代码不多的文件如果扣取部分函数的话,会疯狂的报依赖错误; -
所以,我们这里采用全部复制到本地环境,看看其中所缺的依赖,然后进行补充即可。
8、复制到本地的代码直接执行,报document未定义。
9、因为整体涉及到鼠标侦听,dom元素之类的环境,手动补的h话难度太大。这里的话直接使用jsdom来补环境了
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const dom = new JSDOM('', {
url: "http://脱敏处理/",
referer: "http://脱敏处理/",
contentType: "text/html",
includeNodeLocations: true,
storageQuota: 1000
});
window = dom.window;
document = window.document;
navigator = window.navigator;
其中补的环境有三个:window
、document
、navigator
;
10、再次运行代码
图中报错的信息整理出来的大概意思就是jsdom的画布相关依赖没有安装,导致画布渲染失败。
这里解释一下画布:简单点说,在一块矩形区域内你可以随意操作其中的元素。
咋们不需要画布,所以不用管这个报错信息。
11、现在导出当前步骤中步骤6中的D
函数
function D() {
return O()
}
// 导出D函数
_red = D;
12、导出函数后,再将其进行包装一下,方便后续的调用
13、运行代码
可以看到成功拿到加密结果~~~
数据获取流程
-
获取加密结果; -
组装cookie与hexin-v -
获取数据 -
解析数据
总结
代码示例,不能直接运行:
# **************************************
# --*-- coding: utf-8 --*--
# @Time : 2022-12-07
# @Author : white
# @FileName: 某花顺.py
# @Software: PyCharm
# **************************************
import requests
import execjs
from lxml import etree# 获取hexin-v
def get_hexin_v():
hexin_v = execjs.compile(open('./hexin_v.js', encoding='utf-8').read()).call('white')
headers = {
"Cookie": "v={}".format(hexin_v),
"hexin-v": hexin_v,
"Host": "脱敏处理",
"Referer": "http://脱敏处理/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36 Edg/101.0.1210.39"
}
return headers
# 获取网页数据
def get_page():
headers = get_hexin_v()
for num in range(1,5):
url = 'http://脱敏处理.脱敏处理/脱敏处理/{num}/ajax/1/'.format(num=num)
yield requests.get(url=url, headers=headers).text
# 获取数据
map = lambda x: x[0] if x else '无'
#解析网页数据
def parse_page():
numbers = 0
for page in get_page():
html = etree.HTML(page)
tbody = html.xpath('.//tbody/tr')
for room in tbody:
numbers += 1
goods = dict()
code = map(room.xpath('.//td[2]//text()'))
name = map(room.xpath('.//td[3]//text()'))
price = map(room.xpath('.//td[4]//text()'))
Turnover = map(room.xpath('.//td[11]//text()'))
Tradable = map(room.xpath('.//td[12]//text()'))
goods['脱敏处理'] = code
goods['脱敏处理'] = name
goods['脱敏处理'] = price
goods['脱敏处理'] = Turnover
goods['脱敏处理'] = Tradable
print(goods)
print('共计:{}脱敏处理'.format(numbers))if __name__ == '__main__':
parse_page()成功截图:
代码已在github开源:
https://github.com/puboop/reverse/
原文始发于微信公众号(小白逆向):【逆向系列】4-某花顺hexin-v加密逆向