【逆向系列】4-某花顺hexin-v加密逆向

逆向病毒分析 2年前 (2022) admin
940 0 0

免责声明

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!

前言

这篇文章关于一个请求头中的hexin-v自定义字符串进行逆向。同时也是一种思维的转换。
本篇使用会使用到jsdom技术。简单来说jsdom就是在本地模拟浏览器环境,从而达到一个沙箱的目的。关于jsdom的安装,在工作目录下npm install jsdom --save即可安装js三方包。本篇文章只是对jsdom的一个简单使用。在后续的高级逆向中,会遇到更困难的环境检测。

逆向目标

  • 某花顺:cookie中的v(hexin-v)
  • 逆向首页:aHR0cDovL3EuMTBqcWthLmNvbS5jbi8=
  • 逆向接口:aHR0cDovL3EuMTBqcWthLmNvbS5jbi9pbmRleC9pbmRleC9ib2FyZC9hbGwvZmllbGQvemRmL29yZGVyL2Rlc2MvcGFnZS8xL2FqYXgvMS8=
  • 脱敏处理(base64编码)
  • 涉及知识点:jsdom、函数导出

网络抓包分析

1、打开网页并打开开发者工具后,将网页拉倒最底

【逆向系列】4-某花顺hexin-v加密逆向


然后选择1/那个包,在请求 头中就可以看见今天的主角

【逆向系列】4-某花顺hexin-v加密逆向


2、考大家个问题:在首次进行逆向时,你会选择什么方法?
笔者在第一次逆向的时候选的是xhr断点,但是被揍的满地找牙。。。
依据之前的逆向经验,我们通常会去全局搜索hexin-v或者hexin-v:,但是在这次逆向过程中得到的结果:

【逆向系列】4-某花顺hexin-v加密逆向


【逆向系列】4-某花顺hexin-v加密逆向


可以看到都是无结果。


hexin-v逆向分析

1、细心的小伙伴会发现hexin-v与cookie的v值是一模一样的,所以既然hexin-v无法查找到,所以可以针对cookie下手,直接全局搜索cookie:

【逆向系列】4-某花顺hexin-v加密逆向


可以发现搜索的结果很多,不便于我们进行过滤分析。那怎么办呢?
2、搜索setcookie看看?

【逆向系列】4-某花顺hexin-v加密逆向


进入这个js文件,然后格式化代码,再次点击搜素

【逆向系列】4-某花顺hexin-v加密逆向


3、可以看到找到了4个结果,既然不知道到底是哪个,那么就进入将这4个都断下断点。
最后一个结果在一个数组中,所以就没必要下断点了

【逆向系列】4-某花顺hexin-v加密逆向


接下来就点击下一页
4、可以看到在1048行断住了,也就是第三个断点

【逆向系列】4-某花顺hexin-v加密逆向


其中n的值就与加密的cookie的v值十分相似
5、输出setCookie中的Fn、n、o[248]、A、t[215]

【逆向系列】4-某花顺hexin-v加密逆向


6、到这里就可以肯定了,n就是我们要的值,所以进行溯源n。n就是rt.update();,进入rt.update,在控制台输入rt.update,点击进入其中。来到如图中的D函数: 



【逆向系列】4-某花顺hexin-v加密逆向


7、从头到尾大概看看这个js文件的全部代码。发现了几点:


  • 整体是一个自执行函数;
  • 对于这种代码不多的文件如果扣取部分函数的话,会疯狂的报依赖错误;
  • 所以,我们这里采用全部复制到本地环境,看看其中所缺的依赖,然后进行补充即可。

8、复制到本地的代码直接执行,报document未定义。

【逆向系列】4-某花顺hexin-v加密逆向


9、因为整体涉及到鼠标侦听,dom元素之类的环境,手动补的h话难度太大。这里的话直接使用jsdom来补环境了


const jsdom = require("jsdom");
const {JSDOM} = jsdom;
const dom = new JSDOM('', {
    url"http://脱敏处理/",
    referer"http://脱敏处理/",
    contentType"text/html",
    includeNodeLocationstrue,
    storageQuota1000
});
window = dom.window;
document = window.document;
navigator = window.navigator;

其中补的环境有三个:windowdocumentnavigator; 

10、再次运行代码

【逆向系列】4-某花顺hexin-v加密逆向


图中报错的信息整理出来的大概意思就是jsdom的画布相关依赖没有安装,导致画布渲染失败。
这里解释一下画布:简单点说,在一块矩形区域内你可以随意操作其中的元素。
咋们不需要画布,所以不用管这个报错信息。 


11、现在导出当前步骤中步骤6中的D函数

function D({
    return O()
}
// 导出D函数
_red = D;

12、导出函数后,再将其进行包装一下,方便后续的调用

【逆向系列】4-某花顺hexin-v加密逆向


13、运行代码



【逆向系列】4-某花顺hexin-v加密逆向


可以看到成功拿到加密结果~~~


数据获取流程

  • 获取加密结果;
  • 组装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[0if 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()

成功截图:

【逆向系列】4-某花顺hexin-v加密逆向


代码已在github开源:

https://github.com/puboop/reverse/

原文始发于微信公众号(小白逆向):【逆向系列】4-某花顺hexin-v加密逆向

版权声明:admin 发表于 2022年12月8日 上午10:05。
转载请注明:【逆向系列】4-某花顺hexin-v加密逆向 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...