python爬虫 - js逆向之猿人学第十六题webpack,忽略obfuscator

前言

好久没有写猿人学的分析了,今天来分析一波

 

打开网址:

 

同样的,也很轻易的拿到接口,

 

 

然后这个接口里的请求参数又是迷人的m,m就是我们的目标了

 

分析

 

老规矩,搜索:

 

 

 

搜一堆出来,感觉都不太靠谱

 

那咋办?先看特征,看这个长度是多少的,卧槽,这个长度有点少见了

 

 

 

点调用栈看看:

 

 看到这个就很可疑了

 

 

为啥这么说,dispatch分发请求,匿名函数操作,实际的request,所以,关键的逻辑一定在这个request或者匿名函数anonymous前后,再看js名字就叫webpack,那就是webpack打包的,那前面才分析过webpack的东西,不用怕,点进去看:

 

 

进来都到这里,打上断点,翻页看看,这不就找到了吗,看着webpack唬人,感觉没两样啊

 

 

然后看逻辑,m的值就是n[e(528)](btoa, p_s)生成的了,然后传入的参数btoa,这个可以直接调用,不用多说,再看后面的p_s,定义就在上面,那就只剩n[e(528)]这个不知道啥东西了,鼠标放上去,发现,这个就是前面说的匿名函数anonymous了

 

 

点过去,发现就在上面,然后看逻辑,第一个参数是个函数,然后把第二个参数传入函数直接返回,这个不就是python里的装饰器嘛,

 

 

那么,也就是说,实际的加密逻辑就是btoa(p_s)

 

控制台操作下:

 

 

这不就出来了吗

 

 

然后,前面js逆向安全专题里说了,btoa就是个base64的函数,直接忽略了,python里直接就有,主要是后面的这个参数:

 

p_s = Date[e(496)](new Date)[e(517)]()

 

时间相关的都好说,就差这个e(517)和e(496)了,控制台看是啥东西:

 

 

 

 最后的结果:

 

 然后这个时间戳的话,是毫秒级别的,13位

 

 

调试

那行,直接在python里搞一个看行不行

 

 突然感觉跟预期的有点不一样,这个长度不对啊

 

 首先,整个结果就不对的,

 

 

然后再用node操作也报错:

 

 

从node版本16开始,原生支持atob,btoa,但是之前不支持

 

拿得从长记忆了,控制台打印下:

 

 

双击返回的,进入,如下,这他妈一看,典型的obfuscator混淆啊(别问我怎么看出来的)

 

 

 

既然是ob,先把这个btoa的上级整个抠出来的,此时有两套方案

 

  • 第一个可以用ast对ob混淆反混淆,然后整体逻辑就会很清晰,后续就能很快解决问题,前提得回ast,且熟悉ob混淆逻辑
  • 第二个不用反混淆,直接补环境也是可以的,但是这个补环境时,如果环境没补好,容易出现错误的结果

 

ob混淆的话,得花好几期的博客文章才能说清楚,为了照顾对这方面不太理解的朋友,所以我选用第二个方案,补环境,抠代码:

 

如下,抠出来后,执行,

 

 

 

把u补上,找到u:

 

 补上并执行:

 

 

继续补_0x34e7并执行:

 

 

 补f,同同时,把标注出来的删了

 

 

补完,这里的f用了u,所以要放在u下面

 

 继续补d

 

 

 

继续补window

 

 

补md5

 

 

补n,其实这里看到,这个n就是webpack的加载器,或者叫分发器

 

 

出现如下,r,但是刚才的n并没有带入参数啊,

 

 

再看源站里的,此时才发下,n并不是刚才定位到的,而是上面的n

 

 所以还是不能信鼠标放上去的跳转啊,尤其这种就一个字母,很容易链接错,因为作用域的问题,你很有可能链接到同名的其他地方去了,像上面就是

看到用了个_0x4c28,干脆把这里都复制下来:

 

 

执行,终于有结果了

 

 调试

 

然后再在浏览器里执行看看,注意,我直接把window = global删了,window.md5直接改成了md5,因为浏览器环境里自带有window对象,所以不用补了

 

 

结果也是有的,那么怎么确定这个结果就跟官方的一样呢,用同一个时间地址就可以了:

先看,这是官方的结果:

 

 把这个值直接放到扣出来的代码执行,node里:

 

 浏览器的source - snippet里

 

 

 

三个值都不一样,那多半也没法用啊,哪里有问题呢?

 

再从头看下:

 

 

 

 

 

应该就是检测了环境,刚才补的环境还是有问题,想到刚才的delete那里:

 

 

 这里只能一行一行看了,可以对这里打上断点一点点看了:

 

 

 然后这里看到这个n:

 

 刚才我们也补了一个n,对比下区别,下面是自己补的,这个值明显就不对了啊,怎么办

 

 看到源网站的n:

 

 

那就把相关的都补上吧,放在for循环上边点:

 

 

好的,现在看,然后发现,即使我把时间写死了,每次执行还是会有不同的结果,那就不多说了,直接拿来请求看看能不能有正常结果吧,先稍微改下js文件:

 

 

 

 

 

python调用:

 

 

那就可以,整理下求和吧

 

 

 

填入答案:

 

 

js代码:

  

python代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import requests
 
headers = {
    "authority": "match.yuanrenxue.com",
    "x-requested-with": "XMLHttpRequest",
    "sec-ch-ua-mobile": "?0",
    'cookie': 'sessionid=换成你的sessionid',
    "user-agent": "yuanrenxue.project",
    "sec-ch-ua-platform": "\"Windows\"",
    "sec-fetch-site": "same-origin",
    "sec-fetch-mode": "cors",
    "sec-fetch-dest": "empty",
    "referer": "https://match.yuanrenxue.com/match/16",
    "accept-language": "zh-CN,zh;q=0.9"
}
 
url = "https://match.yuanrenxue.com/api/match/16"
 
 
def get_m():
    import execjs
    with open('get_m.js') as f:
        cont = f.read()
        js = execjs.compile(cont)
        result = js.call('get_m')
        m, ts = result
        return m, ts
 
 
def get_page(page):
    m, ts = get_m()
    params = {
        "page": page,
        "m": m,
        "t": ts
    }
    with requests.get(url, headers=headers, params=params) as response:
        print(1232123123,response)
        result = response.json()
        data = result.get('data')
        return [d.get('value') for d in data]
 
 
def get_data():
    end = 0
    for i in range(1, 6):
        temp_list = get_page(i)
        some = sum(temp_list)
        end += some
    print('end', end)
 
 
get_data()

  

 

 

结语

 

本次直接忽略ob混淆,硬抠webpack代码,一样有结果,难倒是不难,主要有点骚,他改了btoa函数和md5函数的逻辑,不是原生的

 

posted @   Eeyhan  阅读(1109)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示