淘宝的sign参数js逆向
前言:现在网站都有很强的反爬机制,都是非常常见的是用js前端加密参数,所以不得不去分析和逆向js混淆后的代码
一.
打开天猫或淘宝,shift+ctrl+F12全局搜索sign参数.
这里发现很多地方有出现了sign,必须一个一个的去看,发现前面的文件的assign,这个是我们所不用的,继续向下翻找,找到我们想要的了。
发现我们要找的js是内联在前端页面中的,点击进去,看看是啥操作先。
二.点击进入,打断点,再调试
这样看js代码不现实,包括我们在F12中,需要分析dom节点时,很多时候只要把对应的Elements页面拉开一点,就会使得页面舒服很多,js这里要点击这里
舒服了---------------------
同时找到了sign参数,同时个人觉得逆向与正向不同的在于,正向需要写代码然后得出结果,而逆向则从结果,反着去看代码,所以抱着这样的思想开始分析
开始找m
这里我们基本上就知道,我们需要什么了:
1.r.token
2.n
3.o
4.s.data
5.函数Y
开始逐一的寻找信息:
1.n:
说明n是时间戳,但是js中的new Date.getTime()方法,返回的是毫秒数的时间戳,而python中time.time(),返回的是以秒为单位的时间戳,当时一直调试,发现位数一直对不上,我也很郁闷,特意去查了这两个的差别,才解决了这个问题
2.o
这句其实是一个js语法里面的||的语法,我这里简要概述一下这个语法,||是或语句,一般格式都是a||b,当a为true是,直接返回a的值,如果为假,返回b的值。那么这里可以看到o=s.appkey。那么这个s是什么呢。
发现是参数对象,所以那个appkey是一个定值。
3.s.data
同理,是参数对象的data字段。
4.r.token
这里没找到,有关于r.token的信息,那我们来打一下断点。刷新一下,这里发现并没有断下,这种情况其实这几天我都有遇到,在看完别人的博客,我才意识到很有可能是js代码进行了判定,如果参数已经生成了,是不会再执行一遍重复的生成参数的代码的,那么我们把缓存一清,让它重新生成,清完缓存,再刷新一下。这里是真的 坑。上面打断点停住了,这两天就是停不下来。。。只能口述了
就是将停下来的位置,将鼠标移上去。后面会显示token的值,后再全局搜索,发现是m_h5_tk的值
5.Y函数同4点一样,我是打断点找的,不过也可以直接搜索,函数就在一个js里面
这里有点关键的是,加密的函数很复杂,这里有两种方式,一种是将加密的算法逆向复现出来,另一种是直接调用,第一种反正我现阶段做不到,智能直接调用了,因为我用的是python,所以百度了好几个python是否能运行js的代码呢?
发现有好几个库,python。
所以命令行安装了个js2py这个库,这个库不需要再安装node的环境,比较香,可惜的是,无法在源码上写很长的js代码,否则会报错,一般是用一个js文件来保存,之后将其保存到变量里面,完美解决
下面是那个js文件的内容。
function Y(aV) {
function aU(d, c) {
return d << c | d >>> 32 - c
}
function aT(i, h) {
var n, m, l, k, j;
return l = 2147483648 & i,
k = 2147483648 & h,
n = 1073741824 & i,
m = 1073741824 & h,
j = (1073741823 & i) + (1073741823 & h),
n & m ? 2147483648 ^ j ^ l ^ k : n | m ? 1073741824 & j ? 3221225472 ^ j ^ l ^ k : 1073741824 ^ j ^ l ^ k : j ^ l ^ k
}
function aS(e, d, f) {
return e & d | ~e & f
}
function aR(e, d, f) {
return e & f | d & ~f
}
function aQ(e, d, f) {
return e ^ d ^ f
}
function aP(e, d, f) {
return d ^ (e | ~f)
}
function aO(b, n, m, l, k, d, c) {
return b = aT(b, aT(aT(aS(n, m, l), k), c)),
aT(aU(b, d), n)
}
function aN(b, n, m, l, k, e, c) {
return b = aT(b, aT(aT(aR(n, m, l), k), c)),
aT(aU(b, e), n)
}
function aM(b, n, m, l, k, f, c) {
return b = aT(b, aT(aT(aQ(n, m, l), k), c)),
aT(aU(b, f), n)
}
function aL(b, n, m, l, k, g, c) {
return b = aT(b, aT(aT(aP(n, m, l), k), c)),
aT(aU(b, g), n)
}
function aK(r) {
for (var q, p = r.length, o = p + 8, n = (o - o % 64) / 64, m = 16 * (n + 1), l = new Array(m - 1), k = 0, j = 0; p > j; ) {
q = (j - j % 4) / 4,
k = j % 4 * 8,
l[q] = l[q] | r.charCodeAt(j) << k,
j++
}
return q = (j - j % 4) / 4,
k = j % 4 * 8,
l[q] = l[q] | 128 << k,
l[m - 2] = p << 3,
l[m - 1] = p >>> 29,
l
}
function aJ(g) {
var f, j, i = "", h = "";
for (j = 0; 3 >= j; j++) {
f = g >>> 8 * j & 255,
h = "0" + f.toString(16),
i += h.substr(h.length - 2, 2)
}
return i
}
function aI(f) {
f = f.replace(/\r\n/g, "\n");
for (var e = "", h = 0; h < f.length; h++) {
var g = f.charCodeAt(h);
128 > g ? e += String.fromCharCode(g) : g > 127 && 2048 > g ? (e += String.fromCharCode(g >> 6 | 192),
e += String.fromCharCode(63 & g | 128)) : (e += String.fromCharCode(g >> 12 | 224),
e += String.fromCharCode(g >> 6 & 63 | 128),
e += String.fromCharCode(63 & g | 128))
}
return e
}
var aH, aG, aF, aE, aD, aC, aB, aA, az, ay = [], ax = 7, aw = 12, av = 17, au = 22, at = 5, ar = 9, aq = 14, ap = 20, ao = 4, an = 11, am = 16, al = 23, ak = 6, aj = 10, ai = 15, ah = 21;
for (aV = aI(aV),
ay = aK(aV),
aC = 1732584193,
aB = 4023233417,
aA = 2562383102,
az = 271733878,
aH = 0; aH < ay.length; aH += 16) {
aG = aC,
aF = aB,
aE = aA,
aD = az,
aC = aO(aC, aB, aA, az, ay[aH + 0], ax, 3614090360),
az = aO(az, aC, aB, aA, ay[aH + 1], aw, 3905402710),
aA = aO(aA, az, aC, aB, ay[aH + 2], av, 606105819),
aB = aO(aB, aA, az, aC, ay[aH + 3], au, 3250441966),
aC = aO(aC, aB, aA, az, ay[aH + 4], ax, 4118548399),
az = aO(az, aC, aB, aA, ay[aH + 5], aw, 1200080426),
aA = aO(aA, az, aC, aB, ay[aH + 6], av, 2821735955),
aB = aO(aB, aA, az, aC, ay[aH + 7], au, 4249261313),
aC = aO(aC, aB, aA, az, ay[aH + 8], ax, 1770035416),
az = aO(az, aC, aB, aA, ay[aH + 9], aw, 2336552879),
aA = aO(aA, az, aC, aB, ay[aH + 10], av, 4294925233),
aB = aO(aB, aA, az, aC, ay[aH + 11], au, 2304563134),
aC = aO(aC, aB, aA, az, ay[aH + 12], ax, 1804603682),
az = aO(az, aC, aB, aA, ay[aH + 13], aw, 4254626195),
aA = aO(aA, az, aC, aB, ay[aH + 14], av, 2792965006),
aB = aO(aB, aA, az, aC, ay[aH + 15], au, 1236535329),
aC = aN(aC, aB, aA, az, ay[aH + 1], at, 4129170786),
az = aN(az, aC, aB, aA, ay[aH + 6], ar, 3225465664),
aA = aN(aA, az, aC, aB, ay[aH + 11], aq, 643717713),
aB = aN(aB, aA, az, aC, ay[aH + 0], ap, 3921069994),
aC = aN(aC, aB, aA, az, ay[aH + 5], at, 3593408605),
az = aN(az, aC, aB, aA, ay[aH + 10], ar, 38016083),
aA = aN(aA, az, aC, aB, ay[aH + 15], aq, 3634488961),
aB = aN(aB, aA, az, aC, ay[aH + 4], ap, 3889429448),
aC = aN(aC, aB, aA, az, ay[aH + 9], at, 568446438),
az = aN(az, aC, aB, aA, ay[aH + 14], ar, 3275163606),
aA = aN(aA, az, aC, aB, ay[aH + 3], aq, 4107603335),
aB = aN(aB, aA, az, aC, ay[aH + 8], ap, 1163531501),
aC = aN(aC, aB, aA, az, ay[aH + 13], at, 2850285829),
az = aN(az, aC, aB, aA, ay[aH + 2], ar, 4243563512),
aA = aN(aA, az, aC, aB, ay[aH + 7], aq, 1735328473),
aB = aN(aB, aA, az, aC, ay[aH + 12], ap, 2368359562),
aC = aM(aC, aB, aA, az, ay[aH + 5], ao, 4294588738),
az = aM(az, aC, aB, aA, ay[aH + 8], an, 2272392833),
aA = aM(aA, az, aC, aB, ay[aH + 11], am, 1839030562),
aB = aM(aB, aA, az, aC, ay[aH + 14], al, 4259657740),
aC = aM(aC, aB, aA, az, ay[aH + 1], ao, 2763975236),
az = aM(az, aC, aB, aA, ay[aH + 4], an, 1272893353),
aA = aM(aA, az, aC, aB, ay[aH + 7], am, 4139469664),
aB = aM(aB, aA, az, aC, ay[aH + 10], al, 3200236656),
aC = aM(aC, aB, aA, az, ay[aH + 13], ao, 681279174),
az = aM(az, aC, aB, aA, ay[aH + 0], an, 3936430074),
aA = aM(aA, az, aC, aB, ay[aH + 3], am, 3572445317),
aB = aM(aB, aA, az, aC, ay[aH + 6], al, 76029189),
aC = aM(aC, aB, aA, az, ay[aH + 9], ao, 3654602809),
az = aM(az, aC, aB, aA, ay[aH + 12], an, 3873151461),
aA = aM(aA, az, aC, aB, ay[aH + 15], am, 530742520),
aB = aM(aB, aA, az, aC, ay[aH + 2], al, 3299628645),
aC = aL(aC, aB, aA, az, ay[aH + 0], ak, 4096336452),
az = aL(az, aC, aB, aA, ay[aH + 7], aj, 1126891415),
aA = aL(aA, az, aC, aB, ay[aH + 14], ai, 2878612391),
aB = aL(aB, aA, az, aC, ay[aH + 5], ah, 4237533241),
aC = aL(aC, aB, aA, az, ay[aH + 12], ak, 1700485571),
az = aL(az, aC, aB, aA, ay[aH + 3], aj, 2399980690),
aA = aL(aA, az, aC, aB, ay[aH + 10], ai, 4293915773),
aB = aL(aB, aA, az, aC, ay[aH + 1], ah, 2240044497),
aC = aL(aC, aB, aA, az, ay[aH + 8], ak, 1873313359),
az = aL(az, aC, aB, aA, ay[aH + 15], aj, 4264355552),
aA = aL(aA, az, aC, aB, ay[aH + 6], ai, 2734768916),
aB = aL(aB, aA, az, aC, ay[aH + 13], ah, 1309151649),
aC = aL(aC, aB, aA, az, ay[aH + 4], ak, 4149444226),
az = aL(az, aC, aB, aA, ay[aH + 11], aj, 3174756917),
aA = aL(aA, az, aC, aB, ay[aH + 2], ai, 718787259),
aB = aL(aB, aA, az, aC, ay[aH + 9], ah, 3951481745),
aC = aT(aC, aG),
aB = aT(aB, aF),
aA = aT(aA, aE),
az = aT(az, aD)
}
var ag = aJ(aC) + aJ(aB) + aJ(aA) + aJ(az);
return ag.toLowerCase()
}
三.总结
sign=加密函数(_m_h5_tk+"&"+t+"&"+appkey+"&"+data)
后续还有扫码登录淘宝的博客,
淘宝的sign参数js逆向的更多相关文章
- 图片放大镜(像淘宝浏览商品一样)JS操作
× 目录 [1]布局 [2]JS操作-获得元素 [3]大图及面板 [4]面板随着鼠标移动 [5]控制面板移动范围 [6]大图动起来 [7]代码 ---------------------------- ...
- JS实现选择菜单栏(配合慕课网淘宝搜索框的课程)
以下是关于实现慕课网淘宝搜索框的JS代码,不过只有选择菜单栏(其余比较容易实现). <!doctype html> <html> <head> <!--在IE ...
- Python模拟登录淘宝
最近想爬取淘宝的一些商品,但是发现如果要使用搜索等一些功能时基本都需要登录,所以就想出一篇模拟登录淘宝的文章!看了下网上有很多关于模拟登录淘宝,但是基本都是使用scrapy.pyppeteer.sel ...
- 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)
我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...
- js 实现淘宝无缝轮播图效果,可更改配置参数 带完整版解析代码[slider.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写淘宝无缝轮播图效果 需求分析: ...
- js 实现淘宝放大镜功能,可更改配置参数 带完整版解析代码[magnifier.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 本篇文章为您分析一下原生JS写淘宝放大镜效果 基本功能: 运 ...
- 仿淘宝分页按钮效果简单美观易使用的JS分页控件
分页按钮思想: 1.少于9页,全部显示 2.大于9页,1.2页显示,中间页码当前页为中心,前后各留两个页码 附件中有完整例子的压缩包下载.已更新到最新版本 先看效果图: 01输入框焦点效果 ...
- 摘自淘宝的js地区组件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...
随机推荐
- 论文阅读:MDNet: Learning Multi-Domain Convolutional Neural Networks for Visual Tracking
前言 CVPR2016 来自Korea的POSTECH这个团队 大部分算法(例如HCF, DeepLMCF)只是用在大量数据上训练好的(pretrain)的一些网络如VGG作为特征提取器,这些做法 ...
- guava cache 缓存
1.guava缓存 新建一个缓存对象cache,当取不到key对应的值时,生成一个,并插入到cache中 LoadingCache<String,String> cache = Cache ...
- MindSpore整体架构介绍
MindSpore整体架构介绍 MindSpore框架架构总体分为MindSpore前端表示层.MindSpore计算图引擎和MindSpore后端运行时三层. MindSpore前端表示层(Mind ...
- VB 老旧版本维护系列---兜兜转转有点晕:从服务器通过URL不中转保存的下载
从服务器通过URL不中转保存的下载 首先引用System.dll 然后新开一个页面,空的,在后台Page_Load方法里写 Dim docPath As String ="" ...
- C++标准模板库(STL)——queue常见用法详解
queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...
- 硬核!2w 字长文爆肝分布式事务知识点!!
前言 分布式事务,是分布式架构中一个绕不开的话题,而什么是分布式事务?为什么要使用分布式事务?分布式事务有哪些实现方案?更是面试时面试官特别喜欢的一个分布式三连炮!同时用XMind画了一张导图记录分布 ...
- 面试官:给我讲讲SpringBoot的依赖管理和自动配置?
1.前言 从Spring转到SpringBoot的xdm应该都有这个感受,以前整合Spring + MyBatis + SpringMVC我们需要写一大堆的配置文件,堪称配置文件地狱,我们还要在pom ...
- 【NX二次开发】Block UI 选择表达式
属性说明 属性 类型 描述 常规 BlockID String 控件ID Enable Logical 是否可操作 Group ...
- 彻底解决Spring mvc中时间类型的转换和序列化问题
在使用Spring mvc 进行开发时我们经常遇到前端传来的某种格式的时间字符串无法用java8时间包下的具体类型参数来直接接收.同时还有一系列的序列化 .反序列化问题,在返回前端带时间类型的同样会出 ...
- [源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer
[源码解析] 深度学习分布式训练框架 horovod (7) --- DistributedOptimizer 目录 [源码解析] 深度学习分布式训练框架 horovod (7) --- Distri ...