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

JS逆向 - 狗dong参数Log及joyytokem(补环境)

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向狗dong log参数及joyytokem

URL:aHR0cHM6Ly9wcm8ubS5qZC5jb20vbWFsbC9hY3RpdmUvNFhyQXpkV1lVRml4elNzRkw5V1VtMm02WWZ0Ny9pbmRleC5odG1sP2JhYmVsQ2hhbm5lbD10dHQyJnV0bV90ZXJtPUNvcHlVUkxfc2hhcmVpZDZkNzdmYmEyM2JhZjUzZjFhMGUzZjE3NzAwOGM1MDlhZmYyMWEzNjgxNzQ3ODc3OTg2NjgwNl9ub25lX25vbmUmdXRtX3VzZXI9cGx1c21lbWJlciZ1dG1fc291cmNlPWlvc2FwcCZ1dG1fY2FtcGFpZ249dF8zMzUxMzk3NzQmdXRtX21lZGl1bT1hcHBzaGFyZSZfdHM9MTc0Nzg3Nzk4MjYyOSZhZF9vZD1zaGFyZSZneGQ9Um5Bb3hUTmViMktMbXBvV19kVWhXTTNnUEQ2Vzd6UXVBTWFudDBJbGg5eDFJNWo5T3c0Sk5YTWZ3Yi1BV3pVJmd4PVJuQW9tVE0yYnpmY21aa2RxSVVqWGc2WlVaQWVrMGs=

在这里插入图片描述

整体架构流程

提示:开始分析参数

1、这里直接观察window.smashUtils.get_risk_result,也就是,咱们加载进来之后,可以直接搜索get_risk_result,然后断点

在这里插入图片描述

2、进行观察它怎么定义给window的,往上翻动发现是一个webpack

在这里插入图片描述

好家伙,这些咱们只需要导出改方法定义的那个位置,重新刷新,发现它就是单个文件,而且已经自己加载好了

在这里插入图片描述
3、继续分析它是怎么加密的吧,观察smashUtils发现
在这里插入图片描述

在加密之前它还需要进行init初始化,所以得在init方法那重新刷新断点
在这里插入图片描述

window.smashUtils.init({"appid": "xxx","sceneid": "xxx","uid": ""
});

这里看一下appid怎么来的,直接全局搜索,发现是当前html返回的

在这里插入图片描述

4、最后看一下咋加密的,点击领卷触发加密

在这里插入图片描述

这里我们可以看到n = 'coupon_receive’固定r则是一个s方法生成

在这里插入图片描述

打印可以看到r就等于window.smashUtils.getRandom(8)

5、最终处理

window.smashUtils.init({appid: "xxx",sceneid: "xxx",uid: undefined
});
randomc = window.smashUtils.getRandom(8);
log_value = [window.smashUtils.get_risk_result({id: "coupon_receive",data: {random: randomc}
}), randomc]

技术名词解释

提示:补环境的检测

代理-------自吐环境

function setProxyArr(proxyObjArr) {for (let i = 0; i < proxyObjArr.length; i++) {const handler = `{get: function(target, property, receiver) {if(property === 'window'){return target[property];}dtavm.log("方法:", "get  ", "对象:", "${proxyObjArr[i]}", "  属性:", property, "  属性类型:", typeof property, ", 属性值:", target[property], ", 属性值类型:", typeof target[property]);return target[property];},set: function(target, property, value, receiver) {dtavm.log("方法:", "set  ", "对象:", "${proxyObjArr[i]}", "  属性:", property, "  属性类型:", typeof property, ", 属性值:", value, ", 属性值类型:", typeof target[property]);return Reflect.set(...arguments);}}`;eval(`try {${proxyObjArr[i]};${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});} catch (e) {${proxyObjArr[i]} = {};${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});}`);}
}
  1. 将node中有,浏览器没有的可能会检测的删除掉
require_ = require;
process_ = process;
delete global;
// delete Buffer;
delete process;
delete require;
delete module;
delete exports;
delete __filename;
delete __dirname;
// delete setImmediate;
// delete clearImmediate;
  1. 挂代理时一定得把window,globalThis分开挂,不然有些环境吐不出来,如:setProxyArr([‘window’,‘globalThis’]);会发现很多环境
    提示:createTagProto我自己写的一个创建函数的方法
