今日网站
aHR0cHM6Ly9wYXNzcG9ydC5nb2pveS5jb20vbG9naW4=
公众号的文章难度并不是逐级递增/递减的,遇到啥写啥,所以就和开盲盒一样,也许文章很干呢。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwIjNx8CX39CXy8CXycXZpZVZnFWbp9zZlBnauIzYlZzYjhTNzkTZjZjMidDNiFTMlFjZhlTZjZWO0QGMvw1NwMzN3QTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.jpeg)
反调试
这个站分析的是页面提交的参数加密逻辑,所以先打开开发者工具抓包
打开抓包,会提示进入 debugger
绕过这个 debugger 得方法比较多,右键设置 Never Pause Here 就行了
设置完就像下面这样
然后点击右边的蓝色箭头就可以了
加密定位
通过 debugger 之后输入手机和密码提交,可以在
Network
下看到如下的请求
虽然提交的是
Form Data
但是没有关键词,搜索是没办法搜索了,用
xhr
和分析调用栈的法子都可以定位。
点开
Initiator
从第一个进去之后打上断点,然后再提交一次数据
可以看到这里的
l
已经生成好了
所以继续向上一步的堆栈进行分析,分析直到下面这个位置
这里是我们提交参数的地方,不过这里的
t
里包含了需要提交的参数,所以在这里打上断点
放开断点,重新提交,会断在
post
这行上
这个时候,t 中是没有生成好的数据的,
s
则是页面上提交的数据
所以接下来才会生成加密,所以从这里一步步往下调试,大概是先单步然后下一步几次之后
你会发现下面的逻辑
这里的
interceptors
我之前的文章讲过,很多 request 前的操作都悄咪咪的在这里面做的
所以在下面这个位置下断
然后直接下一步断在
750
这一行
我们看看运行的结果
所以加密的逻辑就在这个
Q
中
跟进来就是这个
s
函数
加密分析
进入到
Q
函数当中,代码就比较难看了,所以先复制这个代码到本地,看看整体的结构
可以看到
s
是包在一个
!function(){}()
里面的,这是一个自执行的函数列表
所以我们需要单独把这一部分拿来运行
我们尝试在本地直接运行这段自执行的代码,但是提示错误
在代码里捕获了错误,但是具体为什么报错我们并不知道,所以直接去掉这个
try...catch
看看是哪里报错
再次运行提示
this.b
不是一个方法
所以需要进一步调试,发现在代码中调用的时候,传入
this.b
中的
a
是如下的一串的字符串
这个字符串格式是不是很熟悉,很明显这里的
this.b
是 window 中的
atob
,所以需要在这里补齐
this.b
的逻辑,在某乎的文章里我已经给大家列举过了如何补齐,大家可以点下方蓝字回顾一下
Python 爬虫进阶必备 | 某著名人均百万问答社区 header 参数加密逻辑分析
我们直接复制粘贴一下逻辑
将代码修改为
# this.abv = [this]["filter"]["constructor"]("return this")()[this.b](a || b >> d)
this.abv = xazxBase64.decode(a || b >> d)
复制
再次运行,这里就不报错了,提示
domain
未定义
domain
大家都知道是啥吧,在
document
下标识当前的站点的
直接拿了一个通用的环境头过来,运行一下
出结果了,但是好像有点小毛病,代码一直停住没有结束
我们继续分析,找到下面这个位置
这里使用了
setInterval
调用了
debugger
“在窗口和工作接口上提供的setInterval()方法重复调用函数或执行代码片段,每次调用之间有固定的时间延迟。
直接删掉这段代码,运行就正常了
补环境大法好啊~
现在就有人问我不会补环境,这样要怎么搞?
那我们回到刚刚 domain 的检测位置
找到报错的位置,可以看到这个代码逻辑是在一个大大的
for
循环表达式里的
伪代码如下
for(var i = 0, o = 18; i<【一坨代码】;i++){
方法体
}
复制
所以只能断点一步步调试了
有点恶心,这里还有
debugger
直接删掉,继续调试
之后就一直提示
domain
未定义,现在要怎么补齐呢?
我在网页上调试发现这段代码的结果为一个固定值,如下
可是如果替换为固定的
18
,这个
for
循环就会变为下面这样
for(var i = 0, o = 18; i < 18; i++){
方法体
}
复制
这个方法体里面就是我们的检测,包含
debugger
还有
domain
那我们为啥不直接跳过这段代码,里面的逻辑我们理清楚了也没有相关的加密逻辑全是检测
这里直接将循环的判断逻辑判断条件改为
for(var i = 0, o = 18; i < 0; i++){
方法体
}
复制
让代码直接跳过不就行了
照着我们上面的思路,修改一下,就可以看到结果的输出了
ps:记得将
setInterval
注释
好了,以上就是本次的全部内容了,我们下次再会~
对了,看完记得一键四连,这个对我真的很重要。