首页 > 国际新闻

App爬虫篇 - 破解移动端登录,助力 Python 爬虫

文章作者:来源:www.24h-yeu.com时间:2019-09-23



阅读文本大约需要10分钟。

1

目标场景

在移动互联网时代,大量企业已经放弃了传统网站,并选择将数据和服务集成到App中。因此,应用程序爬行或排斥尤为重要。

App侧的常见爬虫就是使用Appium和Airtest来驱动手机打开应用程序,操纵页面,然后按元素ID获取元素的内容,或者用mitmproxy捕获所请求的数据,最后保存数据。

如果您想完成复杂的操作并加快爬虫的效率,您必须破解App端的登录,获取一些关键数据,并直接模拟接口请求以实现快速有效的数据爬行。

本文的目的是让每个人“破解应用程序的登录”。

Ps:本文仅用于技术交流,不应用于其他目的。

2

准备工作

在开始编写脚本之前,需要进行以下准备工作

APK应用程序被破解,你可以去官方网站或主要应用程序市场下载,然后将应用程序安装到手机反编译工具,MAC OSX推荐Android Crack Tool工具集,Win OS可以使用dex2jar来反编译APK应用程序包源码浏览工具:jadx-gui捕获工具:Charles或Fiddler

3

写一个剧本

在第一步中,在确保手机配置了代理后,您可以使用Charles捕获“获取代码”和“登录”以获取请求地址,请求参数和请求标头数据。

在步骤2中,查找请求参数的生成规则,请求标头中的“常规数据”,并在Python代码中生成数据。

首先,我们查看获取验证码的请求的参数。发现除了移动号码之外,参数t可以很容易地被认为是请求的时间戳,但是生成参数令牌而没有其他网络请求。

因此,我们大胆猜测:这个令牌是由App端通过某种逻辑生成的;出于同样的原因,请求标头中的令牌也由App生成。

在我们反复启动获取验证码的操作后,我们有一条规则:参数中的令牌保持不变,与请求时间无关;请求标头的标记将随时间变化。

我们使用Android Crack Tool反编译APK应用程序以获取源Jar包。

然后,您可以使用jadx-gui工具打开源Jar包,并通过在请求地址中调用“keyword:login”来查找源代码,以查找发送请求的位置。

由于应用程序源代码在打包时会混淆代码,因此我们需要根据上述搜索结果找到参数初始化位置和实现逻辑。

逐渐上去应用程序源,你可以找到按钮点击事件的监听功能。

具体的实现逻辑是将用户输入的手机功能传递给混淆功能:b()

单击查看函数b()的实现逻辑,您会发现该方法截获了手机号码,获取当前日期和时间,并执行字符串的“第一次拼接”操作。

第一部分的拼接是在Python代码中完成的。

第一次拼接完成后,我们发现我们调用了一个函数a(),它是由上述拼接生成的两个变量。

函数a()在内部使用“DES + Base64”加密算法来执行第二步。

加密操作可以在Python中轻松实现。

应该注意的是,b()函数的最后一行对第二步中生成的字符串执行特殊的字符替换操作。在生成令牌之前,需要对数据执行相同的处理。

通过以上三个步骤,您可以在网络请求中生成参数Token。

同样,对于请求中的令牌,我们通过查询令牌关键字来查询源。

通过观察,我们发现类e中的b()函数的功能是向请求添加请求头,继续查看函数b()的实现类,并发现这个类也完全混淆了。

如果你更小心,你会发现当前实现类的包名是Okhttp3。我们可以从Github下载Okhttp3的源代码,然后比较它,我们可以清楚地了解实现逻辑。

Ps:okhttp是使用许多网络请求库的Android。

通过比较未经混淆的代码,可以很容易地在生成请求标头中编写令牌的逻辑。

到目前为止,此步骤完成了两个令牌的生成。

第3步可以使用Python“模拟请求”来获取电话验证码。

类似地,后续登录请求首先使用上面生成的令牌逻辑来修改请求头中的令牌,然后模拟请求,以便可以实现正常登录。

4

结果结论

通过模拟获取身份验证代码的请求,等待手机接收身份验证代码,输入身份验证代码,然后模拟登录请求,您可以在成功登录后获取令牌。

由于验证码是由服务器生成的,因此无法在此获取生成逻辑,但对于Android手机可以监控通知栏中的消息元素,并获取消息验证码自动填写,因此不需要用于手动输入。

在获得登录令牌之后,理论上,可以通过Python模拟App页面上的各种网络请求。稍后提供的源代码包含完整的票证获取过程。

我已将所有源代码上传到后台,我可以在关注公共号码后回复“ap p login”来获取它。

如果您认为文章不错,请分享。你的绝对是我最大的鼓励和支持。

/今天送的礼物/

Python3智能数据分析快速入门

本书介绍

——