createTagProto('CSSRuleList');
createTagProto('CSSStyleDeclaration');
createTagProto('DOMRectList');
createTagProto('DOMStringList');
createTagProto('DataTransferItemList');
createTagProto('FileList');
createTagProto('HTMLCollection');
createTagProto('HTMLFormElement');
createTagProto('HTMLSelectElement');
createTagProto('MediaList');
createTagProto('MimeTypeArray');
createTagProto('NamedNodeMap');
createTagProto('NodeList');
createTagProto('SVGLengthList');
createTagProto('SVGNumberList');
createTagProto('SVGPointList');
createTagProto('SVGStringList');
createTagProto('SVGTransformList');
createTagProto('SourceBufferList');
createTagProto('StyleSheetList');
createTagProto('TextTrackCueList');
createTagProto('TextTrackList');
createTagProto('TouchList');
createTagProto('DOMTokenList');
createTagProto('HTMLAllCollection');
createTagProto('Plugin');
createTagProto('PluginArray');
createTagProto('PromiseRejectionEvent');
createTagProto('Storage');
  1. Navigator.prototype.getBattery电脑电池管理信息
// 创建电池管理器对象原型 
const BatteryManager = {level: 1,charging: true,chargingTime: 0,dischargingTime: Infinity,onchargingchange: null,onlevelchange: null,toString: function toString() {return `BatteryManager {charging: ${this.charging}, level: ${this.level}, chargingTime: ${this.chargingTime}, dischargingTime: ${this.dischargingTime} }`}
}
Navigator.prototype.getBattery = function getBattery() {dtavm.log("getBattery", arguments);return Promise.resolve({__proto__: BatteryManager,// 动态参数配置(示例值)level: 0.99,charging: true,dischargingTime: 'Infinity' // 2小时放电时间 })
};
  1. dom检测removeEventListener、createElement(checkDevTools)、createTextNode、querySelectorAll(取标签的长度)
  2. process这里需要注意哈,不是没有,一般浏览器没有这个的
process = {env: {NODE_ENV: "production"}
}
  1. 然后就是重点检测Error,懂的都懂,有俩处,会取值的
    在这里插入图片描述
  2. 加密的时候会重新设置cookie,发送xhr得到cookie值joyytokem,然后该值会参与log参数的计算,所以一定得有
  3. 其他的自己慢慢补吧

技术细节

提示:结果
在这里插入图片描述

小结

提示:学习交流主页,成品已发星球

http://www.xdnf.cn/news/8596.html

相关文章:

  • Groovy:Java 的简洁版
  • python web 开发-Flask-Login使用详解
  • 构建安全AI风险识别大模型:CoT、训练集与Agent vs. Fine-Tuning对比
  • 每日leetcode(昨天赶飞机没做,今天补)
  • 深入理解 Redis 哨兵模式
  • H3C-W2000-G2【透明反代理】
  • Nacos适配GaussDB超详细部署流程
  • 【数据结构初阶】顺序表专题
  • 在Rockchip平台上利用FFmpeg实现硬件解码与缩放并导出Python接口
  • Selenium 测试框架 - Python
  • SpringCloud实战:使用Sentinel构建可靠的微服务熔断机制
  • 从 0 开始部署 Archivematica (windows环境)
  • RabbitMQ 概述
  • 【C/C++】多线程开发:wait、sleep、yield全解析
  • 国标GB28181设备管理软件EasyGBS打造厨房全方位实时监控解决方案
  • CC工具箱使用指南:【平行线两端闭合】
  • kali的简化安装
  • 水利水电安全员考试的案例分析题一般涉及哪些方面的知识?
  • 精明的猎人VS精明的狐狸
  • Python之os模块(文件和目录操作、进程管理、环境变量访问)
  • Firebase 之 归因
  • 跨域问题及其CORS解决方案:gin框架中配置跨域
  • ch11 课堂参考代码 及 题目参考思路
  • Spring Cloud实战:OpenFeign远程调用与服务治理
  • Margin loss
  • C语言数据结构-单链表
  • 解锁内心的冲突:神经症冲突的理解与解决之道
  • 半导体B2B分销中台有哪些应用场景
  • 安装NBU软件及配置方法
  • 谈谈对dubbo的广播机制的理解