在家隔离的2个多月期间,看了很多关于滑动验证码的技术博客,其中大部分都是利用Selenium、Webdriver等技术进行破解的。 我也尝试过破解xxxx网站,效率相当低,而且不能满足实时数据更新,后来看到一些中级爬虫高手通过揭秘JavaScript参数直接破解。 效率高,成功率100%,难度也很大。
目前,对于此类滑动验证码,网上常见的破解方法是根据完整图片与有间隙图片的像素差异来估计间隙的位置,然后使用Selenium手动测试工具来模拟自动拖动滑块。 过程。 这些方法实现起来都比较简单,因为是模拟人体滑动,滑动轨迹很难掌握,很容易被极限测试测出来。 我们使用手动软件,导致滑动操作失败; 其次,每次启动时都需要驱动。 浏览器登录时间较长,难以满足实时性要求较高的数据采集任务的需求。
中级爬虫的强大之处在于对JS代码破解的逆向分析:对JavaScript代码进行砸碎,破解每个请求中的加密参数,然后在程序中发送请求,得到正确的响应。 这是最直接、最有效的方法。 它不需要等待浏览器呈现页面。 它只需要解密加密的请求参数并发送请求即可获得响应。 用户在浏览器中的操作,如点击验证码、拖动滑块等,最终都会转换为请求并发送给服务器(均为POST请求),服务器会校准请求参数的有效性并回复结果。
为什么很难呢? 首先,因为我不从事后端开发工作php 代码混淆,所以JavaScript代码的调用栈分析不如后端朋友那么熟练; 密钥加密代码是从混淆的 JavaScript 代码中提取的。 上面的工作量你可以相信并想象。 毫不夸张地说,如果没有足够的毅力和耐心,是很难实现破解的。
用手破解
接起来我会大概描述一下整个破解过程,太详细的东西这里就不扔掉了。
1.请求参数分析
我以最终的登录方式作为分析入口。 输入错误的账户密码,然后点击滑动并拖动到正确的位置。 然后页面会提示“账户名或密码错误!”。 观察浏览器的Network栏,虽然登录的动作是发送名称为accLoginPC.do的请求。
请求的URL是:(敏感URL)。
请求参数FormData有多个,包括:appId、loginName、loginPwd、geetest_challenge等,可以看到密码被加密成一长段CN-S513...,还有另外三个以geetest_开头的加密参数, 哪个是:
从参数命名上我们可以清楚地看出,这是Geetest滑动验证码的加密参数。 也就是说我们点击验证码并拖动滑块,最终转换成这三个加密参数。 我们的主要工作也是破译这三个参数。 细心的朋友可能注意到了,geetest_validate和geetest_seccode的参数基本相同,只是geetest_seccode多了|的字符串后缀。 约旦。 主要工作是解决挑战/验证两个参数。
对于其他非极端加密参数,如loginPwd、jtSafeKey、token等,都属于XX官网本身的加密逻辑,破解起来并不困难。 这里我们主要关注极限参数的破解。
我们进一步搜索,发现了ajax.php? 要求。 此请求中的响应信息类似于 json 字符串,其中包含 validate 参数。 惊讶了,这不是我们前面提到的geetest_validate参数吗?
观察其请求参数,发现分别是gt、challenge、lang、w、callback。 其中,w被加密成一长串。
通过这样的分析,我们逐渐理清了思路,也知道了每个请求都需要解决哪些加密参数,这里就不花太多篇幅详细描述了。
然后对于那些参数名称,检查JavaScript代码是如何加密的,然后用python代码解析它......
2.代码反混淆(是一种代码保护机制)
我们点击slide.xxx.js文件,跳转到ChromeSources菜单栏,查看JavaScript代码。
检查请求参数的JavaScript代码的加密逻辑并不那么容易。 Geetest为了增加我们破解的难度,做了很多混淆工作。
可见代码基本上是我们凡人看不懂的。 它将代码编码为 Unicode,但添加了大量混淆代码。 这导致我们直接搜索challenge的关键参数名称,却找不到相关代码。
这样,我们先复制完整的JavaScript代码,先在网上找一个Unicode编码恢复工具,将代码解码为Unicode。 解码后复制到编辑器中,搜索challenge,发现几个关键参数。
此时的代码还没有分析,可读性几乎为零。 平常的男性伴侣不得不被抛弃。 UtTS代码被替换php 代码混淆,逻辑也隐藏在JavaScript代码中,所以细节不再展开。 我们进一步恢复它。 恢复后代码如下:
代码的可读性也越来越清晰,还有一个问题:为什么有这么多varxow_list=uklgT.xow的莫名其妙的代码。 我们研究发现,这可能是GeeExperiment添加的冗余代码,主要目的是迷惑公众。
例如,对于这样的冗余代码:
恢复后,生成以下简洁易读的代码:
通过对多个JavaScript文件(例如slide.js/fullpage.js)进行反混淆,我们对JavaScript的调用逻辑更加清晰。
3. 代码解绑
代码反混淆完成后,另一个重要的工作就是如何从JavaScript代码中提取出关键的JavaScript代码。 这段代码就是请求参数的加密逻辑。 我将这个过程称为“代码解除绑定”。
这个过程不需要任何方法,需要的只是耐心、耐心、再耐心。 跟随Chrome浏览器,断点分析请求的进入和退出,一步步剥离关键代码。
比如我们需要提取参数a,所以我们提取出对参数a进行加密的代码,封装成一个get_a()函数。
封装了几个必要的JavaScript函数,我们可以在Python程序中使用PyExecJS库来方便地执行JavaScript代码来接收加密的参数。 以下是一些示例代码:
前面的内容要求各路高手大显身手,技术交流,不要做其他不被允许的事情。