经过重放攻击调试,需要自己找的参数如下
from中参数:cursor_score、prefetch_id
headers中参数:x-s、cookie中a1参数、
import requests
url = "https://🐕.com/api/sns/web/v1/homefeed"
payload = "{\"cursor_score\":\"1.701248256973002E9\",\"num\":27,\"refresh_type\":3,\"note_index\":62,\"unread_begin_note_id\":\"\",\"unread_end_note_id\":\"\",\"unread_note_count\":0,\"category\":\"homefeed_recommend\",\"search_key\":\"\",\"need_num\":7,\"image_scenes\":[\"FD_PRV_WEBP\",\"FD_WM_WEBP\"],\"prefetch_id\":\"1eb569d1-eb74-4010-a01d-cce7c9e60583\"}"
headers = {
'cookie': 'abRequestId=5f4e41a6-0f86-52bc-8633-6a3bb6cf7000; a1=18bf685b42drkjdhudc83nl9n9rmwlo7qkhup6kj450000418793; webId=8b44ae7e78ac0c840ea3d183fd7993d8; web_session=030037a26e801c447c83259225224aaaf7f312; gid=yYDiKY2S8KAWyYDiKY2D4TKTJfFTVfx7fSYqxV4I1jIjF7286E1lWU8884yYWjq8W0qKjYD0; xsecappid=xhs-pc-web; cacheId=1eb569d1-eb74-4010-a01d-cce7c9e60583; webBuild=3.17.6; websectiga=59d3ef1e60c4aa37a7df3c23467bd46d7f1da0b1918cf335ee7f2e9e52ac04cf; sec_poison_id=c832dde1-9b21-4f6b-9141-01dddc8fcafb; unread={%22ub%22:%2265498e13000000002201cee5%22%2C%22ue%22:%226551fc70000000001701c91f%22%2C%22uc%22:24}; abRequestId=a03ce2d2-abf5-537a-9540-67ade5a4835c',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
'x-s': "XYW_eyJzaWduU3ZuIjoiNTEiLCJzaWduVHlwZSI6IngxIiwiYXBwSWQiOiJ4aHMtcGMtd2ViIiwic2lnblZlcnNpb24iOiIxIiwicGF5bG9hZCI6ImE2MmRlODY4NTY2MGI0ZDFhZTJhZTVlMDk1MmQwMTAyMWM1NWRmMTJmMmUwNjBlNjZlNGQ0MjM2YTNmMGVjYWRmMDM5ZjEyYmFiNGRhMjQ2ZDdmNDQyMWI5MmI2MGVmOWM5ZTNiZmRhMWZhYTFlYjkwZDc0YWEzMWI1NGM3MmNkMGQ3NGFhMzFiNTRjNzJjZGFjNDg5YjlkYThjZTVlNDhmNGFmYjlhY2ZjM2VhMjZmZTBiMjY2YTZiNGNjM2NiNTc5ZGUzNmFkY2I0YTA2MmVlZjY1ZTMzMTcwMWNmOTRjNjM4ZmVhNWY1NmE3NDY2OWVhMzZjZjkxYjRhZTJkZGIxOTQ5ZDgyMTE2YmRmMmVjODJiMmRhM2I1ZjY5NTM3NDcwMDRlNTUyNjM3OTRjNmNiMzdjNGM1YTU4YjA4OGFhNGYyYjZkNWRlNjM0NTUwMjc0ZWI0NGQzZmE0ZDlhOTQwYWE4OWIwMWQ0ZTU1NmZjZWFiOTllZWZmMmRlODZhZCJ9",
'Content-Type': 'text/plain'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
from中参数来源生成
首页请求返回prefetch_id参数,将prefetch_id拼接到'https://www.🐕.com/explore/prefetch?prefetch_id=prefetch_id',需要注意带着cookie(随便带一个就行)
import requests
url = "https://www.🐕.com/explore"
payload = {}
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'cookie': 'abRequestId=5f4e41a6-0f86-52bc-8633-6a3bb6cf7000; a1=18bf685b42drkjdhudc83nl9n9rmwlo7qkhup6kj450000418793; webId=8b44ae7e78ac0c840ea3d183fd7993d8; web_session=030037a26e801c447c83259225224aaaf7f312; gid=yYDiKY2S8KAWyYDiKY2D4TKTJfFTVfx7fSYqxV4I1jIjF7286E1lWU8884yYWjq8W0qKjYD0; xsecappid=xhs-pc-web; webBuild=3.16.5; websectiga=10f9a40ba454a07755a08f27ef8194c53637eba4551cf9751c009d9afb564467; sec_poison_id=63f4d60a-2ef0-406b-9878-d46f8e18e81f; abRequestId=a03ce2d2-abf5-537a-9540-67ade5a4835c; cacheId=f4c0aab8-bb9d-40a2-95ae-3e50c3e038a9',
'pragma': 'no-cache',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
import requests
url = "https://www.狗头.com/explore/prefetch?prefetch_id=dae1069b-a390-4896-b719-597912662bf4"
payload = {}
headers = {
'accept': 'application/json, text/plain, */*',
'accept-language': 'zh-CN,zh;q=0.9',
'cache-control': 'no-cache',
'cookie': 'abRequestId=5f4e41a6-0f86-52bc-8633-6a3bb6cf7000; a1=18bf685b42drkjdhudc83nl9n9rmwlo7qkhup6kj450000418793; webId=8b44ae7e78ac0c840ea3d183fd7993d8; web_session=030037a26e801c447c83259225224aaaf7f312; gid=yYDiKY2S8KAWyYDiKY2D4TKTJfFTVfx7fSYqxV4I1jIjF7286E1lWU8884yYWjq8W0qKjYD0; xsecappid=xhs-pc-web; cache_feeds=[]; webBuild=3.17.6; websectiga=16f444b9ff5e3d7e258b5f7674489196303a0b160e16647c6c2b4dcb609f4134; sec_poison_id=6048f63e-6b51-45a3-af20-392476db824d; unread={%22ub%22:%2265544ba3000000003203aa4b%22%2C%22ue%22:%22655440ed000000003103d5c6%22%2C%22uc%22:30}; cacheId=5bb78b0c-b760-4c6b-a2e4-387c942b259a; abRequestId=a03ce2d2-abf5-537a-9540-67ade5a4835c',
'pragma': 'no-cache',
'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
'x-b3-traceid': '73c978b780b97392',
# 'x-s': 'XYW_eyJzaWduU3ZuIjoiNTEiLCJzaWduVHlwZSI6IngxIiwiYXBwSWQiOiJ4aHMtcGMtd2ViIiwic2lnblZlcnNpb24iOiIxIiwicGF5bG9hZCI6ImM1NWQ3MjZmMmMyZDIwYjA5NzU4YjZjYmJiOTY0ZTVlMjRlNDBlNWQ2MGM3MDQzOGJmMWVkNzFjMDlmMjNmMjBiMTJkMTVjZWUxMDExMTAyNmQ0MWUwZTA4NjY2Nzc3YmM5ZTNiZmRhMWZhYTFlYjkwZDc0YWEzMWI1NGM3MmNkMGQ3NGFhMzFiNTRjNzJjZGFjNDg5YjlkYThjZTVlNDhmNGFmYjlhY2ZjM2VhMjZmZTBiMjY2YTZiNGNjM2NiNTc5ZGUzNmFkY2I0YTA2MmVlZjY1ZTMzMTcwMWNmOTRjNjM4ZmVhNWY1NmE3NDY2OWVhMzZjZjkxYjRhZTJkZGIxOTQ5ZDgyMTE2YmRmMmVjODJiMmRhM2I1ZjY5NTM3NDcwMDRlNTUyNjM3OTRjNmNiMzdjNGM1YTU4YjA4OGFhNGYyYjZkNWRlNjM0NTUwMjc0ZWI0NGQzZmE0ZDlhOTQzMjBiMDA2YmIxZGNhZmU0Y2I1OTA2ZWRhNWM4OGU0NiJ9',
'x-t': '1701250156954'
}
response = requests.request("GET", url, headers=headers, data=payload)
print(response.text)
直接把生成的链接放入浏览器即可获取内容
逆向完成!
还有headers参数啊?
那是付费内容嘿嘿嘿......
开玩笑的了
直接开逆
随便打个断点,调试堆栈,就能找到加密点
l后面那一坨就是加密参数生成的地方
追进去看看
一眼混淆,隐隐觉得不妙
随便跟了几步全是数值操作
恶心至极
直接把所有代码copy到本地补环境
意料之中运行报错
在网上有很多补环境的方法,有的是一步步添加缺失的地方,有的是用Proxy代理
我研究之后发现都玩不转
这里介绍一种无脑的方法
jsdom
直接放到代码顶端就有参数
参数虽然生成了,但是长度跟浏览器生成不一样,也不能用
怀疑是本地node环境检测
放到浏览器中运行下试试
浏览器跟本地一样都不能用,看来肯定是有别的操作
加密字符看起来像b64,拿去试试
果然解出来了,看起来只有payload是未知的,我们只要找到payload是怎么生成的,并还原就行了。
进入加密代码,没有找到任何有价值的东西,只找到后加密参数返回的地方
只找到这儿就先把所有输出打印一下,看看都有什么
打印没有任何有价值的东西,这里陷入了僵局,翻阅大佬文档,需要在这里挂个代理hook。
_ace_dcca5 = new Proxy(_ace_dcca5,{
get: function(target, prop) {
return target[prop];
// 返回属性的值
},
set: function(target, prop, value) {
// debugger; // 在这里设置断点或执行自定义逻辑
target[prop] = value;
// 设置属性的值
try {
if (value['_ace_4de55'] && value['_ace_4de55'].startsWith("XYW")) {
debugger ;
}
} catch (error) {
}
return true;
}
});
这里直接hook上了,分析看看。
一步步往上跟
跟到顶加密值是_ace_66这个参数传入的
hook一下这个值试试
这里有一个小细节,只有_ace_66的值为图上这种值时才能hook上,具体原理不知道,有知道的大佬可以告诉我。
hook到这儿,突然发现打印出来加密b64之前的参数了,我们找的也是这个参数,现在这个栈也没必要分析了。
又到这儿了,没法分析了
可以肯定的是_ace_dcca5这个列表中的对象在经过一系列操作后,得到payload的值
hook一下_ace_936更好,但是这个参数不是全局变量,没法hook,只能hook这个列表中的参数
_ace_dcca5 = new Proxy(_ace_dcca5,{
get: function(target, prop) {
return target[prop];
// 返回属性的值
},
set: function(target, prop, value) {
// debugger; // 在这里设置断点或执行自定义逻辑
target[prop] = value;
// 设置属性的值
try {
if (value['_ace_936']['stackOutput'] && value['_ace_936']['stackOutput'].startsWith("77d")) {
debugger ;
}
} catch (error) {
}
return true;
}
});
最后跟栈又到这儿了,直接全部打印一边看看都是什么吧
很长,可以存到本地分析
分析过程中发现,代码中的每一步都经过这儿,每一个字符的打印都是在这儿,所以payload参数内容一定就在生成之前上一步。
到这儿就找到了,对找到的参数b64加密看看是什么
直接打印不行,hook一下
这样加密参数就出来了,接下来只要分别找到x1,x2,x3,x4是什么就行了
其实一眼就能看出来,x3就是cookie中的a1,x4是时间戳,只要把x1,x2还原就行了
只要耐心点就能找到x1就是这个值的MD5加密
x2写死就行了
其实可以直接hook打印_ace_66的值更直观简单,但是正常思路是分析不到这个值的。
本地和浏览器不一样的值,在某个所有经过的地方捕获并修改值就行了
参考链接https://blog.csdn.net/qq_41866988/article/details/132058203