2019年末逆向复习系列之努比亚Cookie生成逆向分析
郑重声明:本项目的所有代码和相关文章, 仅用于经验技术交流分享,禁止将相关技术应用到不正当途径,因为滥用技术产生的风险与本人无关。
这篇文章是《2019年末逆向复习系列》的第二篇:《努比亚Cookie生成逆向分析》
本次案例的代码都已上传到Review_Reverse上面,后面会持续更新,大家可以Fork
一波。
逆向网址
努比亚-牛仔俱乐部:https://bbs.nubia.cn/
逆向背景
努比亚俱乐部的逆向有意思在它的Cookie
是动态生成的,是由Js
生成Cookie
的案例,并且这个网站还有前端反调试的机制,对于新手爬虫工程师来说很值得学习和研究。
分析流程与逆向破解
我们以这个链接为例努比亚-牛仔俱乐部
,访问并打开开发者工具,读者会发现并没有遇到什么异常情况。
等等,我们这次讲的是生成Cookie
,我们首先需要把该网站的缓存、Cookie
清除才行,不过我们先分析分析它们的Cookie
的关键点。
看到Cookie
的组成,觉得acw_sc__v2
和acw_sc__v3
参数比较可疑,这个疑问我们先存在,之后再看看。
之后我们照例在Application
->Clear Storage
清除数据。
清除完之后我们依旧打开开发者工具重新刷新页面进行访问,可以发现,网站弹出debugger
知识点1:前端反调试
随着现在爬虫课程的普及,越来越多人都掌握了基本的爬虫用法,类似利用开发者工具寻找网站接口或者进行调试逆向寻找加密方法,对于网站本身来说,如何简单又有效地减缓这种行为是应该考虑的,所以一些网站在代码中注入了检测开发者工具是否打开的Js
代码,这样,当我们想要打开开发者工具的时候我们就会陷入网站的无限循环的debugger地狱
,而且这样还会造成Js
的内存泄漏,你可以在遇到这种情况的时候检查你的chrome页面进程,会发现内存占用量越来越高,可你什么都没干?所以,对于这种反调试手段,我们需要学习如何绕过。
1. 绕过debugger地狱
我们首先查看右边的Call Stack
调用栈,我们一一分析,可以追溯到如图所示的地方。
关键代码是这样的,也就是一开始会执行_0x4db1c
这个函数(初步理解是上文所说的检测开发者工具是否打开的函数,之后setInterval
函数是每隔一定时间执行)
_0x4db1c();setInterval(function() {_0x4db1c();}, 4000);
我们再看_0x4db1c
的函数,它停在_0x355d23
这个函数上面
面对这样的情况,我们可以直接在Console
里面对这个函数进行重写
重写好之后我们执行下,会发现这个页面就直接生成好Cookie
去访问页面了,这样达不到我们之前想研究它Cookie
生成的逻辑的目的。
目前我们绕过了debugger
反调试,那我们该怎么获取生成Cookie
的逻辑呢?我们接着分析
2. 破解Cookie生成逻辑
为了我们分析的方便,我们可以直接把这个debugger
的代码保存下来,在我们本地代码中删除debugger
的逻辑之后进行调试。
我们直接打开这个html文件,我们会发现网页一直卡在Sources
不动,为什么会出现这种情况?
仔细分析代码,发现有些Regexp
的检测代码,根据以往的经验可能是检测代码是否长开?防止有人本地调试?我们使用压缩后的代码,大家可以用Js压缩/解压工具进行压缩
果然,压缩之后还是正常的,那么可以验证我们刚才的想法了。
我们删除debugger
相关的代码,也就是
_0x4db1c();setInterval(function() {_0x4db1c();}, 4000);
打开网页后发现页面一直在闪?html代码不长,我们再仔细看看,注意到一个细节setTimeout
setTimeout
是延后几秒执行一次,我们看一下’\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29’是什么意思,我们把它放在Console
里看看。
可以看到,setTimeout
执行reload
函数,我们看看reload
函数
function reload(x) { setCookie("acw_sc__v2", x); document.location.reload(); }
里面的逻辑是先设置Cookie
再重载页面,所以我们这里一直闪的原因是先执行setTimeout
再重载页面又执行setTimeout
,所以又是一个循环地狱,我们删除setTimeout
这段代码就行。等等,我们再看看上面Console
中的结果reload(arg2)
,然后到reload
函数中,acw_sc__v2
是由arg2
这个函数得来的,好,我们现在明白了哪个地方生成的Cookie
了,我们在html代码中搜索arg2
,然后对它打上断点。
3. 分析加密算法
我们先总体看下arg2
函数的构成
也就是需要_0x23a392
和_0x5e8b26
这个两个关键参数,_0x23a392
来自arg1
的方法生成,它们都是有_0x55f3
这同一个方法,所以我们的思路就清晰了。
我们先看看_0x55f3
这个方法,并且做一些调试,可以发现_0x55f3
通过传入的参数不同使用不同的方法,有些类似于控制流平坦化
。
知识点2:控制流平坦化
直接上图
首先_0x5e8b26
这个参数我们多次调试后发现是个变量,可以先确定,"3000176000856006061501533003690027800375"
,当然我们也可以直接搜索_0x5e8b26
而我们获取到_0x23a392
和_0x5e8b26
之后进行加密的方法如下
大致的加密就是如上这样,因为整体代码量也不大,可以直接改写或者使用python
加载Js
都行。
4. 总结思路
这次的案例主要是可以学习到两点,第一点就是我们懂得有些网站会进行前端反调试,手段之一就是会检测开发者工具是不是打开,而且如果我们把代码拿到本地,竟然还会检测本地代码是否是展开的?第二点我们需要习惯这种代码混淆的方式,有些网站会用_0xxxx
等无意义的符号进行混淆,以及使用16进制来做混淆恶心我们,我们想要还原的话直接把代码放到Console
里面执行一下就可以了,因为Js
也能读取原始的16进制码。
代码实战
有了上面这个分析流程,我们就可以开始Coding
了,以下是acw_sc__v2
加密的流程。
获取arg1
参数的代码
获取arg2
参数的代码
测试的代码,先访问官网动态获取Cookie
再在请求头的Header
中加入这个acw_sc__v2
参数去重载URL
访问官网。
复习要点
从这个复习的案例我们可以总结下思路:
如何绕过前端反调试?
别害怕混淆的代码,代码虽然混淆,但是逻辑还是一样的。
号主介绍
多年反爬虫破解经验,AKA“逆向小学生”,沉迷数据分析和黑客增长不能自拔,虚名有CSDN博客专家和华为云享专家。
私藏资料
呕心沥血从浩瀚的资料中整理了独家的“私藏资料”,公众号内回复“私藏资料”即可领取爬虫高级逆向教学视频以及多平台的中文数据集
小学生都推荐的好文
Python2寿命只剩一个月啦!还不快赶紧学起Python3酷炫到爆的新特性!
搜狗微信下线了怎么获取公众号文章?最新方式手把手教你
万物皆可Hook!重新捡起Hook神器-Xposed框架
下一代容器架构已出,Docker何去何处?看看这里的6问6答!!
日志太多怎么搞?一套爬虫监控系统全搞定!
- 点赞
- 收藏
- 关注作者
评论(0)