JS逆向:猿人学爬虫比赛第九题详细题解

实战地址

http://match.yuanrenxue.com/match/9

抓包分析

地址栏输入 地址,按下F12并回车,浏览器停在这里:

JS逆向:猿人学爬虫比赛第九题详细题解_第1张图片

不用理会它,点击下图所示的按钮:

JS逆向:猿人学爬虫比赛第九题详细题解_第2张图片

按下F8,让浏览器继续跑起来。看到数据接口在这里:

http://match.yuanrenxue.com/api/match/9

继续点击第二页,发现该接口无加密参数:

JS逆向:猿人学爬虫比赛第九题详细题解_第3张图片

再看cookie,有个m的加密字段,sessionid这个就不分析了。又是一个典型的cookie反爬。往上追,康康这个cookie是在哪里生成的。

JS逆向:猿人学爬虫比赛第九题详细题解_第4张图片

如上图所示,到这里,就已经开始用cookie来请求了。那说明是在这个接口之前生成的。这里的 9 是第二次请求,第一次请求,返回的是一段js代码,谷歌浏览器看不到请求结果,没有关系,使用火狐浏览器就可以了。




上面是第一次请求 http://match.yuanrenxue.com/match/9 这个接口的结果。可以看到,先是加载了 udc.js,然后运行了一段 js代码,最后再调用location.reload函数。嗯,非常的清晰。

那cookie的值就应该在udc.js或者中间的那段js代码中生成,先看udc.js吧。

是一段混淆的js代码,可以借助AST编写插件将其还原:

JS逆向:猿人学爬虫比赛第九题详细题解_第5张图片

整个udc.js代码,只是定义了一个加密函数 decrypt.其后面的都是debugger相关的垃圾代码。

注意,代码检测了一些node环境,全局搜global,删掉相关代码就好,这里不做多讲解,现在,再次利用AST编写插件将中间的那段js进行还原,看到了cookie赋值的地方:

  for (var _0x55c0de = 1; _0x55c0de <= 3; _0x55c0de++) {
    res = decrypt(1606630411);
  }


  document["cookie"] = "m=" + (_0x55c0de - 1)["toString"]() + res + "; path=/";

其他的代码基本都没啥用。

现在清楚了,udc.js负责声明 decrypt函数,然后中间的那段混淆的js代码负责调用该函数,计算出cookie的m字段加密值。

不过要注意的是,udc.js是静态文件,但是中间的那段混淆的js代码是动态的,每次请求处理下就好了。

破解的代码我就不放了,分析的差不多了,剩下的读者自己完成。

你可能感兴趣的:(javascript,接口,js,web,session)