爬虫技巧----突破前端反调试
转载请注明出处
需求描述
在采集某些网站时,目标网站为了防止别人分析调试前端代码,采取了反调试措施。其中一种做法是当你按F12进入浏览器控制台后,浏览器会自动命中debugger断点,并且无限循环,导致无法调试。以某网站为例。如下图:
按F12进入控制台
解决方法
1.禁用浏览器断点
点击图中按钮,之后将不会再命中任何断点。这种方法虽然可以防止无限循环命中debugger断点,但是也存在很大的缺陷,因为对于其他代码,我们还是需要断点调试功能的。所以这个方法仅限于静态分析。
2.利用中间人修改响应代码
在前面的Fiddler教程系列文章中,已经介绍了Fiddler的基础及进阶使用。利用Fiddler修改响应,删除响应代码中的debugger即可达到目的
实现的核心代码很简单:如下
实际使用中发现,位于响应html页的debugger被删除了,但是仍然会弹出断点。分析页面得到,debugger断点位置一共有2处 第一处的debugger以明文形式存在,Fiddler删除的就是这部分。通过分析另一处debugger位置,发现debugger是通过eval去实现的,响应中并没有直接出现debugger字段,所以没有被替换掉。
代码经过强混淆,读者看到的函数名称是和我不一样的。
3.利用浏览器插件修改响应代码
具体原理和使用Fiddler是相同的,通过浏览器插件将请求重定向以达到修改代码的目的。也存在相同的问题
4.手动替换代码
既然修改响应结果无法满足需求,那只能从代码中寻找突破了。
以本文的网站为例,查看debugger断点处的调用栈堆,找到调用位置。其实在上文中间人方式结尾处已经发现了。是通过eval去实现断点的。我们先构造一个空方法
将目标网站的方法偷梁换柱
由于网站代码强混淆,所以函数名称会不一样。下面放个GIF图
完美解决 但是注意不要刷新,页面刷新后需要重新替换。
5.更简单的方式
找到命中debugger的位置,选择永不再此处暂停(nerve pause here)