破解移动端登录,助力 Python 爬虫!

Android原生App爬虫-实现原理 爬虫常见两种情况:第一种情况,爬虫伪装成浏览器,向服务器要数据;第二种情况,在服务器往浏览器发送数据时,爬虫从中拦截,获取信息。 这两种情况,无论是暗号(参数)不对还是行为不对,都会被服务器识别。​那么有没有什么办法可以做到几乎毫无痕迹地爬取数据呢?答案是有的。 阅读详情

1

目 标 场 景

在移动互联网时代,很大一部分企业抛弃了传统的网站, 选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。

常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,操作页面,然后通过元素 ID 获取元素的内容,又或者借助 mitmproxy 捕获到请求的数据,最后将数据保存下来。

如果要完成复杂的操作,加快爬虫的效率, 就必 须破解 App 端的 登录, 获取一些关键的数据,直接模拟接口请求,达到快速高效地爬取数据的目的。

Python资源共享群:484031800

 

 

 

 

本篇文章的目的是带大家 「 破解 App 端的登录 」这一操作。

ps: 本文仅限技术交流,请勿用于其他用途。

2

准 备 工 作

在开始编写脚本之前,需要做好如下准备工作

  • 待破解的 APK 应用,可去官网或者各大 应用市场去下载,然后安装应用到手机中
  • 反编译工具,MAC OSX 推荐 Android Crack Tool 工具集,Win OS 可以使用 dex2jar 来反编译 APK 应用包
  • 源码浏览工具: jadx-gui
  • 抓包工具: Charles 或者 Fiddler

3

编 写 脚 本

第 1 步,确保手机配置好代理之后,就可以利用 Charles 对 「 获取 验证码 」 和 「 登录 」 进行抓包操作,得到请求地址、请求参数和请求头等数据。

 

 

 

 

 

第 2 步,对请求参数、请求头中 「 没有规律的数据 」 寻找生成的规律,并用 Python 代码来生成这些数据。

首先,我们查看获取验证码这一请求的参数,发现除了手机号码外,参数 t 可以很容易想到是请求的时间戳,唯独参数 token 在没有其他网络请求的情况下生成了。

def get_unix_time(type_13):
    """
    获取时间戳
    :param type_13:10位、13位,是否是13位
    :return:
    """
    t = time.time()
    if type_13:
        millis = int(round(t * 1000))
    else:
        millis = int(t)
    return millis

所以,我们大胆猜测: 这个 token 是 App 端通过一定的逻辑生成的; 同理,请求头中 token 也是由 App 端生成 。

在我们多次发起获取验证码的操作之后,我们得出一个规律:参数中的 token 保持不变,与请求时间没有关系;请求头的 token 会随着时间的变化的也会发生变化。

我们利用 Android Crack Tool  对 APK 应用进行反编译,得到源码 Jar 包。

 

 

 

 

 

然后就可以使用  jadx-gui  工具打开源码 Jar 包,通过请求地址中的 「 关键词:login 」搜索源码, 就能找到请求发送的位置。

 

 

 

 

 

由于应用源码打包的时候混淆了代码,因此,我们需要根据上面的搜索结果去定位参数初始化位置及实现逻辑。

 

 

 

 

 

逐步往上追溯应用源码,可以找到按钮点击事件的监听函数。

具体实现逻辑是把用户输入的手机函数传给混淆后的函数 :b()

 

 

 

 

 

点击查看函数 b() 的实现逻辑,会发现方法中对手机号码进行了截取,获取当前日期时间,进行字符串的 「 第一次拼接 」操作 。

 

 

 

 

 

对第一部分的拼接我们用 Python 代码进行实现。

