当前位置: 首页 > news >正文

某量JS逆向

https://chat.sensetime.com/wb/chat

目录

一、发起请求

二、观察发现只有入参 __data__ 进行了加密,返回是明文

三、 观察JS调用栈

四、从JS中搜索 __data__

五、使用XHR对Ajax请求进行断点

六、再次发起请求就会断点拦住请求

七、对XHR入口分析

八、逐个栈断点进行查看,还是没有发现可疑之处​编辑

九、 重新刷新页面,从JS中搜索__data__进行分析

十、对可疑之处全部打上断点 

十一 、溯源加密函数

十二、再次追踪 

十三、再再次追踪 

十四、整体链路追踪 

​十五、模拟请求


 

一、发起请求

二、观察发现只有入参 __data__ 进行了加密,返回是明文

三、 观察JS调用栈

四、从JS中搜索 __data__

发现一个像样的都没有

五、使用XHR对Ajax请求进行断点

六、再次发起请求就会断点拦住请求

 

七、对XHR入口分析

 八、逐个栈断点进行查看,还是没有发现可疑之处

九、 重新刷新页面,从JS中搜索__data__进行分析

重新请求断点并没有断住,往下看,发现类似的疑点有很多处,接下来我们只好把每一处都打上断点 

十、对可疑之处全部打上断点 

再次发起请求,断点到encrypt函数处。因为是反向追踪,每次必须重新请求,确保调用的数据链是正确的。

这里要记住这个入参的大致形式,咱们要追踪的正是这个入参,是怎么换算成了密文的。 

十一 、溯源加密函数

十二、再次追踪 

再次发起请求,断点到encrypt函数处。因为是反向追踪,每次必须重新请求,确保调用的数据链是正确的。

 

十三、再再次追踪 

再次发起请求,断点到encrypt函数处。因为是反向追踪,每次必须重新请求,确保调用的数据链是正确的。

断点放过第一次

断点放过第二次 

断点放过第三次  

断点放过第四次  .....

一直没有找到符合预期的参数链

此时我们发现,network栏一直有接口调用,每次都经过上面断点的函数,导致我即使一直放行,也都无法等到想要的参数链的到来。

十四、整体链路追踪 

此时我们只好重新发起请求,对刚刚每一步的追踪都打上断点,然后逐次放行下来,让参数链第一时间断点

 

 

 

 

function t(e) {var t = (e = btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function (e, t) {return String.fromCharCode(parseInt("0x" + t))})))).length / 2;e.length % 2 !== 0 && (t = e.length / 2 + 1);for (var n = "", r = 0; r < t; r++)n += e[r] + e[t + r];return n
}const e = {"action":"next","session_id":"c6bfb1e6-c772-4e3c-aabe-1ec3b70efe35","send_msg":[{"msg_type":"user_query","user_query":"你好呀"}],"channel":"chat-web","client_chan":"chatOnCom","parent_id":"3a696901-51e9-47d6-956d-f3b9d520f275","file_ids":[]}
let a = t(JSON.stringify(e));
console.log(a)

 十五、模拟请求

import jsonimport execjs
import requestsjs_code = """
function t(e) {var t = (e = btoa(encodeURIComponent(e).replace(/%([0-9A-F]{2})/g, (function (e, t) {return String.fromCharCode(parseInt("0x" + t))})))).length / 2;e.length % 2 !== 0 && (t = e.length / 2 + 1);for (var n = "", r = 0; r < t; r++)n += e[r] + e[t + r];return n
}function get__data__(message) {const e = {"action": "next","session_id": "","send_msg": [{"msg_type": "user_query", "user_query": message}],"channel": "chat-web","client_chan": "chatOnCom","parent_id": "0","file_ids": []}return t(JSON.stringify(e))
}
"""
# 编译JavaScript代码
ctx = execjs.compile(js_code)# 执行JavaScript代码并获取参数加密结果
result = ctx.call("get__data__", "你知道詹姆斯在NBA多少年了吗")url = "https://chat.sensetime.com/api/richmodal/v1.0.2/chat"payload = {"__data__": result}
headers = {'authorization': 'Bearer 你的TOKEN','debug': 'undefined','priority': 'u=1, i','system-type': 'web','version-code': '','x-request-id': 'eb9eeb23-6db5-439a-9b48-531d9de87b2c','Cookie': 'UM_distinctid=190e93d52b8520-0bcaa0440d727f-26001f51-1fa400-190e93d52b9a8f; CNZZDATA1281349177=866722293-1721900029-https%253A%252F%252Fgithub.com%252F%7C17219100029','User-Agent': 'Apifox/1.0.0 (https://apifox.com)','content-type': 'application/json;charset=UTF-8'
}response = requests.request("POST", url, headers=headers, data=json.dumps(payload))# 直接输出text中文乱码了
# print(response.text)
# 这里进行主动解码一下
print(response.content.decode('utf-8'))

相关文章:

  • 【时时三省】(C语言基础)循环语句while
  • 大模型算法面试题(十二)
  • scp 服务器复制命令
  • redis:清除缓存的最简单命令示例
  • 学习记录——day17 数据结构 队列 链式队列
  • C#中GridControl的数据源双向绑定
  • 双向门控循环神经网络(BiGRU)及其Python和MATLAB实现
  • Redis快速入门(一)
  • Spring Boot中如何实现全链路调用日志跟踪?
  • 2.axios(发送get和post请求)
  • git学习笔记(总结了常见命令与学习中遇到的问题和解决方法)
  • 算法:二维数组打印问题
  • HDU1032——The 3n + 1 problem,HDU1033——Edge,HDU1034——Candy Sharing Game
  • nginx的配置和使用
  • ubuntu20.04使用systemd服务设置python程序开机自启动
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • emacs初体验
  • hadoop集群管理系统搭建规划说明
  • JAVA_NIO系列——Channel和Buffer详解
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Mithril.js 入门介绍
  • VUE es6技巧写法(持续更新中~~~)
  • 对超线程几个不同角度的解释
  • 多线程 start 和 run 方法到底有什么区别?
  • 搞机器学习要哪些技能
  • 设计模式 开闭原则
  • 深度学习在携程攻略社区的应用
  • 限制Java线程池运行线程以及等待线程数量的策略
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (2)STL算法之元素计数
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (实战篇)如何缓存数据
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET 材料检测系统崩溃分析
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @ModelAttribute注解使用
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • []Telit UC864E 拨号上网
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [AAuto]给百宝箱增加娱乐功能
  • [cocos2d-x]关于CC_CALLBACK