本文仅用作学习交流,不得用于任何商业用途;
4 月的北京,这天气像是 80 岁的老奶奶 ?,捂得慌。
实验室/自习室的角落,清脆的打字声,夹杂着几声叹气,一个套着格子衬衫,头发不多的大叔直视着屏幕。
眼神坚定的他,快速的敲下了一行命令。‘这次一定要成了’。
而屏幕的那头,终于有了些反应,一个个字符鲜活的蹦了出来,像极了[黑镜:潘达斯奈基]
中男主被操控的感觉。
可他原本充满期待的脸突然开始扭曲,放佛在屏幕上看到了什么恐怖的东西
只见屏幕上欣然出现这么一句话
上次发完你已经是一个成熟的爬虫了,应该学会自己去对抗反爬码农了 ?-『爬虫进阶指南』就不断有小伙伴向我我请教如何解决一些 js 逆向工程的问题
其实这个问题说小了涉及 js、py 基础语法,说大了涉及网络攻防,涉及对方公司架构,甚至涉密。
而且做这种逆向工程还特别费时间,(其实反爬工程师做加密方案也特别累, 所以一般做这种混淆加密
的都是该公司的核心业务),所以这方便的资料其实特别少。
还是再想提醒下大家,爬虫是一个获取信息的好工具,但还请相互体谅,本文也仅用作学习使用。
本文分析两个案例,一个是去年被爬怕了的马蜂窝
,一个是携程
, 像这种公司体量很大,业务繁多,也不可能全部分析,具体来说:
乱入总结:
- 携程 996
- 马蜂窝看不出来 是不是 996
打个小广告, 求 star自带高可用 Proxy 库的 spider 代码 hhh
马蜂窝
我们要爬的是所有景点信息,这个信息是请求http://www.mafengwo.cn/ajax/router.php
获取的
其中需要一坨参数,除了一眼能看出语义的参数之外,也就_sn
, sAct
(可惜它不变)可能是被加密过的。
google 了一下没发现有提供解决方案的~~(快速解决问题才是王道)~~,大概推测了一下马蜂窝在去年年底做了这次加密方案。
第一反应,不是先做逆向,而是猜测可能是通过前置请求从后端拿到的,然后翻了一下发现并没有,对比了一下前后几个请求,发现这个参数出现次数还挺多的,而且值还不一样,行了 js 加密石锤了
然后去筛哪些 js 对这个参数的生成有所影响(用 chrome 的开发者工具暴力 block)
饿 他们这 js 有点少,闭着眼睛 都能猜出来是哪个,jQuery 一般会放自己构造 cookie 构造 Header 头的逻辑(当然这里也有可能同时使用 Cookie & _sn
一起做效验)
这个时候我们做一个实验,来看一下 Header 里面的内容有没有作用在 encoder 和 decoder 中。
打开 chrome 的无痕模式(有些时候需要 clear 一下 History, 这跟 ServiceWork 机制有关,有兴趣的同学可以查下相关资料), 先打开开发者模式,然后键入我们爬取的 URL。
(现在我们模拟的是首次进入该网站的用户,通常为了做到首次加载网页在几百 ms 内,都会对一些不必要的功能做 delay 加载操作,这个时候的条件能获得到信息,则之后也能)-这也是一个小技巧吧 ?
然后我们看一下,没有 Cookie(这也可以理解,JQuery.js 和混淆所需要的/js/hotel/sign/index.js
两个文件是异步获取的,为了保证用户的用户体验,前端在首次加载做了妥协。
然后我们工作的重点,就是研究http://js.mafengwo.net/js/hotel/sign/index.js?1552035728
这个 js 做了哪些混淆
首先,一看这个安全做的就不是特别好,这个 js 是通过静态的 url 来获取的,获取的过程没有任何加密,也就是说我解密出来一次,只要你不发版,我基本上都能用(所以大家看看就行了,别用做商