def __get_param_token(self, phone_num):
        """
        获取参数Token
        :return: BNpK8SMDiV6jTU4DR99A9vYoN9e90yBd
        """
        today = datetime.date.today()
        formatted_today = today.strftime('%Y%m%d')
        formatted_day = today.strftime('%m%d')
        # 参数1  手机号码|完整日期6位
        arg1 = phone_num + "|" + formatted_today
                # 手机号码后4位+日期包含月、日
        # 参数2  64230704
        # 字符串转为bytes
        arg2 = bytes(phone_num[7:] + formatted_day, encoding="utf8")

第一次拼接完成之后,我们发现又调用了一个 函数 a(),参数为上面拼接生成的两个变量。

函数 a() 的内部使用 「 DES + Base64 」 加密算法来进行第二步的处理。

 

 

 

 

 

加密的操作用 Python 可以很轻松的实现。

def encode(arg1, arg2):
    """
    加密
    :param arg1:11位手机号码|完整日期 string
    :param arg2:手机后4位+日期4位  bytes
    :return:
    """
    des = DES.new(arg2, mode=DES.MODE_CBC, iv=bytearray([1, 2, 3, 4, 5, 6, 7, 8]))
    msg = des.encrypt(pad(arg1.encode(), DES.block_size))
    # 加密后的结果,bytes
    encode_result = base64.b64encode(msg)
    # 转为string
    return str(encode_result, encoding='utf-8')

需要注意的是,b()函数的最后一行,对第二步生成的字符串进行了特殊字符的替换操作,生成 Token 之前需要对数据进行同样的处理。

 

 

 

 

 

通过以上三步操作,就可以生成网络请求中的参数 Token。

同样的方式,针对请求中的 Token,我们通过查询 token 关键字查询源码。

 

 

 

 

 

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

 

 

 

 

 

如果你细心一点,一定会发现当前实现类的包名是 Okhttp3,我们可以从 Github 下载 Okhttp3 的源码,然后进行对比,就能很清晰的知道里面的实现逻辑了。

ps: okhttp 是 Android 使用很多一个网络请求库。

 

 

 

 

 

通过对比没有混淆过的代码,可以很容易的编写出生成请求头中 Token 的逻辑。

def __get_head_token(self, method, url, data):
        """
        获取请求头Token
         分为Get和Post请求方式
        :param method: 请求方式
        :param url: 请求URL
        :param data: Post请求中的参数
        :return:
        """
        today = datetime.date.today()
        formatted_today = today.strftime('%Y%m%d')
        if method == Method.GET:
            # 请求的URL的query部分
            query_content = url.split('?')[1]
        else:
            query_content = urlencode(data)
        print('query_content:' + query_content)
        # 根据反编译后的源码增加对应的逻辑
        token_pro = query_content + "|" + formatted_today + '|zxw'
        # MD5计算
        token = md5(token_pro)
        return token

至此,这一步就完成两个 Token 的生成。

第 3 步就可以利用 Python 「 模拟发起一个请求 」, 来获取手机验证码了。

def get_code(self, timestamp):
    """
    获取验证码
    :return:
    """
    # 1.1 获取参数Token,与日期有关
    self.param_token = self.__get_param_token(self.phone)
    print("parm_token:" + self.param_token)
    # 1.2 获取请求头Token,与时间有关
    url = self.code_url.format(self.phone, timestamp, self.param_token)
    # 获取请求头中的Token
    self.head_token = self.__get_head_token(Method.GET, url, None)
    print('head_token【获取验证码】:' + self.head_token)
    # 2.获取手机验证码的URL
    get_code_url = self.code_url.format(self.phone, timestamp, self.param_token)
    # 3.修改Head中的token
    HEADERS['token'] = self.head_token
    print(get_code_url)
    # 4.发起【获取验证码】的请求
    resp = requests.get(get_code_url, headers=HEADERS)
    print('==' * 60)
    print(resp.text)

同理,后面的登录请求也是先通过抓包,使用上面生成的 Token 逻辑去修改请求头中 Token,然后模拟请求,就可以正常登录了。

