免责声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请在微信公众号【小白逆向】联系作者立即删除!
前言
acw_sc__v2在逆向反爬中,经常遇到。本次分享中笔者将其以十分详细的方式来分享给大家。
逆向目标
-
逆向目标:某球热帖cookie加密:acw_sc__v2 -
逆向主页:aHR0cHM6Ly94dWVxaXUuY29tL3RvZGF5 -
逆向接口:aHR0cHM6Ly94dWVxaXUuY29tL3N0YXR1c2VzL2hvdC9saXN0VjIuanNvbg== -
脱敏处理(base64编码) -
涉及知识点:OB混淆、无限debugger、解OB混淆、控制台巧妙使用、无痕浏览器的使用
网络抓包分析
本次抓包会比较特殊一点
1、首先打开浏览器的首页,根据图中进行操作
2、在再在浏览器地址栏输入目标地址
3、按照图中进行操作后,回车向目标地址发起请求。
4、就会来到这个页面,并且会自动断住。如果没有断住,那么关闭浏览器将当前步骤重新来一遍。
acw_sc__v2逆向分析
1、点击跳出当前函数
然后再格式化代码,来到当前页面
2、拉动滑轮来到文章的底部,可以看当前的加密参数acw_sc__v2
3、并在此参数的位置断下断点,然后点击执行跳到下一断点
选择Never pause here
4、再次点击跳到下一断点,现在来到我们自己断下的断点。
5、查看堆栈信息,点击最后一个栈
6、程序来到图中红框的位置,发现这种编码,是不是很熟悉?对,它又是16进制编码。
这里使用笔者自己写编码解码脚本
# **************************************
# --*-- coding: utf-8 --*--
# @Time : 2022-12-06
# @Author : white
# @FileName: hex_to_str.py
# @Software: PyCharm
# **************************************
import re
s = r'''setTimeout('x72x65x6cx6fx61x64x28x61x72x67x32x29', 0x2);'''
for i in re.findall("\\x[0-9a-f]+", s, re.DOTALL):
s = s.replace(i, chr(int(i[2:],16)))
print(s)
7、解码出来是setTimeout('reload(arg2)', 0x2);
,可以看到就是咋们自己断下的断点的函数名。所以分析其中arg2
的来源。这里直接将arg2 = _0x23a392[_0x55f3('0x1b', 'x7ax35x4fx26')](_0x5e8b26);
复制到本地环境中,然后进行调试运行,根据调试报错结果去补相应的环境依赖。
8、_0x23a392
为未定义,所以找它的定义位置,位置信息就在其上一行。var _0x23a392 = arg1[_0x55f3('0x19', 'x50x67x35x34')]();
9、arg1
未定义,所以直接在控制台输入arg1
它是一个定值,不防想想在当前文件中搜索这个定值。
10、查找到只有这一个结果,所以它是随着js文件一起返回的,所以后续我们通过正则匹配将其匹配出来。
11、添加了arg1
在本地再次运行调试。
_0x55f3
报错未定义,这里将_0x55f3('0x19', 'x50x67x35x34')
与_0x55f3('0x1b', 'x7ax35x4fx26')
放到浏览器的控制台中进行输出
12、发现输出的结果是一个字符串,所以大致可以确定,_0x55f3
是一个混淆解析函数,所以不用去扣取这个函数,如果在后续提示这个函数报错,直接将这个函数以及其传入的参数放到控制台中执行,将得到的字符串替换掉本地的函数,比如像这样:
13、那么接下来的操作就是类似的了,比如像现在:
那么直接在控制太中输入arg1["unsbox"]
即可
14、点击输出的结果到对应的函数,再将其复制到本地即可。
15、然后将其中的_0x55f3
解混淆即可,对于解混淆时,可以采用每次的报错信息来解。
图中的红框就是经过解混淆的了。
16、现在报错_0x5e8b26
未定义,所以在控制台中进行输出
17、但是这里报错了,原因可能是在当前的堆栈环境中没有这个变量的值,但是也不碍于咋们分析它,所以直接在当前文件中搜索它
18、在搜索的第5个结果中发现它被混淆了,所以接下混淆
这里得知,它是一大长串数字,所以将这个数字复制到本地。
19、再次运行代码执行,又报错_0x23a392.hexXor is not a function
说它不是一个函数
20、同样的方法,在控制台输入这个函数_0x23a392.hexXor
同样得到了相应的函数,与当前步骤的13步以及后续步骤一样的操作,对其进行扣取,然后解混淆。
21、这是笔者扣取的结果
22、再次运行js代码
成功拿到加密cookie结果~~~
23、对加密接口进行包装
function white(arg1) {
var _0x5e8b26 = '3000176000856006061501533003690027800375';
var _0x23a392 = arg1['unsbox']();
arg2 = _0x23a392['hexXor'](_0x5e8b26);
return arg2
}
arg1
为每次调用函数需要传入的参数。
acw_sc__v2获取流程分析
1、首先请求主页地址,拿到网页初步返回的混淆代码结果;
2、拿到返回结果后,提取出arg1
的值进行本地加密;
3、再次向首页地址发起请求,获取网页返回的cookie;
4、携带两次cookie向接口url发起请求,获取最终数据。
总结
测试用例,不能直接运行
# **************************************
# --*-- coding: utf-8 --*--
# @Time : 2022-12-06
# @Author : white
# @FileName: 某球.py
# @Software: PyCharm
# **************************************
import requests
import execjs
import re
cookies = dict()
def get_cookie():
'''获取acw_tc cookie'''
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52",
}
url = 'https:脱敏处理/today'
res = requests.get(url=url, headers=headers)
arg1 = re.findall("varsarg1='(.*)'", res.text)[0]
cookies.update(res.cookies.get_dict())
cookies['acw_sc__v2'] = execjs.compile(open('./acw_sc__v2.js', encoding='utf-8').read()).call('white', arg1)
# 第二次获取cookie
res = requests.get(url=url, headers=headers, cookies=cookies)
cookies.update(res.cookies.get_dict())
def get_data():
if not cookies:
get_cookie()
url = 'https:脱敏处理/listV2.json'
data = {
"since_id": "-1",
"max_id": "-1", # 响应头中的 next_id
"size": "15"
}
headers = {
"Host": "脱敏处理.com",
"Referer": "https:脱敏处理/today",
"sec-ch-ua": ""Chromium";v="106", "Microsoft Edge";v="106", "Not;A=Brand";v="99"",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 Edg/106.0.1370.52",
}
res = requests.get(url=url, params=data, headers=headers, cookies=cookies).json()
print('next_id: ',res['next_id'])
print('next_max_id',res['next_max_id'])
for i in res['items']:
room = dict()
room['标题'] = i['original_status']['title']
room['描述'] = i['original_status']['description']
room['原标题'] = i['original_status']['rawTitle']
room['时间'] = i['original_status']['timeBefore']
room['标签'] = i['original_status']['tagsForWeb']
print(room)
get_data()
成功截图:
相关代码已在github开源
https://github.com/puboop/reverse/
原文始发于微信公众号(小白逆向):【逆向系列】3-某球热点acw_sc__v2加密逆向