本来今天我就在想,要不要把我最近研究的三个js分享出来,还没做决定的情况下,好巧不巧,一个小伙伴私信我,所以就有了这篇文章。

js破解之七麦#############妄为写代码

目标网站:https://www.qimai.cn/rank

浏览器键入地址,分析发现我们想要的数据来源于

js破解之七麦#############妄为写代码

 

 

查看request,发现关键参数analysis(ps:这里先抛去cookie影响不谈,即使存在cookie验证的情况,也应该先把url构造完成)国际惯例,全局搜索analysis,发现无果,此时就应该考虑xhr断点方式进行调试

js破解之七麦#############妄为写代码

js破解之七麦#############妄为写代码

添加xhr断点,刷新网页,开始debugger,格式化js,分析调用栈

js破解之七麦#############妄为写代码

一般情况下,根据xhr打的断点都会涉及到XMLHTTPRequest操作,都要向上查找两到三个调用栈。当然,这里我们还是要观察url地址的变化

js破解之七麦#############妄为写代码

发现目标调用栈,打上断点准备调试,同时为后续几个调用栈的入口,同时打上断点,刷新网页

js破解之七麦#############妄为写代码

断在了get函数,此时可以发现不管是url:a,还是params:n,都没有目标参数,继续执行到下一个断点

js破解之七麦#############妄为写代码

 

 

t为函数,e为r对象,继续跟进t函数

js破解之七麦#############妄为写代码

此时看到这里,应该首先对interceptors单词敏感,以mitmproxy和logging模块的添加句柄方式类比进行理解,此处要找的是拦截器的实现逻辑,首先鼠标覆于this.interceptors.request上

js破解之七麦#############妄为写代码

点开两个句柄,找到句柄的functionlocation,点击进去

js破解之七麦#############妄为写代码

里面就是拦截器的具体实现了,打上断点,刷新网页,继续调试

js破解之七麦#############妄为写代码

单步执行到最后,发现r就是我们所需要的analysis值,鼠标依次覆于r的实现上,翻译下来就是r=window["Object"](f[Ja])(window["Object"](f[Me])(m, b)),也就是r=f[Ja](f[Me](m, b))

js破解之七麦#############妄为写代码

先看m的实现,变化的参数也就这个e

js破解之七麦#############妄为写代码

接着看e的实现,这个地方比较简单,取了一下cookie:synct和syncd的值,然后和时间做了点操作,我就不细说了(实践发现e的值不加修改,也能获取数据)

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

 

 此时e的值就拿到了,而b的值为固定值"00000008d78d46a",接下来就要开始分析那两个函数了,根据执行关系,首先分析f[Me]函数,在函数实现内部打上断点

js破解之七麦#############妄为写代码

 

 

把这个C函数的实现,拷贝到我们的node代码

js破解之七麦#############妄为写代码

 

 

并根据调试情况加以修改

js破解之七麦#############妄为写代码

在调试中找到m函数的实现

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

i也是个函数,只不过是个固定值,咱们就简写了

js破解之七麦#############妄为写代码

至此,f[Me]函数分析完毕。开始分析f[Ja]函数,老规矩,进去函数实现内部,打上断点分析

js破解之七麦#############妄为写代码

 

js破解之七麦#############妄为写代码

m函数还是上面同一个m函数,就不提了,接下来找这个N()的实现

js破解之七麦#############妄为写代码

三目运算符,自己判断执行逻辑

js破解之七麦#############妄为写代码

接下来先看这个e.from

js破解之七麦#############妄为写代码

去看s函数的实现

js破解之七麦#############妄为写代码

同样,三目运算符,自己判断执行哪个逻辑

js破解之七麦#############妄为写代码

这里执行f函数,找到f函数

js破解之七麦#############妄为写代码

g函数自己去看,返回的是根据参数n,返回e的length

o函数自己去看,根据r的值返回固定长度的Unit8Array

js破解之七麦#############妄为写代码

接下来,往变量t里面写数据,看这个t.write函数的实现

js破解之七麦#############妄为写代码

找到k函数的实现

js破解之七麦#############妄为写代码

发现返回的是C函数的结果

js破解之七麦#############妄为写代码

此时注意C函数,可不是最开始的C函数

js破解之七麦#############妄为写代码

看下W函数的定义,比较简单

js破解之七麦#############妄为写代码

再看下K函数的定义,也简单

js破解之七麦#############妄为写代码

复制到node代码中

js破解之七麦#############妄为写代码

js破解之七麦#############妄为写代码

至此t.write函数处理完毕,再回到调试环境

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

至此e.from函数分析完毕,开始进行n.toString("base64")

js破解之七麦#############妄为写代码

找到n.toString的实现

js破解之七麦#############妄为写代码

还是三目运算符,手动判断

js破解之七麦#############妄为写代码

找到这个y函数的实现

js破解之七麦#############妄为写代码

找到M函数的实现

js破解之七麦#############妄为写代码

找到Q.fromByteArray函数的实现

js破解之七麦#############妄为写代码

复制代码到node中

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

再看下这个l是什么

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

现在应该差不多了,我们执行下看看

js破解之七麦#############妄为写代码

 

 js破解之七麦#############妄为写代码

回调试环境看看,少了这个a函数

js破解之七麦#############妄为写代码

复制到node上

js破解之七麦#############妄为写代码

此时发现a函数需要用到l变量,把l提取出来

js破解之七麦#############妄为写代码

再次执行下试试

js破解之七麦#############妄为写代码

analysis变量已成功打印,粘贴到浏览器实验一下

js破解之七麦#############妄为写代码

 

 

成功得到数据,所以这里也就不考虑cookie验证的情况了。至此,此次七麦js破解分析完毕,我一开始之所以不想写的原因就是,过程函数调用层次过深,虽说不难,但是叙述起来较为麻烦。嗯,第一次有小伙伴私信我,所以就写一下吧,就这样。

最后,之所以研究七麦这个网站也是看了冷月的博客文章,随后又看了Lateautumn_Lin的简书文章,感谢他们,以及Lateautumn_Lin本人对我的私下解惑,谢谢。

附:

    冷月博客:https://lengyue.me/index.php/2018/10/15/qimai/

    Lateautumn_Lin简书:https://www.jianshu.com/p/24fada16fc3c

再次感谢他们的技术分享。

(完)

相关文章:

  • 2021-07-05
  • 2022-12-23
  • 2021-07-26
  • 2021-09-23
  • 2021-11-13
  • 2022-12-23
  • 2022-02-01
  • 2022-12-23
猜你喜欢
  • 2021-08-19
  • 2022-12-23
  • 2022-01-04
  • 2021-10-03
  • 2021-08-17
  • 2022-12-23
  • 2022-03-02
相关资源
相似解决方案