上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 陈公子的话 - 

猿人学第一题js混淆加密

[复制链接]
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 532 天

    [LV.9]以坛为家II

    148

    主题

    420

    回帖

    1215

    积分

    版主

    积分
    1215

    油中2周年生态建设者

    发表于 2020-12-30 20:39:27 | 显示全部楼层 | 阅读模式

    image.png

    抓取机票价格,计算平均值。

    先说一下自己的思路,价格源码没有毫无疑问肯定是向服务器发送了一个请求,然后返回回来价格列表,我们只需要将返回的数据,取出我们所需要的价格计算即可。

    首先,打开开发者工具,进行抓包。

    image.png

    debug直接跳过就可以不影响我们后面的操作。

    image.png

    刷新,通过简单的分析我们看到了这条请求,看一下返回的数据。

    image.png

    是我们需要的价格,看一下这个链接:http://match.yuanrenxue.com/api/match/1?m=42532d8cc5d339a5b8a434a7c282e53d%E4%B8%A81609426851

    后面参数m有一个简单的加密,经验告诉我去解码看一下这条链接。

    image.png

    %E4%B8%A8是符号“|”,多次抓包发现每次都携带这个符号,开发者工具中搜索这个符号。

    image.png

    image.png

    可以看到只有一条包含这个符号,进入js文件分析一下。

    这是一整行代码,观察分析起来非常不方便,了解到notepad++里面自带插件jstool对它进行格式化,之后进行观察。

    image.png

    这样观察起来就方便很多。

    image.png

    找到了m所在位置。

    var m = oo0O0(timestamp.toString()) + window.f;

    oo0O0()猜测是一个函数

    timestamp.tostring()时间戳转字符串

    window.f 窗口调用f,f是啥玩意....我也不知道,先不管。先分析都是圈圈的那个函数。

    搜素oo0O0这个函数 找到了两处 一处是function oo0O0() 另外一处就是我们m调用的这个函数

    image.png

    花里胡哨的返回了一个空.....

    var m = window.f;

    源码中搜索window.f

    image.png

    源码中没有找到这个window.f具体是什么东西....搜索方式可能不对,但是肯定不可能单独搜索f不然太多了。。

    oo0O0()返回一个空,多少有点不太正常,我们回去重新看一下,发现在返回空上面那一行出现了

    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));

    eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

    eval中有一个函数atob()

    atob() 方法用于解码使用 base-64 编码的字符串。

    我们将atob(window[’b‘])在console里面跑一下

    image.png

    稍微有点经验都可以看出来这是md5加密的算法

    image.png

    md5算法的最后我们看到了window.f ,window.f就是将“mwqqppz”进行md5加密之后的值,mwqqppz这是啥玩意....我也不知道

    将eval函数后面的J('0x0', ']dQW')扔进console看一下。

    image.png

    j是在oo0O0函数里面定义的,我们先运行oo0O0函数的代码定义一下这个J 然后再去跑这个J('0x0', ']dQW')

    image.png

    我们看到window.f里面进行md5计算的字符串出来了 是这个代码J('0x1', 'GTu!')

    '\x27' + mw + '\x27'

    这个为什么会找不出来值呢

    image.png

    我们可以看到'\x27'就是个单引号 至于mw是OOOOOO函数传进来的参数,

    我们知道eval函数里面各种东西的意思之后,我们把我们取出来的值替换观察一下。

    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));

    eval(atob(window['b'])['replace']('mwqqppz', 'mw'));

    这个的大概意思就是....将atob(window['b']里面的'mwqqppz'文本替换为 'mw',也就是替换成传入的参数--时间戳。

    我们捋一下思路看一下,

    var timestamp = Date.parse(new Date()) + 100000000;

    var m = oo0O0(timestamp.toString()) + window.f;

    var m = window.f

    var m =hex_md5(mwqqppz)

    var m = hex_md5(mv)

    var m = hex_md5(timestamp)

    放进调试工具调试看看。

    我们的初始链接:http://match.yuanrenxue.com/api/match/1?m=42532d8cc5d339a5b8a434a7c282e53d%E4%B8%A81609426851

    image.png

    带入我们刚才的时间戳验证一下 经过计算 m的值得到了。

    剩下的就是写代码了,用e 的话可能5分钟可以搞定,但是为了练习自己的python用python尝试写一下看看。

    根据了解python可以用过execjs来执行js文件,我们讲创建js文件然后调用这个js得到加密后的数据使用即可。

    image.png

    计算成功python代码不做解释代码如下:

    import requests
    import execjs
    import time
    
    def Get_md5_value():
        #读取JS文件
        with open('JS/JS.js',encoding='utf-8',mode='r') as f:
            JSdata = f.read()
        #加载JS文件,通过call()传入我们需要调用的函数
        psd = execjs.compile(JSdata).call('get_cipher')
        psd = psd.replace('丨','%E4%B8%A8')
        return psd
    
    def Get_data(page_number,md5):
        url = 'http://match.yuanrenxue.com/api/match/1?page='+str(page_number)+'&m='+md5
        headers = {
            'Host': 'match.yuanrenxue.com',
            'Referer': 'http://match.yuanrenxue.com/match/1',
            'User-Agent': 'yuanrenxue.project',
        }
        res = requests.get(url=url,headers=headers)
        return res.json()
    
    if __name__ == '__main__':
    
        sum_num = 0
        index_number = 0
        for page_number in range(1,6):
            info = Get_data(page_number,Get_md5_value())
            price_list = [i['value'] for i in info['data']]
            print(f'第{page_number}的价格表{price_list}')
            sum_num += sum(price_list)
            index_number += len(price_list)
            time.sleep(1)
        average_price = sum_num/index_number
        print(f'机票的平均价格为{average_price}')

    注:借鉴了大佬思路.

    I don't hate programming but the fucking world.
  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 532 天

    [LV.9]以坛为家II

    148

    主题

    420

    回帖

    1215

    积分

    版主

    积分
    1215

    油中2周年生态建设者

    发表于 2020-12-30 20:40:21 | 显示全部楼层
    这图片我也是....没整明白....咋就成这了....
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 213 天

    [LV.7]常住居民III

    305

    主题

    4197

    回帖

    4061

    积分

    管理员

    积分
    4061

    管理员荣誉开发者油中2周年生态建设者喜迎中秋油中3周年挑战者 lv2

    发表于 2020-12-31 09:36:31 | 显示全部楼层
    小陈 发表于 2020-12-30 20:40
    这图片我也是....没整明白....咋就成这了....

    markdown的原因....修复了应该就好了
    上不慕古,下不肖俗。为疏为懒,不敢为狂。为拙为愚,不敢为恶。
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    20

    回帖

    37

    积分

    助理工程师

    积分
    37

    新人报道

    发表于 2020-12-31 12:35:47 | 显示全部楼层
    果然这个论坛里除了我是fw其他都是大佬
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 532 天

    [LV.9]以坛为家II

    148

    主题

    420

    回帖

    1215

    积分

    版主

    积分
    1215

    油中2周年生态建设者

    发表于 2020-12-31 13:55:04 | 显示全部楼层
    StudyMaker 发表于 2020-12-31 12:35
    果然这个论坛里除了我是fw其他都是大佬

    哥哥谦虚了
    I don't hate programming but the fucking world.
    回复

    使用道具 举报

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表