Python 爬虫进阶必备 | 某电子商务生态链平台登陆 Form Data 加密逻辑分析

举报
xianyuplus 发表于 2021/08/05 21:58:26 2021/08/05
【摘要】 今日网站aHR0cHM6Ly9wYXNzcG9ydC5nb2pveS5jb20vbG9naW4=公众号的文章难度并不是逐级递增/递减的,遇到啥写啥,所以就和开盲盒一样,也许文章很干呢。反调试这个站分析的是页面提交的参数加密逻辑,所以先打开开发者工具抓包打开抓包,会提示进入 debugger绕过这个 debugger 得方法比较多,右键设置 Never Pause Here 就行了设置完就像下...

今日网站

aHR0cHM6Ly9wYXNzcG9ydC5nb2pveS5jb20vbG9naW4=

公众号的文章难度并不是逐级递增/递减的,遇到啥写啥,所以就和开盲盒一样,也许文章很干呢。

反调试

这个站分析的是页面提交的参数加密逻辑,所以先打开开发者工具抓包

打开抓包,会提示进入 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的逻辑,在某乎的文章里我已经给大家列举过了如何补齐,大家可以点下方蓝字回顾一下

【链接】

我们直接复制粘贴一下逻辑

将代码修改为

# 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注释

好了,以上就是本次的全部内容了,我们下次再会~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。