陈公子的话 发表于 2020-12-30 20:39:27

猿人学第一题js混淆加密

!(data/attachment/forum/202012/30/191113vzha4sklz88yhyz8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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

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

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

!(data/attachment/forum/202012/30/191342d38wwwiycppw3dgw.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


!(data/attachment/forum/202012/30/191421t7kewzqkzn7w9fng.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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

!(data/attachment/forum/202012/30/191459jolgkdxzu5ojgqdn.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


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

!(data/attachment/forum/202012/30/191655q3ra95218lhsf58f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

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

!(data/attachment/forum/202012/30/191841mtz9tatbaa38aczt.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

!(data/attachment/forum/202012/30/191857fhhzkmzffh7hexmh.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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

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

!(data/attachment/forum/202012/30/192513uca59d6zxyxcdl4h.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

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

!(data/attachment/forum/202012/30/192758nx00zr0zg7zwgai4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

找到了m所在位置。

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

oo0O0()猜测是一个函数

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

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


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

!(data/attachment/forum/202012/30/193427m9a8flrryqqq7f8s.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


var m = window.f;


源码中搜索window.f

!(data/attachment/forum/202012/30/193620tjkjkjseb4ddwjaj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


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

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

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


eval中有一个函数atob()

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

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

!(data/attachment/forum/202012/30/194421q885nk5uk1w5sny6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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

!(data/attachment/forum/202012/30/194641nsssgmbpbbr1avzp.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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

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

!(data/attachment/forum/202012/30/194854werkuvxbyjebfrmc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

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


!(data/attachment/forum/202012/30/195214f5y7yuu69jqjpi9s.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


'\x27' + mw + '\x27'

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

!(data/attachment/forum/202012/30/195348g4bblzt0fs0v7lrq.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")

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


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

eval(atob(window['b'])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`

!(data/attachment/forum/202012/30/200818f3vzh0kv6v6y03cy.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")


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


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


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

!(data/attachment/forum/202012/30/203820yrsm06wovgqkjm5r.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "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 = 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}')
```


注:借鉴了大佬思路.

陈公子的话 发表于 2020-12-30 20:40:21

这图片我也是....没整明白....咋就成这了....

王一之 发表于 2020-12-31 09:36:31

小陈 发表于 2020-12-30 20:40
这图片我也是....没整明白....咋就成这了....

markdown的原因....修复了应该就好了

Anivia2015 发表于 2020-12-31 12:35:47

果然这个论坛里除了我是fw其他都是大佬

陈公子的话 发表于 2020-12-31 13:55:04

StudyMaker 发表于 2020-12-31 12:35
果然这个论坛里除了我是fw其他都是大佬

哥哥谦虚了
页: [1]
查看完整版本: 猿人学第一题js混淆加密