点击上方“咸鱼学Python”,选择“加为星标”
第一时间关注Python技术干货!
今日网站
aHR0cHM6Ly9wYXNzcG9ydC5nb2pveS5jb20vbG9naW4=
公众号的文章难度并不是逐级递增/递减的,遇到啥写啥,所以就和开盲盒一样,也许文章很干呢。
反调试
这个站分析的是页面提交的参数加密逻辑,所以先打开开发者工具抓包
打开抓包,会提示进入 debugger
![](https://i-blog.csdnimg.cn/blog_migrate/84391888243976a3a87e5465dc2b013e.png)
绕过这个 debugger 得方法比较多,右键设置 Never Pause Here 就行了
![](https://i-blog.csdnimg.cn/blog_migrate/f9622511c22ec70dc7def221219195a7.png)
设置完就像下面这样
![](https://i-blog.csdnimg.cn/blog_migrate/557702b066d9971f15b4edc0c4a66590.png)
然后点击右边的蓝色箭头就可以了
加密定位
通过 debugger 之后输入手机和密码提交,可以在Network
下看到如下的请求
![](https://i-blog.csdnimg.cn/blog_migrate/c5a3195ea6b8dd422263e0fe3039e812.png)
虽然提交的是Form Data
但是没有关键词,搜索是没办法搜索了,用xhr
和分析调用栈的法子都可以定位。
点开Initiator
![](https://i-blog.csdnimg.cn/blog_migrate/3e8cbb4a1651bd06d392bf7af127113b.png)
从第一个进去之后打上断点,然后再提交一次数据
可以看到这里的l
已经生成好了
![](https://i-blog.csdnimg.cn/blog_migrate/8ee3b9f0597272a1016bfa50db501728.png)
所以继续向上一步的堆栈进行分析,分析直到下面这个位置
![](https://i-blog.csdnimg.cn/blog_migrate/85a33eded0b2c0cbd873412a9527871a.png)
这里是我们提交参数的地方,不过这里的t
里包含了需要提交的参数,所以在这里打上断点
![](https://i-blog.csdnimg.cn/blog_migrate/4aa4cbd1c849c91c7ea7d4a4065ec40c.png)
放开断点,重新提交,会断在post
这行上
这个时候,t 中是没有生成好的数据的,s
则是页面上提交的数据
![](https://i-blog.csdnimg.cn/blog_migrate/998bbddd1829aceebf10e58d7c41bdac.png)
所以接下来才会生成加密,所以从这里一步步往下调试,大概是先单步然后下一步几次之后
你会发现下面的逻辑
![](https://i-blog.csdnimg.cn/blog_migrate/8bff6141623a9762638be9d1da2a064d.png)
这里的interceptors
我之前的文章讲过,很多 request 前的操作都悄咪咪的在这里面做的
所以在下面这个位置下断
![](https://i-blog.csdnimg.cn/blog_migrate/4a1be220c8a98a7f2ffa83223ac174c7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e58505db28dcd8518ebcaea49761a508.png)
然后直接下一步断在750
这一行
我们看看运行的结果
![](https://i-blog.csdnimg.cn/blog_migrate/fed6b34e335bf92779baddcbba1e5210.png)
所以加密的逻辑就在这个Q
中
![](https://i-blog.csdnimg.cn/blog_migrate/8a1c7076bc71340fcab14c8519645568.png)
跟进来就是这个s
函数
加密分析
进入到Q
函数当中,代码就比较难看了,所以先复制这个代码到本地,看看整体的结构
![](https://i-blog.csdnimg.cn/blog_migrate/723a114f924e7f155df6b672268de088.png)
可以看到s
是包在一个!function(){}()
里面的,这是一个自执行的函数列表
所以我们需要单独把这一部分拿来运行
我们尝试在本地直接运行这段自执行的代码,但是提示错误
![](https://i-blog.csdnimg.cn/blog_migrate/8c7c3dea10a9fbec250a0343b79af556.png)
在代码里捕获了错误,但是具体为什么报错我们并不知道,所以直接去掉这个try...catch
看看是哪里报错
再次运行提示this.b
不是一个方法
![](https://i-blog.csdnimg.cn/blog_migrate/df6121e0f6bf7d5e3a25c08907ae59f7.png)
所以需要进一步调试,发现在代码中调用的时候,传入this.b
中的a
是如下的一串的字符串
![](https://i-blog.csdnimg.cn/blog_migrate/51a5ad31471a660ade0b6dca6e71303f.png)
这个字符串格式是不是很熟悉,很明显这里的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)
![](https://i-blog.csdnimg.cn/blog_migrate/d0dbdadeddd31245ee76200b5be401e4.png)
再次运行,这里就不报错了,提示domain
未定义
domain
大家都知道是啥吧,在document
下标识当前的站点的
![](https://i-blog.csdnimg.cn/blog_migrate/9182718166217c29868b082b87ea9710.png)
直接拿了一个通用的环境头过来,运行一下
![](https://i-blog.csdnimg.cn/blog_migrate/1c7aa7c3885cb31d16c91a076a7e2459.png)
出结果了,但是好像有点小毛病,代码一直停住没有结束
我们继续分析,找到下面这个位置
![](https://i-blog.csdnimg.cn/blog_migrate/ea5ed94e5e579ecad822ef8b78735ac4.png)
这里使用了setInterval
调用了debugger
“在窗口和工作接口上提供的setInterval()方法重复调用函数或执行代码片段,每次调用之间有固定的时间延迟。
直接删掉这段代码,运行就正常了
![](https://i-blog.csdnimg.cn/blog_migrate/b83053419034958a603acaf2bc6d3376.png)
补环境大法好啊~
现在就有人问我不会补环境,这样要怎么搞?
那我们回到刚刚 domain 的检测位置
![](https://i-blog.csdnimg.cn/blog_migrate/9cfa67966a6695fc64570ce3fc3e176d.png)
找到报错的位置,可以看到这个代码逻辑是在一个大大的for
循环表达式里的
伪代码如下
for(var i = 0, o = 18; i<【一坨代码】;i++){
方法体
}
所以只能断点一步步调试了
![](https://i-blog.csdnimg.cn/blog_migrate/bb94d2db18923a9da25a0cf3268b95b8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f5ee2efdc3374b097d93101f648cbbe9.png)
有点恶心,这里还有debugger
![](https://i-blog.csdnimg.cn/blog_migrate/6966fbbc263dcc6f5ed1ec76449ed5d6.png)
直接删掉,继续调试
之后就一直提示domain
未定义,现在要怎么补齐呢?
我在网页上调试发现这段代码的结果为一个固定值,如下
![](https://i-blog.csdnimg.cn/blog_migrate/b8487f0df513fe6981b12a9c232369ba.png)
可是如果替换为固定的18
,这个for
循环就会变为下面这样
for(var i = 0, o = 18; i < 18; i++){
方法体
}
这个方法体里面就是我们的检测,包含debugger
还有domain
那我们为啥不直接跳过这段代码,里面的逻辑我们理清楚了也没有相关的加密逻辑全是检测
这里直接将循环的判断逻辑判断条件改为
for(var i = 0, o = 18; i < 0; i++){
方法体
}
让代码直接跳过不就行了
照着我们上面的思路,修改一下,就可以看到结果的输出了
ps:记得将setInterval
注释
![](https://i-blog.csdnimg.cn/blog_migrate/dc7f950d48404f976ba2c6954b29fffd.png)
好了,以上就是本次的全部内容了,我们下次再会~
对了,看完记得一键四连,这个对我真的很重要。