最近在学习 APP 逆向的道路上遇到一个 APP,当请求接口频繁的时候,会触发风控提示需要滑动验证码。验证码类型/风格类似下图:
经过分析发现,当触发风控后接口返回数据为空(因为一些原因这里就不再展示相应的数据)。但在返回的 response 的 headers 中发现有个可疑的参数,这个参数是一个 URL 地址,通过浏览器打开发现是一个滑块地址。于是开启抓包 -> 触发滑块会发现滑块成功后页面会生成一个新的 cookie ,复制出来尝试携带该 cookie 值继续请求,果然不出意外又可以拿到数据了。
上面的操作确实已实现了过滑块的目的,但是作为一个程序员,我们大多时候希望将整个过程实现自动化。所以我们先想一下我们可能需要什么东西:
- 一个浏览器加载 url;
- selenium/uiautomator2 等自动化操作滑块并拦截 cookie 使用;
可能在平时的工作中我们使用 selenium/u2 这些自动化软件比较多,但考虑到使用 selenium 操作这种简单的滑块略显笨重,所以我决定直接使用 Android WebView 组件来加载滑块 url。
关于 Android WebView 组件详细介绍请自行搜索,随手放一个链接 -> WebView 基本使用。
接下来需要大家安装 Android studio 软件并会简单的项目编译等操作,打开 Android studio 新建一个APP 项目,新建项目的时候没有什么特别的要求,之后在布局文件里直接添加一个 WebView 组件,因为我们只需要一个 WebView 组件,所以代码很简单,类似下面这样:
定义好组件之后,在 MainActivity.java 文件里通过 findViewById 方法绑定 WebView 视图,接下来我们就可以直接操作 WebView 组件了,我们主要会使用到WebView的loadUrl方法和事件监听 setWebChromeClient。loadUrl 方法主要是让 WebView 这个“小浏览器”加载我们的 url,webView.setWebChromeClient 主要是为通过 WebChromeClien 类的 onProgressChanged 方法监听URL页面是否已经加载完成,onProgressChanged 方法有两个参数,第一个参数是 webview 对象,第二个参数是一个 int 类型,代码着页面加载进度,可以判断当第二个参数值为100时页面已经加载完成,此时我们便可以做滑块操作了。
期初对于操作滑块,自己想的过于复杂,想到 autoJs/u2 等,但是通过尝试发现通过 adb 命令的 `adb shell input swipe 123 1234 889 1234` 进行模拟滑动最方便。命令中的四个数字其实是两个坐标,在开发这模式中打开`指针位置`这个功能后,触摸屏幕就可以看到当前手指在屏幕上位置坐标。(不要说没有看到,在屏幕最上面显示)。通过 loadUrl 加载验证码地址之后,在 onProgressChanged 方法里执行adb命令,当滑块成功后可以通过 CookieManger 来获取当前页面 cookie。具体代码大致如下:
到这里,我们 url 加载,滑动滑块都已经实现,但是为了让我们 APP 能够实时加载爬虫传过来的滑块 url,所以需要让 APP 在手机上起一个服务让 WebView 的 loadUrl 通过api的方式暴露出去,我这里使用的是 AndroidAsync,当然你也可以使用 NanoHTTPD 这些,这个全看自己喜好。注册一个服务并监听 5600 端口:
在 LoadUrlHandlder 类中简单处理一下路由逻辑,解析 url 参数并调用 MainActivity 的静态方法 loadUrl 操作 WebView :
因为 Android UI 相关的方法都需要在主 UI 线程中进行调用。因此,在 MainActivity 类中的 loadUrl 方法中需要使用 post 方法,讲 WebView 的 loadUrl 操作转移到主线程中,示例代码如下:
文中涉及到的验证码是我自己在局域网服务器上部署的一个 demo,当滑块成功后会模拟生成一个 cookie,请求测试:
不太会写文章,总感觉还需要补充很多,O(∩_∩)O哈哈~ 有问题可以随时沟通~ 最后放一个本人知识星球二维码日常分享爬虫/逆向/群控等骚操作.