ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

移动应用抓包实战:从网络流量中获取Token实现自动化交互

移动应用抓包实战:从网络流量中获取Token实现自动化交互 1. 项目概述从“某鱼”Cookie说起最近在技术社区和论坛里经常看到有朋友在讨论如何获取“某鱼”这类移动应用的Cookie特别是其中的token字段。这背后反映的其实是一个更普遍的技术需求如何与那些没有开放官方API的移动应用进行自动化交互。无论是为了数据聚合、价格监控还是实现一些个性化的提醒功能绕过官方限制直接与应用的后台服务器“对话”往往是最高效的路径。而这一切的起点就是获取一个有效的身份凭证——Cookie或Token。简单来说Cookie和Token都是服务器用来识别客户端身份的“通行证”。在Web时代Cookie是浏览器自动管理的一套机制而在App主导的移动时代Token尤其是JWT格式的Token因其无状态、易于跨域等特性成为了更主流的选择。当你打开“某鱼”App输入账号密码登录成功后App就会从服务器拿到一个Token并在后续的每一次请求中比如刷新商品列表、发送消息都把这个Token放在请求头里告诉服务器“我是刚才登录的那个用户”。我们要做的就是把这个Token“偷”出来为我们自己的脚本或程序所用。这个过程听起来有点“黑客”的味道但实际上它更接近于“逆向工程”和“协议分析”的范畴。我们并不破解任何加密也不攻击服务器只是作为一个“中间人”观察并记录下App与服务器之间正常的网络通信从中提取我们需要的信息。这就像是在邮局检查站记录下每一封合法信件的邮票样式和邮戳然后仿制出同样的邮票让自己的信件也能被顺利投递。本文就将以一个技术实践者的角度详细拆解从“某鱼”App获取Token的全过程包括工具选择、操作步骤、核心原理以及那些容易踩坑的细节。2. 核心思路与工具选型为何选择抓包在决定动手之前我们必须先想清楚技术路线。获取App内通信数据主流方法无外乎几种逆向分析App代码、Hook关键函数、或者直接抓取网络流量。对于“某鱼”这类大型商业应用其代码通常经过混淆和加固逆向分析门槛极高非专业安全研究人员难以在短时间内搞定。Hook技术如使用Frida虽然强大但需要对移动端开发和逆向有较深理解且环境配置复杂。相比之下网络抓包Packet Capture是性价比最高、最直观的方法。它的原理非常简单让目标App的所有网络流量都经过我们控制的代理服务器我们就能像查看监控录像一样清晰地看到每一次请求和响应的所有细节包括我们梦寐以求的Authorization头里的Token。这种方法不触及App本身代码风险低且学习曲线平缓。只要App没有使用证书绑定Certificate Pinning等高级反抓包手段或者我们能成功绕过这些手段抓包就是一条康庄大道。基于这个思路我们的工具链就清晰了代理服务器作为流量中转站。Charles或Fiddler是桌面端老牌且强大的选择它们提供图形化界面能直观地查看、修改HTTPS/HTTP请求。mitmproxy则是一个基于Python的命令行工具更轻量适合自动化脚本集成。移动设备运行目标App的设备。可以是真实的安卓/iOS手机也可以是安卓模拟器如夜神、雷电。模拟器的好处是环境纯净便于重置和测试。证书为了解密HTTPS流量必须在移动设备上安装并信任抓包工具生成的CA证书。这是整个过程中最关键也最容易出错的一步。我个人的选择是Charles 安卓模拟器的组合。Charles的界面友好过滤和搜索功能强大对于初次尝试者非常友好。安卓模拟器避免了在真机上折腾的麻烦也方便进行多次重复实验。接下来我们就以这个组合为例展开详细的操作流程。3. 环境搭建与代理配置工欲善其事必先利其器。一个稳定、透明的代理环境是成功抓包的基础。3.1 Charles的安装与基础配置首先在你的电脑Windows/Mac均可上下载并安装Charles。启动后你需要进行几个关键设置开启SSL代理进入Proxy - SSL Proxying Settings...。在SSL Proxying标签页中勾选Enable SSL Proxying。然后点击Add在Host里填入*Port里填入443。这表示Charles将对所有域名*的443端口HTTPS默认端口的流量进行SSL代理解密。这是一个通配符设置省去了为每个域名单独添加的麻烦。获取本机IP地址在Charles的菜单栏点击Help - Local IP Address可以看到你电脑在当前局域网内的IP地址例如192.168.1.100。记下它稍后需要在手机上设置代理时用到。设置代理监听端口默认端口是8888。你可以在Proxy - Proxy Settings...里确认或修改。通常保持默认即可。注意首次启动Charles它会请求为系统添加一个防火墙例外务必允许。同时Charles会生成一个唯一的CA证书这个证书是我们解密HTTPS流量的“尚方宝剑”。3.2 安卓模拟器与代理设置我使用的是夜神模拟器。启动后我们需要让模拟器的网络流量走Charles代理。在模拟器内打开设置 - WLAN。长按当前已连接的Wi-Fi网络通常是WiredSSID或类似名称选择修改网络。在高级选项中将代理设置为手动。代理服务器主机名填写你之前在Charles里查到的电脑IP如192.168.1.100。代理服务器端口填写Charles的监听端口默认8888。保存设置。此时模拟器的所有HTTP流量应该已经指向Charles了。你可以在Charles里看到一些来自模拟器的连接请求。但为了解密HTTPS最关键的一步来了安装CA证书。3.3 安装并信任CA证书这是整个抓包流程中最容易“卡壳”的环节特别是对于安卓7.0以上的系统。下载证书在电脑浏览器中访问chls.pro/ssl。这个地址是Charles提供的证书下载页。你会在模拟器的浏览器中访问这个地址确保模拟器代理已设置正确。安装证书下载完成后系统会提示你安装证书。证书名称可以任意比如“Charles Proxy”。在安装过程中系统可能会要求你设置锁屏密码如果之前没设过这是系统安全策略照做即可。将证书移至系统信任区关键对于安卓7.0及以上版本用户安装的证书默认只对用户应用有效而很多App包括“某鱼”会将自己设置为系统级应用或使用网络安全配置只信任系统证书。因此我们需要将Charles的CA证书安装到系统信任区。在模拟器设置中找到安全 - 加密与凭据 - 从存储设备安装证书 - CA证书。系统会要求你选择一个证书文件。你需要找到刚才下载的证书文件通常位于Downloads目录文件后缀可能是.pem或.crt。选择并安装。安装成功后你可以在系统受信任的凭据 - 用户或系统标签页下找到名为“Charles Proxy…”的证书。实操心得很多抓包失败的情况都源于证书没有正确安装到系统信任区。如果你在后续步骤中只能看到一堆CONNECT请求和乱码而看不到明文的HTTPS请求内容十有八九是证书问题。可以尝试重启模拟器和Charles并反复确认证书安装位置。4. 抓包实战与Token定位环境配置妥当后我们就可以开始真正的狩猎了。4.1 启动抓包与过滤请求在Charles中确保Proxy - macOS Proxy或Windows Proxy是未勾选状态我们只监听模拟器的流量。点击工具栏上的“扫帚”图标清除当前会话记录然后点击“红色圆点”图标开始录制流量。回到模拟器打开“某鱼”App进行登录操作。输入你的账号密码强烈建议使用测试账号而非主力账号完成登录过程。此时Charles的界面会瞬间被大量的网络请求刷屏。为了快速定位到登录和携带Token的请求我们需要使用过滤功能。在Charles左侧的Structure视图按域名组织或Sequence视图按时间顺序中寻找与“某鱼”相关的域名。常见的可能包含*.taobao.com*.alicdn.com 以及*.idlefish.*等二级域名。你可以通过域名关键词如“fish”、“login”、“user”进行初步筛选。更有效的方法是使用Charles的Focus功能。在左侧请求列表的域名上右键选择Focus。这样Charles会隐藏所有其他域名的请求只显示你关注的这个域名的流量视野瞬间清晰。4.2 分析登录请求与响应在聚焦的请求列表中寻找在登录动作发生时出现的POST请求。其路径Path很可能包含/login、/auth、/token等关键词。点击这个请求在右侧面板查看详情。Overview标签查看完整的请求URL、方法、状态码登录成功通常是200。Contents标签这是核心。Request子标签查看Form或JSON标签页这里能看到登录时提交的表单数据如username、password、client_id、grant_type等。注意绝对不要记录或分享真实的密码字段。Response子标签查看JSON或Text标签页。登录成功的响应体Response Body里极有可能就包含着我们要找的Token它通常是一个很长的、由字母数字组成的字符串字段名可能是access_token、token、Authorization或者嵌套在data对象里。4.3 定位Token在后续请求中的使用方式获取Token不是终点知道怎么用它才是关键。Token通常不会在每次请求的Body里而是放在HTTP请求头Headers中。继续在Charles中操作“某鱼”App比如搜索一个商品、进入个人中心。观察在登录成功之后发出的请求。点击任意一个这类请求查看其Contents标签下的Request-Headers子标签。你需要仔细浏览请求头列表寻找一个携带了长字符串的Header。最常见的字段是Authorization其值通常为Bearer 你的token或Token 你的token。Cookie有时Token也会被设置在Cookie里字段名可能是token、SESSION或其它自定义名称。一些自定义Header如X-Auth-Token、X-Access-Token等。找到它这个Header和其中的Token值就是你的脚本模拟请求时需要复制的“尚方宝剑”。你可以右键这个请求选择Copy cURL Request就能得到一个完整的命令行请求其中已经包含了所有必要的Header非常方便。5. 常见问题排查与高级技巧即使按照步骤操作你也可能会遇到一些问题。下面是一些典型的“坑”及其解决方案。5.1 抓不到HTTPS明文请求症状只能看到对域名的CONNECT请求具体请求内容都是乱码或显示SSL Proxying not enabled for this host。排查证书信任这是首要怀疑对象。确保Charles的CA证书已正确安装到模拟器的系统信任区而不仅仅是用户证书。可以尝试在模拟器系统设置中删除证书重新从chls.pro/ssl下载并安装到系统区。SSL代理设置检查Charles的SSL Proxying Settings是否已启用并且添加了*:443的通配符规则。App证书绑定越来越多的App使用了证书绑定Certificate Pinning技术即App代码里硬编码了只信任特定的服务器证书或CA导致不信任我们安装的Charles证书。对于“某鱼”这类大型App很有可能启用。解决方案尝试旧版App有时旧版本App的反抓包措施较弱。可以尝试寻找并安装一个历史版本。使用虚拟环境在已Root的安卓设备或模拟器上使用Xposed框架配合JustTrustMe或SSLUnpinning模块可以动态禁用证书绑定。这是绕过强校验的常用方法但需要一定的动手能力。使用mitmproxy等高级工具mitmproxy社区有一些脚本可以对抗特定的证书绑定方案。5.2 登录请求被加密或签名症状你能抓到登录的POST请求但请求体Request Body是一串毫无规律的密文或者除了账号密码还带了一堆看不懂的sign、_s、t等参数。分析这是App为了防爬虫做的第二道防线——请求签名。客户端会在发送前将请求参数有时还包括时间戳、设备信息等按照服务器约定的算法计算出一个签名signature服务器收到后以同样算法验签不一致则拒绝。这个算法可能写在App的代码里。应对策略直接复用对于简单的脚本最实用的方法不是去逆向算法而是直接“抄袭”。用抓包工具如mitmproxy写一个脚本拦截登录请求将其中加密的请求体或签名参数原封不动地记录下来。在你的脚本中直接使用这个抓取到的、有效的“请求体快照”去模拟登录。缺点是Token过期后需要重新抓取。逆向分析如果追求完全自动化就需要对App进行逆向找到签名算法。这涉及反编译使用apktool、jadx、代码分析、可能还有算法还原难度较大。寻找漏洞观察签名参数是否与时间戳强关联但校验不严或者尝试重放攻击即直接使用一次抓到的有效请求包多次发送但成功率低且易触发风控。5.3 Token过期与刷新机制问题辛辛苦苦拿到的Token用了几天甚至几小时就失效了。原理出于安全考虑Token都有有效期。Access Token访问令牌有效期较短如2小时Refresh Token刷新令牌有效期较长如30天。当Access Token过期可以使用Refresh Token去获取一个新的Access Token而无需用户重新登录。如何发现在抓包时注意观察登录响应。除了access_token很可能还有一个refresh_token。当收到401 Unauthorized错误时App会自动发起一个到特定刷新端点如/oauth/refresh的请求用refresh_token换取新的access_token。脚本处理一个健壮的自动化脚本必须处理Token刷新。逻辑是发起业务请求 - 若返回401 - 使用存储的refresh_token调用刷新接口 - 获取新的access_token- 更新脚本中的Token值 - 重试原来的业务请求。6. 从Token到自动化脚本成功获取并理解了Token的来龙去脉后我们就可以用任何喜欢的编程语言Python、Node.js等来编写自动化脚本了。这里以Python的requests库为例展示核心步骤import requests import time # 1. 从抓包结果中提取的固定Token示例已脱敏 ACCESS_TOKEN eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... # 以及可能需要的其他固定Header如User-Agent模拟App HEADERS { User-Agent: Your-Fishy-App/7.5.0 (iPhone; iOS 15.4; Scale/3.00), Authorization: fBearer {ACCESS_TOKEN}, # 或 Token {ACCESS_TOKEN} Content-Type: application/json, } # 2. 封装一个带Token的请求函数 def make_authenticated_request(url, methodGET, paramsNone, json_dataNone): 发起携带认证Token的请求 try: response requests.request( methodmethod, urlurl, headersHEADERS, paramsparams, jsonjson_data, timeout10 ) # 检查Token是否过期 if response.status_code 401: print(Token可能已过期需要刷新或重新获取。) # 这里可以加入刷新Token的逻辑 # new_token refresh_token(REFRESH_TOKEN) # HEADERS[Authorization] fBearer {new_token} # 然后重试请求... return None response.raise_for_status() # 如果状态码不是200抛出异常 return response.json() # 假设返回的是JSON except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None # 3. 使用示例获取“我的”页面信息假设API端点 if __name__ __main__: my_info_url https://api.某鱼.com/v1/user/myinfo data make_authenticated_request(my_info_url) if data: print(f获取用户信息成功: {data})重要提醒与伦理边界技术是一把双刃剑。通过抓包获取Token进行自动化操作可能违反目标App的《用户服务协议》。本文内容仅限用于学习、测试和研究目的以及对自己拥有合法账户的数据进行访问。严禁用于商业爬虫对服务器造成负载压力。侵犯他人隐私或获取非公开数据。进行欺诈、刷单等违法活动。绕过正常付费机制。 务必控制请求频率做到“君子爬虫”避免对他人服务造成影响。在实际项目中优先寻找并申请官方API永远是第一选择。
返回列表