def login(self, code, timestamp):
    """
    登录
    :return:
    """
    # 修改参数
    self.login_params['loginCode'] = code
    self.login_params['t'] = timestamp
    # 请求token
    # url = self.code_url.format(self.phone, timestamp, self.param_token)
    self.head_token = self.__get_head_token(Method.POST, None, self.login_params)
    print('head_token【登录】:' + self.head_token)
    HEADERS['token'] = self.head_token
    # 登录
    resp = requests.post(self.login_url, data=self.login_params, headers=HEADERS)
    print(resp.text)

4

结 果 结 论

通过模拟获取验证码的请求,等待手机收到验证码之后,输入验证码,然后再模拟登录的请求,就可以获取登录成功后的令牌。

 

 

 

 

 

由于验证码是由服务器产生的,这里没法获取生成逻辑,但是针对安卓手机可以监听通知栏消息元素,拿到短信验证码进行自动填入,就不需要人工输入了。

 

 

 

 

 

拿到登录令牌之后,理论上 App 上页面的各类网络请求都可以利用 Python 去模拟,后面提供的源码包含了一个完整抢票的流程。

理论篇| 移动端爬虫 APP逆向技术是指通过反编译、调试等手段,获取APP的内部逻辑、数据结构、加密算法等信息,进而实现对APP功能的扩展或数据抓取。APP逆向技术主要涉及以下几个方面:反编译技术:将APP的二进制文件转换回源代码,便于分析和理解。动态调试技术:在APP运行过程中,通过插入断点、查看变量值等手段,实时了解APP的运行状态。加密算法分析:针对APP中可能存在的加密算法,进行分析和破解。 阅读详情

相关推荐

apk反编译修改教程系列-----常用APK去除应用强制登录注册才可以使用的限制

许多Android应用在核心功能前强制要求用户注册或登录,这往往涉及弹窗提示、账号绑定验证或网络请求校验,导致用户体验受限。通过APK反编译,可以定位并修改smali代码或资源文件,直接绕过这些逻辑,实现无登录直接使用。根据实例修改中的操作。演示几种常用的修改步骤. 通过博文了解💝💝💝💝  1💝💝💝----apk应用修改去除登陆注册限制的几种修改案例分析 2-💝💝💝-----修改去除登陆注册限制的常用方式

小马哥的专栏 797

爬虫 — App 爬虫(一)

爬虫分类——数据来源1、PC 端爬虫(网页端爬虫)找数据接口(requests,scrapy等)selenium2、APP 端爬虫找数据接口获取数据接口——fiddler获取 APP 与服务器进行交互的数据包——模拟器appium1、界面展示2、快捷功能区1:给会话添加备注信息2:重新加载当前会话3:删除会话选项4:放行,和断点对应5:响应模式,当 fiddler 拿到远程的 response 后是缓存起来一次响应给客户端还是以 stream 的方式直接响应。

GitHub质检员 6525

【CubeMX】STM32G474 HRTIM 互补PWM与死区时间配置实战

本文详细介绍了如何使用STM32CubeMX配置STM32G474的高分辨率定时器HRTIM生成互补PWM波形并精确设置死区时间。通过实战步骤讲解时钟配置、死区计算与高级功能,帮助工程师在电机驱动和电源应用中实现精准控制,避免上下桥臂直通风险。

grpc6streamer的博客 729

超简单app爬虫

爬取(食品招商网)app www.spzs.com 里面的代理信息,web上无法显示,只能下载app 爬取流程: 1.电脑和手机连接同一个wifi,设置fiddler端口8888,设置手机wifi为手动连接,ip地址同电脑,端口同fiddler 2.手机浏览器访问 ip:端口,下载fiddler证书(我刚刚连接的时候可能是操作太快,网络无法访问,下次记得重启一下fiddler或者等待一会)...

qq_29663489的博客 7209

数据产品需求文档(PRD)怎么写?阿里P8分享的模板+5个避坑点

