猿人学web - 第一题 js 混淆 - 源码乱码

声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵犯了您的合法权益,请告知,我将及时更正、删除,谢谢。邮箱地址:lc1139411732@163.com

本专题将和大家一起分析、学习猿人学web练习题。不同意见或想法可以评论或私信,大佬勿喷!


练习地址:第一题 js混淆源码乱码 - 猿人学

 一、抓包

        本题的目标是抓取出全部机票的价格然后求平均值,抓包后发现有一个异步请求返回的内容既是对应的机票价格;可以看出本地只有一个加密参数就是m。根据参数的形态可以将他分为2部分,前面部分像是个md5的密文 + | + 后半部分像是时间戳。

m: 96fb11bc10441289975dd4547e420813丨1666951466

 二、堆栈跟踪

   1.跟栈后定位到加密位置,可以看出以下代码就是加密的核心 部分了。_0x2268f9 = 时间戳

_0x57feae = oo0O0加密 

 var _0x2268f9 = Date['\x70\x61\x72\x73\x65'](new Date()) + (16798545 + -72936737 + 156138192)
 _0x57feae = oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']()) + window['\x66'];

 2.跟oo0O0加密函数,进来以后发现代码都被压缩成了1行,看来这题的难点就在这里。我们把oo0O0函数全部拷贝出来进行格式化分析。

 三、本地调试

1.执行 oo0O0函数,参数和浏览器一样,报错缺少window。补齐

window = this;

 2.报错window.a.length = undefined  补齐,这个可以直接去浏览器调用window.a复制出来。

 3.缺少document,由于代码量比较少,补齐。由于代码量比较小,搜索发现一共就掉了4次还都在这一行,我们也可以直接去浏览器把结果复制出来。在最后面我们还可以看到有个window.c,也是一样直接复制出来。

 4.报错缺少atob,要知道这个方法是node不存在的。

nodejs 里没有 atob btoa 的方法,这两个方法是浏览器 js 环境中的 window 对象的方法,且这两个方法好像不能转汉字。其实这两个方法就是base64

 nodejs 可以用自己的方法实现转 base64

new Buffer(window.b, 'base64').toString()

 5.实现加密

我们观察还原后的代码直接看出来这是个md5加密,然后用window.f将结果导出来的。所以也对上了,我们上面的window调用。

本地生成与浏览器对比,结果一致。

 

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

"""
@Author : LingXiaoShuai
@File   : 第一题
@Time   : 2022-10-27 15:51
@Desc   : 
"""
# -*- coding: utf-8 -*-


import requests
import execjs
import time

def get_md5_value():

    with open(r'第一题.js',encoding='utf-8',mode='r') as f:
        get_m = f.read()

    psd = execjs.compile(get_m).call('get_m')
    # print(psd)
    return psd

def get_data(page):
    result = 0
    m = get_md5_value()
    url = f'http://match.yuanrenxue.com/api/match/1?page={page}&m={m}'
    # print(url)
    headers = {
        'accept': 'application/json, text/javascript, */*; q=0.01',
        'cookie': 'sessionid=你自己的',
        'referer': 'https://match.yuanrenxue.com/match/1',
        'User-Agent':'yuanrenxue.project',
    }
    html = requests.get(url,headers=headers).json()
    # print(html['data'])
    for nu in html['data']:
        result += int(nu['value'])

    return result

if __name__ == '__main__':
    # get_md5_value()
    result = 0
    for page in range(1,6):
        data = get_data(page)
        print(data)
        result += data
    print(f'结果:{result / 50}')

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值