【Python3爬虫】一次应对JS反调试的记录

摘要:
那么endebug()方法的具体内容是什么呢?全局搜索“endebug”,可以找到一个JavaScript文件(连接为:https://www.aqistudy.cn/js/jquery.min.js?b.p=o:4.q=o}(),q.x}}',56,56,'||function|var|window|onchange|define|typeof|Firebug|on||module|||||off|if||return|resize||chrome|||exports|jdetects||setInterval|||console|setTimeout|create|code|Image|getStatus|new|id|__defineGetter__|unknown|clear|log|isInitialized|removeEventListener|500|delay|clearInterval|endebug|free|undefined|amd|200|cmd|addEventListener|100'.split('|'),0,{}))解密出来可以发现这段代码就是用于检测开发者工具有没有打开,若打开了,则触发反调试,修改页面。

一、前言简介

在前面已经写过关于 JS 反调试的博客了,地址为:https://www.cnblogs.com/TM0831/p/12154815.html。但这次碰到的网站就不一样了,这个网站并不是通过不断调试消耗内存以反调试的,而是直接将页面替换修改掉,让人无法调试页面。

【Python3爬虫】一次应对JS反调试的记录第1张

二、网页分析

本次爬取的网址为:https://www.aqistudy.cn/,但打开开发者工具后,页面变成了下面这样:

【Python3爬虫】一次应对JS反调试的记录第2张

很明显这是触发了反爬,页面直接被替换掉了。当我们打开开发者工具时,程序检测到了开发者工具被打开了,所以触发反爬,将页面修改成了上面的样子。

页面被修改了,我们就没办法了吗?自然是有对策的,我们可以查看一下网页源码,在开发者工具中切换到 Source 选项,找到首页 index 的源码,如下图:

【Python3爬虫】一次应对JS反调试的记录第3张

往下翻找,可以找到如下内容,可以看到在 endebug() 方法中就是修改页面的代码:

【Python3爬虫】一次应对JS反调试的记录第4张

通过查看上面的代码可以发现,debugflag 就是判断条件,而 loadTad() 则是获取数据的接口,当程序检测到开发者工具被打开时,debugflag 的值改为 true,endebug() 函数执行,页面也就被修改掉了。

那么 endebug() 方法的具体内容是什么呢?全局搜索“endebug”,可以找到一个 JavaScript 文件(连接为:https://www.aqistudy.cn/js/jquery.min.js?v=1.2),在其中能找到如下代码部分:

1 //debug detect
2 eval(function(p, a, c, k, e, d) {
3     e = function(c) {
4         return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
5 }
6 ;
7     if (!''.replace(/^/, String)) {
8         while (c--)
9             d[e(c)] = k[c] ||e(c);
10         k = [function(e) {
11             returnd[e]
12 }
13 ];
14         e = function() {
15             return '\w+'
16 }
17 ;
18         c = 1;
19 }
20     ;while (c--)
21         if(k[c])
22             p = p.replace(new RegExp('\b' + e(c) + '\b','g'), k[c]);
23     returnp;
24 }('2 M(g,y){h(!g){!2(e){2 n(e){2 n(){j u}2 o(){4.8&&4.8.m&&4.8.m.H?t("9"):(a="g",v.G(d),v.F(),t(a))}2 t(e){u!==e&&(u=e,"2"==7 c.5&&c.5(e))}2 r(){l||(l=!0,4.I("k",o),L(f))}"2"==7 e&&(e={5:e});3 i=(e=e||{}).K||J,c={};c.5=e.5;3 a,d=B z;d.D("C",2(){a="9"});3 u="E";c.A=n;3 f=s(o,i);4.S("k",o);3 l;j c.N=r,c}3 o=o||{};o.x=n,"2"==7 6?(6.P||6.R)&&6(2(){j o}):"O"!=7 b&&b.p?b.p=o:4.q=o}(),q.x(2(e){3 a=0;3 n=s(2(){h("9"==e){w(2(){h(a==0){a=1;w(y)}},Q)}},T)})}}', 56, 56, '||function|var|window|onchange|define|typeof|Firebug|on||module|||||off|if||return|resize||chrome|||exports|jdetects||setInterval|||console|setTimeout|create|code|Image|getStatus|new|id|__defineGetter__|unknown|clear|log|isInitialized|removeEventListener|500|delay|clearInterval|endebug|free|undefined|amd|200|cmd|addEventListener|100'.split('|'), 0, {}))

解密出来可以发现这段代码就是用于检测开发者工具有没有打开,若打开了,则触发反调试,修改页面。

三、解决方案

首先在首页的源码中的如下位置打上断点,然后刷新页面,进入调试状态。

【Python3爬虫】一次应对JS反调试的记录第5张

然后切换到 Console 选项页,在其中对 endebug() 方法进行重新定义,输入如下内容:

function endebug(){}

如下图所示,输入完回车,然后继续执行(Chrome 的快捷键是 F8):

【Python3爬虫】一次应对JS反调试的记录第6张

进行完上述步骤后,就能正常的抓包分析了。

免责声明:文章转载自《【Python3爬虫】一次应对JS反调试的记录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇S3C2440 制作最新busybox文件系统iOS与服务器端 GZip压缩问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ffmpeg 使用 gdb 调试相关技巧

本文说明了,在ffmpeg二次开发或调用库的过程,如何借助于ffmpeg源码进行调试。 注:ffmpeg版本是4.0。 1. 编写代码 编写将pcm数据转换为mp2的代码 pcm_to_mp2.c #include <libavformat/avformat.h> #include <libavcodec/avcodec.h> #i...

四、js对象的基本用法

对象 定义 无序的数据集合 对象的创建方法: 第一种 对象字面量 let obj = {user:'admin',pwd:123456} 第二种 new操作符和Object构造函数 let obj = new Object({user:'admin',pwd:123456}) 注:键名是字符串,不是标识符,可以包含任意字符,引号可省,省略之后就只能写标识...

天天酷跑 破解全套教程 tips地图bin文件!

需要的工具:Android逆向助手,WinHex,ApkIDE,C32Asm,apk编辑器,mp3-ogg格式转换器教程开始:一.讲解apk文件解包。    1.我们到酷跑官网去下载一个正版酷跑文件,后缀名是.apk。之后在我们电脑上下载一个360压缩工具,并安装,下载地址:http://yasuo.360.cn/         <ignore_j...

浏览器、HTML、css 面试题

1.什么是盒模型 盒模型(内容(content),内边距(padding),边框(border),外边距(margin)),值得注意的是,块级元素可以设置宽高,内边距,边框,外边距 行内元素宽高自动,并排显示。 2.行内元素有哪些?块级元素有哪些? 空(void)元素有那些?行内元素和块级元素有什么区别? CSS规范规定,每个元素都有display属性,确...

js对象中什么是可枚举性(enumerable)?

说到枚举,可能很多人都会想到枚举类型,但在javascript对象中有一个属性为可枚举性,他是什么呢? 概念 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之中。具体来说,如果一个属性的enumerable为false,下面三个操作不会取到该属性。* for..in循环* Object.keys方法* JSON.s...

js 调用微信浏览器内置方法,启动支付

$.post("{php echo app_url('pay/cash')}",{orderno:orderno,paytype:paytype},function(m){ //todo: 跳转到微信支付,获取支付的相关信息 if(!m.errno){...