斗鱼password加密参数调试生成案例
斗鱼登陆输入账号密码,拖动滑块后会向登陆接口发起请求。
通过抓包发现请求体 Formdata 中的 password 进行了加密。
本案例演示如何通过控制台调试找到加密js方法。
最后使用python来模拟生成,文末附有代码。
斗鱼password加密参数js调试案例
- 1.确定接口
- 2.断点调试
- 3.模拟生成
- 4.Python调用
1.确定接口
2.断点调试
点击控制台的 initiator ,可查看当前的请求是哪一行触发。
然后点send,进入js文件
点击左下角 {} ,格式化文件
然后点击左侧行数,打上断点
再次请求登陆
等待断点拦截
然后看右侧的 call stack 函数调用栈,一层一层往上找。
在_enter时 查看到了 o.md5_m 。
没看到_enter时 刷新再来一遍。
“52c69e3a57331…” 为加密后的值
然后再看 o.md5_m 怎么来的
往上一行可以看到 o.md5_m = CryptoJS.MD5(k).toString()
鼠标移上去之后点击匿名函数
然后可找到 CryptoJS ,CryptoJS是支持加密的JavaScript库。
你也可以接着断点查看具体的加密过程。
3.模拟生成
把这段js复制下来。写入html,然后在控制台测试。
这个时候其实可以写一段代码直接通过浏览器的驱动来生成了。
4.Python调用
调用CryptoJS的md5模块时,加密的结果是一个数组,而不是我们常见的MD5值。
在 js中可以使用 toSting来直接转换成字符串。
我们用python实现的话,把这段函数拿出来用就行了
整体调用代码如下:
import execjsscript = '''
var CryptoJS = CryptoJS || function(a, b) {var c = {}, d = c.lib = {}, e = function() {}, f = d.Base = {extend: function(a) {e.prototype = this;var b = new e;return a && b.mixIn(a),b.hasOwnProperty("init") || (b.init = function() {b.$super.init.apply(this, arguments)}),b.init.prototype = b,b.$super = this,b},create: function() {var a = this.extend();return a.init.apply(a, arguments),a},init: function() {},mixIn: function(a) {for (var b in a)a.hasOwnProperty(b) && (this[b] = a[b]);a.hasOwnProperty("toString") && (this.toString = a.toString)},clone: function() {return this.init.prototype.extend(this)}}, g = d.WordArray = f.extend({init: function(a, c) {a = this.words = a || [],this.sigBytes = c != b ? c : 4 * a.length},toString: function(a) {return (a || i).stringify(this)},concat: function(a) {var b = this.words, c = a.words, d = this.sigBytes;if (a = a.sigBytes,this.clamp(),d % 4)for (var e = 0; e < a; e++)b[d + e >>> 2] |= (c[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((d + e) % 4);else if (65535 < c.length)for (e = 0; e < a; e += 4)b[d + e >>> 2] = c[e >>> 2];elseb.push.apply(b, c);return this.sigBytes += a,this},clamp: function() {var b = this.words, c = this.sigBytes;b[c >>> 2] &= 4294967295 << 32 - 8 * (c % 4),b.length = a.ceil(c / 4)},clone: function() {var a = f.clone.call(this);return a.words = this.words.slice(0),a},random: function(b) {for (var c = [], d = 0; d < b; d += 4)c.push(4294967296 * a.random() | 0);return new g.init(c,b)}}), h = c.enc = {}, i = h.Hex = {stringify: function(a) {var b = a.words;a = a.sigBytes;for (var c = [], d = 0; d < a; d++) {var e = b[d >>> 2] >>> 24 - 8 * (d % 4) & 255;c.push((e >>> 4).toString(16)),c.push((15 & e).toString(16))}return c.join("")},parse: function(a) {for (var b = a.length, c = [], d = 0; d < b; d += 2)c[d >>> 3] |= parseInt(a.substr(d, 2), 16) << 24 - 4 * (d % 8);return new g.init(c,b / 2)}}, j = h.Latin1 = {stringify: function(a) {var b = a.words;a = a.sigBytes;for (var c = [], d = 0; d < a; d++)c.push(String.fromCharCode(b[d >>> 2] >>> 24 - 8 * (d % 4) & 255));return c.join("")},parse: function(a) {for (var b = a.length, c = [], d = 0; d < b; d++)c[d >>> 2] |= (255 & a.charCodeAt(d)) << 24 - 8 * (d % 4);return new g.init(c,b)}}, k = h.Utf8 = {stringify: function(a) {try {return decodeURIComponent(escape(j.stringify(a)))} catch (b) {throw Error("Malformed UTF-8 data")}},parse: function(a) {return j.parse(unescape(encodeURIComponent(a)))}}, l = d.BufferedBlockAlgorithm = f.extend({reset: function() {this._data = new g.init,this._nDataBytes = 0},_append: function(a) {"string" == typeof a && (a = k.parse(a)),this._data.concat(a),this._nDataBytes += a.sigBytes},_process: function(b) {var c = this._data, d = c.words, e = c.sigBytes, f = this.blockSize, h = e / (4 * f), h = b ? a.ceil(h) : a.max((0 | h) - this._minBufferSize, 0);if (b = h * f,e = a.min(4 * b, e),b) {for (var i = 0; i < b; i += f)this._doProcessBlock(d, i);i = d.splice(0, b),c.sigBytes -= e}return new g.init(i,e)},clone: function() {var a = f.clone.call(this);return a._data = this._data.clone(),a},_minBufferSize: 0});d.Hasher = l.extend({cfg: f.extend(),init: function(a) {this.cfg = this.cfg.extend(a),this.reset()},reset: function() {l.reset.call(this),this._doReset()},update: function(a) {return this._append(a),this._process(),this},finalize: function(a) {return a && this._append(a),this._doFinalize()},blockSize: 16,_createHelper: function(a) {return function(b, c) {return new a.init(c).finalize(b)}},_createHmacHelper: function(a) {return function(b, c) {return new m.HMAC.init(a,c).finalize(b)}}});var m = c.algo = {};return c
}(Math);
!function(a) {function b(a, b, c, d, e, f, g) {return a = a + (b & c | ~b & d) + e + g,(a << f | a >>> 32 - f) + b}function c(a, b, c, d, e, f, g) {return a = a + (b & d | c & ~d) + e + g,(a << f | a >>> 32 - f) + b}function d(a, b, c, d, e, f, g) {return a = a + (b ^ c ^ d) + e + g,(a << f | a >>> 32 - f) + b}function e(a, b, c, d, e, f, g) {return a = a + (c ^ (b | ~d)) + e + g,(a << f | a >>> 32 - f) + b}for (var f = CryptoJS, g = f.lib, h = g.WordArray, i = g.Hasher, g = f.algo, j = [], k = 0; 64 > k; k++)j[k] = 4294967296 * a.abs(a.sin(k + 1)) | 0;g = g.MD5 = i.extend({_doReset: function() {this._hash = new h.init([1732584193, 4023233417, 2562383102, 271733878])},_doProcessBlock: function(a, f) {for (var g = 0; 16 > g; g++) {var h = f + g, i = a[h];a[h] = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8)}var g = this._hash.words, h = a[f + 0], i = a[f + 1], k = a[f + 2], l = a[f + 3], m = a[f + 4], n = a[f + 5], o = a[f + 6], p = a[f + 7], q = a[f + 8], r = a[f + 9], s = a[f + 10], t = a[f + 11], u = a[f + 12], v = a[f + 13], w = a[f + 14], x = a[f + 15], y = g[0], z = g[1], A = g[2], B = g[3], y = b(y, z, A, B, h, 7, j[0]), B = b(B, y, z, A, i, 12, j[1]), A = b(A, B, y, z, k, 17, j[2]), z = b(z, A, B, y, l, 22, j[3]), y = b(y, z, A, B, m, 7, j[4]), B = b(B, y, z, A, n, 12, j[5]), A = b(A, B, y, z, o, 17, j[6]), z = b(z, A, B, y, p, 22, j[7]), y = b(y, z, A, B, q, 7, j[8]), B = b(B, y, z, A, r, 12, j[9]), A = b(A, B, y, z, s, 17, j[10]), z = b(z, A, B, y, t, 22, j[11]), y = b(y, z, A, B, u, 7, j[12]), B = b(B, y, z, A, v, 12, j[13]), A = b(A, B, y, z, w, 17, j[14]), z = b(z, A, B, y, x, 22, j[15]), y = c(y, z, A, B, i, 5, j[16]), B = c(B, y, z, A, o, 9, j[17]), A = c(A, B, y, z, t, 14, j[18]), z = c(z, A, B, y, h, 20, j[19]), y = c(y, z, A, B, n, 5, j[20]), B = c(B, y, z, A, s, 9, j[21]), A = c(A, B, y, z, x, 14, j[22]), z = c(z, A, B, y, m, 20, j[23]), y = c(y, z, A, B, r, 5, j[24]), B = c(B, y, z, A, w, 9, j[25]), A = c(A, B, y, z, l, 14, j[26]), z = c(z, A, B, y, q, 20, j[27]), y = c(y, z, A, B, v, 5, j[28]), B = c(B, y, z, A, k, 9, j[29]), A = c(A, B, y, z, p, 14, j[30]), z = c(z, A, B, y, u, 20, j[31]), y = d(y, z, A, B, n, 4, j[32]), B = d(B, y, z, A, q, 11, j[33]), A = d(A, B, y, z, t, 16, j[34]), z = d(z, A, B, y, w, 23, j[35]), y = d(y, z, A, B, i, 4, j[36]), B = d(B, y, z, A, m, 11, j[37]), A = d(A, B, y, z, p, 16, j[38]), z = d(z, A, B, y, s, 23, j[39]), y = d(y, z, A, B, v, 4, j[40]), B = d(B, y, z, A, h, 11, j[41]), A = d(A, B, y, z, l, 16, j[42]), z = d(z, A, B, y, o, 23, j[43]), y = d(y, z, A, B, r, 4, j[44]), B = d(B, y, z, A, u, 11, j[45]), A = d(A, B, y, z, x, 16, j[46]), z = d(z, A, B, y, k, 23, j[47]), y = e(y, z, A, B, h, 6, j[48]), B = e(B, y, z, A, p, 10, j[49]), A = e(A, B, y, z, w, 15, j[50]), z = e(z, A, B, y, n, 21, j[51]), y = e(y, z, A, B, u, 6, j[52]), B = e(B, y, z, A, l, 10, j[53]), A = e(A, B, y, z, s, 15, j[54]), z = e(z, A, B, y, i, 21, j[55]), y = e(y, z, A, B, q, 6, j[56]), B = e(B, y, z, A, x, 10, j[57]), A = e(A, B, y, z, o, 15, j[58]), z = e(z, A, B, y, v, 21, j[59]), y = e(y, z, A, B, m, 6, j[60]), B = e(B, y, z, A, t, 10, j[61]), A = e(A, B, y, z, k, 15, j[62]), z = e(z, A, B, y, r, 21, j[63]);g[0] = g[0] + y | 0,g[1] = g[1] + z | 0,g[2] = g[2] + A | 0,g[3] = g[3] + B | 0},_doFinalize: function() {var b = this._data, c = b.words, d = 8 * this._nDataBytes, e = 8 * b.sigBytes;c[e >>> 5] |= 128 << 24 - e % 32;var f = a.floor(d / 4294967296);for (c[(e + 64 >>> 9 << 4) + 15] = 16711935 & (f << 8 | f >>> 24) | 4278255360 & (f << 24 | f >>> 8),c[(e + 64 >>> 9 << 4) + 14] = 16711935 & (d << 8 | d >>> 24) | 4278255360 & (d << 24 | d >>> 8),b.sigBytes = 4 * (c.length + 1),this._process(),b = this._hash,c = b.words,d = 0; 4 > d; d++)e = c[d],c[d] = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8);return b},clone: function() {var a = i.clone.call(this);return a._hash = this._hash.clone(),a}}),f.MD5 = i._createHelper(g),f.HmacMD5 = i._createHmacHelper(g)
}(Math),
function() {var a = CryptoJS, b = a.enc.Utf8;a.algo.HMAC = a.lib.Base.extend({init: function(a, c) {a = this._hasher = new a.init,"string" == typeof c && (c = b.parse(c));var d = a.blockSize, e = 4 * d;c.sigBytes > e && (c = a.finalize(c)),c.clamp();for (var f = this._oKey = c.clone(), g = this._iKey = c.clone(), h = f.words, i = g.words, j = 0; j < d; j++)h[j] ^= 1549556828,i[j] ^= 909522486;f.sigBytes = g.sigBytes = e,this.reset()},reset: function() {var a = this._hasher;a.reset(),a.update(this._iKey)},update: function(a) {return this._hasher.update(a),this},finalize: function(a) {var b = this._hasher;return a = b.finalize(a),b.reset(),b.finalize(this._oKey.clone().concat(a))}})
}();'''
stringify='''
function(a) {var b = a.words;a = a.sigBytes;for (var c = [], d = 0; d < a; d++) {var e = b[d >>> 2] >>> 24 - 8 * (d % 4) & 255;c.push((e >>> 4).toString(16)),c.push((15 & e).toString(16))}return c.join("")}
'''
default = execjs.compile(script)sign = default.call("CryptoJS.MD5",'999999')sign3 = default.call(stringify,sign)
print(sign3)
打印结果和浏览器中调试结果相同。
本篇案例到此为止了。有兴趣的同学可以加群一起学习
斗鱼password加密参数调试生成案例相关推荐
- 【某OTA网站加密参数还原生成】
文章目录 前言 一.接口加密参数怎么生成? 二.JS代码 三. 环境 前言 最近看了下某网站的接口数据,发现和以前不一样了,于是花了会时间看了下 一.接口加密参数怎么生成? 看了下接口 会发现有个te ...
- 当你写爬虫遇到APP的请求有加密参数时该怎么办?【初级篇-秒杀模式】
文章转载自公众号小周码字 看完了初级篇的常规模式之后,你是不是发现了一个很严重的问题:如果每个APP都需要这么反编译看代码仿写的话,那么当想要大批量爬不同的APP的时候,光是找加密参数的生成部分就已经 ...
- 安卓逆向小案例——阿里系某电影票务APP加密参数还原-Unidbg篇
安卓逆向小案例--阿里系某电影票务APP加密参数还原-Unidbg篇 一.前期准备 使用unidbg还原参数时,首先需要找到指定的native方法和对应的so文件.而锁定生成加密参数的native方法 ...
- 案例分享:Qt激光加工焊接设备信息化软件研发(西门子PLC,mysql数据库,用户权限控制,界面设计,参数定制,播放器,二维图,期限控制,参数调试等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127669684 长期持续项目技术分享,有专业Qt需求请 ...
- 案例分享:Qt工程机械真空激光焊接系统软件产品定制(西门子PLC,mysql数据库,用户权限控制,界面配置,参数定制,播放器,二维图标,rgv小车,期限控制,参数调试等)
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/127214512 长期持续项目技术分享,有需求请回博客首 ...
- JS逆向之美团网模拟登录h5Fingerprint、password(RSA)加密参数解析
文章目录 前言 一.页面分析 二.加密解析 1.password解析 加密定位 参数解密 2.h5Fingerprint解析 加密定位 参数解密 3.python调用模拟请求 总结 前言 最近和几位大 ...
- 反反爬之破解同程旅游加密参数!你学会了吗?
一.前言简介 在现在各个网站使用的反爬措施中,使用 JavaScript 加密算是很常用的了,通常会使用 JavaScript 加密某个参数,例如 token 或者 sign.在这次的例子中,就采取了 ...
- 轻JS逆向分析“攒经验”项目之某交易所Sign加密参数逆向分析
最近忙着在搞大数据相关的东西,没什么太多时间去研究复杂的JS,所以给大家来几个练手的网站"攒攒经验"吧!这次出的系列是<轻JS逆向分析"攒经验"项目> ...
- js取字符串后四位_JS逆向 | 某验滑块加密参数逆向分析
声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5od ...
- Python3爬虫反反爬之搞定同程旅游加密参数 antitoken
一.前言简介 在现在各个网站使用的反爬措施中,使用 JavaScript 加密算是很常用的了,通常会使用 JavaScript 加密某个参数,例如 token 或者 sign.在这次的例子中,就采取了 ...
最新文章
- 电脑总有安装计算机更新,为什么我们的电脑总会莫名的安装垃圾软件,看完吓一跳,欢迎关注...
- chatscript_如何使用ChatScript构建您的第一个聊天机器人
- 学了那么多年设计模式依然不会用!那可真蠢!
- [转] GMT、UTC与24时区 等时间概念
- python编程难吗-都说python很简单 真的很好学么?
- 云南大学网络课程作业计算机,云南大学842计算机程序设计考研复习经验
- ES6箭头函数(Arrow Functions)
- C语言试题四十二之假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:将字符串中的前导*号全部移到字符串的尾部。
- mysql主从配置访问_Mysql主从配置,实现读写分离
- 扫雷打开的初始区域递归_Python:游戏:写一个和 XP 上一模一样的“扫雷”!
- Atom飞行手册翻译: 2.14 小结
- DataGridView
- heap python_python topN max heap,使用heapq还是自实现?
- python打印数组
- Tibco Designer -- 构建EAR文件
- 用MATLAB沉降观测实验,观测沉降论文,关于建筑物沉降观测数据处理相关参考文献资料-免费论文范文...
- vscode同时编辑多处文字 批量替换编辑内容
- 分享使用PHP开发留言板
- OMV安装可道云kodexplorer网盘
- 中断向量,中断向量表 ,中断服务函数
热门文章
- android扫描局域网中的所有ip,NMAP扫描局域网内在线IP
- 希尔伯特空间/再生核希尔伯特空间
- Ubuntu下.tar.bz2和.tar.gz文件的解压命令
- Gradle下载的地址
- 可靠性试验与环境试验概述
- Unity3D VS UE4
- Android周日历可滑动可选择日期
- Android Studio问题解决:Location specified by ndk.dir () did not contain a valid NDK and so couldn‘t sati
- 邮箱个性签名html模板,邮箱个人签名 邮箱个人签名模板
- J2EE框架技术(SpringMVC) 知识点笔记(2)