作用:记录文档的版本、作者、评审信息,避免“文档混乱”。填写规范字段说明示例文档名称清晰反映产品名称,如“用户行为分析平台PRD”用户行为分析平台PRD_V1.0文档版本用“版本号+日期”,如V1.0_20240301编写人数据产品经理姓名+联系方式张三(138-XXXX-XXXX)评审人员业务负责人、开发经理、数据分析师、运维负责人李四(业务)、王五(开发)、赵六(数据)、周七(运维)评审时间评审日期2024-03-05评审意见。

架构师的AI之路,分享AI应用开发架构的学习与实践。 1575

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 603

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

点击上方“AirPython”,选择“置顶公众号”第一时间获取 Python 技术干货! 阅读文本大概需要 10 分钟。1目 标 场 景在移动互联网时代,很大一部分企业抛弃了传统的网站,选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,操作页面,然后通过元素 ID 获取元素...

weixin_39719077的博客 473

Python小白避坑指南:用Ursina做3D图形,Entity的scale和color参数到底怎么调才不出错?

本文详细解析了Python Ursina引擎中Entity对象的scale和color参数调优技巧,帮助3D图形编程初学者避开常见陷阱。通过对比实验和典型场景分析,深入讲解三种缩放方式的区别、颜色定义的四种方法,以及参数组合的协同效应,助力开发者精准控制3D图形表现。

weixin_26782929的博客 413

强势推荐一位 Python 原创自动化大佬!

今天给大家推荐一位 Python 类的公众号「AirPython」,作者:星安果,果哥有 9 年的编程学习经验,热爱Python 爬虫、自动化,平时喜欢分享一些实用、有趣的 Python...

小白学视觉 549

从ViT到CLIP:OpenAI如何用4亿张图‘教会’AI看懂世界?一次讲透对比学习与Prompt工程

本文深入解析OpenAI的CLIP模型如何通过4亿图文对的对比学习实现跨模态理解,详细探讨了对比学习、数据构建、模型架构及Prompt工程等核心技术。CLIP利用Transformer架构和精心设计的Prompt模板,在Zero-Shot分类、图像检索等场景展现出强大能力,为多模态AI应用开辟新方向。

weixin_27027459的博客 372

新手必看!华为S5700交换机健康检查清单:从CPU到日志的完整巡检流程

本文为新手网管人员提供华为S5700交换机的健康检查完整指南,涵盖CPU、内存、温度、日志等核心指标的日常维护流程。通过详细的display命令和实用案例,帮助用户快速掌握设备体检技巧,确保交换机稳定运行。

weixin_29251337的博客 237

推荐一位玩自动化的 Python 爱好者

今天给大家推荐一位 Python 类的公众号「AirPython」,作者:星安果,果哥有 7 年的编程学习经验,热爱Python 爬虫、数据分析及自动化,平时喜欢分享一些实用、有趣的 ...

简说Python的博客 443

CycloneDDS(C++版本)开源代码在Linux(X86平台)系统上编译生成可执行文件的详细步骤

cyclonedds里面已经有现成的实例供我们参考,在根目录下的example目录下面,我们打开此目录,此目录下有CMakeLists.txt文件以及一些其他的文档,我们需要在此目录(example目录)下编译构建出。我们可以看到cyclonedds-cxx-master包下的example目录下有很多文件,包括CMakeLists.txt等,其中我们要构建的可执行文件所需要的源文件等就在。此过程会稍微慢一点。之后会报错,如下:(图片中是c版本出现的问题截图,不影响,c++也是这个影响,问题是一样的)

qq_42595610的博客 1252

爬虫教程( 2 ) --- scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

scrapy 教程、可视化管理工具、反爬框架、ai 爬虫

freeking101的博客 5259

从零手搓大模型(一)文本如何变成 LLM 的输入

