声明
本文章中所有内容仅供学习交流使用,不得用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。
若擅自使用本文讲解的技术而导致的任何意外,作者均不负责。文中若有侵权内容,请立即联系作者删除!
Ⅰ:目标
网址:aHR0cHM6Ly93d3cuZGVtby5jb20vc2VhcmNoL2J1c2luZXNzLw==
接口:aHR0cHM6Ly9jYXBpLmRlbW8uY29tL25hdGlvbnpqL2pza0JpZC9wYWdl
目标:请求头参数 sign timestamp
Ⅱ:抓包分析
-
通过观察其他接口以及调用栈,我们可以发现其他接口也是带有sign timestamp 这2个请求头参数,并且发现调用栈含有Promise 关键字,我们可以猜想可能会用到拦截器。
-
此时我们可以在 Promise.then 下面的调用栈打上断点,并重新刷新网页。通过代码这个 axios 的拦截器十分相似,既然是请求头加密,那么肯定就是在请求拦截器可能加密的,我们也可以在关于请求拦截器处理的地方断点。
-
此时断点处,请求拦截器的函数以及存放在 n 数组中,我们可以直接在控制台打印。
-
通过第2步代码分析,可以知道 Promise 对象成功态以及拒绝态会执行函数会成对的存放,那么就知道n数组中偶数索引就是成功态会执行的函数,奇数索引就是拒绝态会执行的函数,我们只需要看偶数索引的函数逻辑就可以。
-
我们可以看到成功态会执行的函数,都指向同一个函数,这是我们可以直接断点该函数,发送我们接口的请求。
-
通过看传入 t 的参数中的 url 可以知道这就是我们的接口,该对象还有 headers 属性,但是并没有我们的加密参数,此时,我们需要步入 e(t) 函数。
-
此时我们发现 其中 sign 和 timestamp 就在该函数中,此时我们只需分析逻辑即可。
-
通过代码可以知道 timestamp = f ,其中 f = (new Date).getTime();timestamp 就是时间戳。接着分析 sign。
e.headers.sign = (param = e.data,
time = f,
t = md(param),
pd("ghaepVf6IhcHmgnk4NCTXLApxQkBcvh1", pd("mwMlWOdyM7OXbjzQPulT1ndRZIAjShDB", pd("ZuSj0gwgsKXP4fTEz55oAG2q2p1SVGKK", t, time), time), time))
-
其中 e.data 是 请求体,这个我们可以知道,f 也就是时间戳,也是知道的,接着就要看 md 函数,我们可以直接进入看他的逻辑 ,复刻在自己的js文件中,缺什么补什么。最终 md 函数如下。
-
此时,我们需要看 pd 函数的逻辑,直接进入。这是,我们有需要看fd() 函数的逻辑,直接控制台看该函数的函数体。
-
突然发现这个看着有点像MD5算法,此时,我们可以不管他具体的逻辑,我们可以直接测试一波是不是MD5标准算法,但是测试的时候还要知道 t 和 e 是什么?直接进入函数断点,并释放断点到该位置。
-
可以知道 其中 t 是我们的参数,e 就是 hex字符串。此时直接控制台测试。
-
很明显这就是标准的MD5算法。此时,我们直接复刻 sign 的加密算法。并于浏览器的生成的 sign 对比,但是我们的js中的 f 要替换成浏览器的值。
-
可以发现我们生成的值和浏览器是一致的,算法无误。
-
当然还有其他方法,比如直接搜索关键字 就有可能直接定位,最原始的调用栈跟值也是可以的。
Ⅲ:总结
以上就是本次的全部分析过程,主要的还是要理解拦截器的原理,才能够很好的定位加密位置在哪里。需要具体调试,公众号【逆向学习日记】回复【某库】获取地址