本文介绍了从原始文本到LLM输入向量的完整处理流程。主要内容包括: 文本预处理:通过正则表达式将原始文本分割成token列表,处理标点和空格。 词表构建:创建token到ID的映射字典(vocabulary),这是文本数字化的关键步骤。 简单tokenizer实现:封装了编码(encode)和解码(decode)功能,完成文本与token ID的相互转换。 处理流程:原始文本 → 分词 → token ID → 嵌入表示 → 最终输入向量。 数据形状变化:从字符串逐步转换为(batch_size, cont

echo的博客 1005

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

推荐一位玩自动化、爬虫的 Python 硬核爱好者

今天给大家推荐一位 Python 类的公众号「AirPython」,作者:星安果,果哥有 7 年的编程学习经验,热爱Python 爬虫、自动化实战、软件测试、Web、数据分析及软件测试...

程序员小乐 435

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

爬虫 — App 爬虫(二)

类似于 selenium,找包比较困难,加密参数比较难解的时候使用。所需环境node.jsJava 的 SDK安卓的 SDKAppium 应用程序模拟器。

GitHub质检员 736

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

22.网络爬虫—APP数据抓取详讲

🧾 🧾Fiddler是一款免费的Web调试代理工具,也是目前最常用的“HTTP”抓包工具之一,它可以截取HTTP/HTTPS流量并且允许你查看、分析和修改这个流量。Fiddler在Web开发和测试中非常有用,因为它可以帮助你检查Web应用程序的性能、调试网络问题和安全漏洞。它还提供了一个可扩展的架构,使得它可以通过插件支持其他功能。Fiddler可用于Windows 、macOS 和Linux等多种操作系统。安装包提取链接,免费分享给大家:通过链接下载后,是一个压缩包 🎯对压缩包进行解压之后,一个是安

weixin_50804299的博客 1万+

手摸手带你 App 爬虫入门

你好,我是悦创。 我将选取一个一款展示数据的 App 进行讲解,将会使用 Fiddler 抓包来分析数据请求的接口,以及使用 Python 编写爬虫逻辑,最后,把数据保存到 MongDB 里面去。 公众号原文:https://mp.weixin.qq.com/s/06eKx-X87DEm5sylA7_–g 1. 准备工作 在跟随本教程开始之前,请确保你已经做完如下配置,以下是我本文的操作环境: 安装好 Python 3.6+,我这里使用的是 Python 3.7,并确保可以正常运行; Python 编译器

AI悦创·编程私教1v1 2万+

爬虫教程( 3 ) --- 手机 APP 数据抓取

1. Fiddler 设置 这是使用 fiddler 进行手机 app 的抓包,也可以使用 Charles,burpSuite 等。。。 电脑安装 Fiddler,手机 和 安装 fiddler 的电脑处于同一个网络里, 否则手机不能把 HTTP 发送到 Fiddler 的机器上来。 配置 Fiddler,允许"远程连接"。用 Fiddler 对 A...

墨鱼菜鸡 2万+

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

目 标 场 景 在移动互联网时代,很大一部分企业抛弃了传统的网站,选择将数据、服务整合到 App 端,因此 App 端无论是爬虫还是反反爬都显得尤为重要。 常见的 App 端的爬虫方式是利用 Appium 和 Airtest 驱动手机打开应用,操作页面,然后通过元素 ID 获取元素的内容,又或者借助 mitmproxy 捕获到请求的数据,最后将数据保存下来。 ...

AirPython的博客 2721

破解第一课:NOP绕过登录界面

第一步 打开软件,任意输入密码,提示“用户密码错误还有2次机会” 第二步 OD载入软件,右键-----中文搜索引擎---智能搜索 按下CTRL+F,打开查找,输入“密码错误”,在结果中双击找到的结果 回到主界面,发现验证过程是有一个跳转来实现的 注意: 1 最左边的红色圈标记的右箭头图标。>这个图标就表示:有一个跳转来到了此处。 2 上面的一小段红线表示了跳转的...

weixin_30883777的博客 5275
上一篇: Python与C语言扩展-让你的程序比别人快百倍 !
下一篇: Python趣用—配平化学方程式!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值