饿了麽 APP 逆向及爬虫实现详参

 

From( 燕幕自安 ):https://zhuanlan.zhihu.com/p/91150834

燕幕自安 专栏:https://zhuanlan.zhihu.com/yanmuzian

 

爬虫必备工具,掌握它就解决了一半的问题:https://zhuanlan.zhihu.com/p/39340856

App 爬虫必备技能:三步完成 Android 逆向:https://zhuanlan.zhihu.com/p/80733843

 

 

 

一、前言

 

今天主要以饿了麽为例,讲解一下APP逆向的大致流程,以及遇到问题的处理办法。

还没关注的朋友,关注我微信公众号“燕幕自安”不迷路。

 

 

二、概述

 

APP 逆向的目的是为了了解 APP 本身的运行逻辑,进行修改或进行还原。涉及到的技术和工具,见下图。

饿了麽 APP 逆向及爬虫实现详参_第1张图片

对于抓包我就不详细讲了,不清楚的看一下我之前的文章。

HTTPS抓包与手机抓包,看这一篇就够了:https://mp.weixin.qq.com/s?__biz=MzI1MTMzNTM0OQ==&mid=2247483886&idx=1&sn=42bd9494dcd9f7ea3dd058da51e22a26

HTTPS就不能抓包了?开什么玩笑!:https://mp.weixin.qq.com/s?__biz=MzI1MTMzNTM0OQ==&mid=2247483701&idx=2&sn=892c548fd7d6970f50cb1f11cbf3a562

好了,下面我们干正事,讲饿了麽。

 

 

三、需求

 

通过还原APP接口,获取附近商家。

但因为饿了么查看商家必须登录,故需要先逆向登录接口。

四、抓饿了麽的包

打开 PacketCapture,选择饿了麽,打开饿了麽APP。

饿了麽 APP 逆向及爬虫实现详参_第2张图片

这是为什么?断网了?

这种情况主要是因为抓包引起的,APP 本身做了 HTTPS 证书校验,简单的可以通过插件解决,办法参见以前的文章。

Xposed+JustTrustMe关闭 SSL 证书验证:https://mp.weixin.qq.com/s?__biz=MzI1MTMzNTM0OQ==&mid=2247483922&idx=1&sn=d22096a75e757f551f37c9824b166bc1

 

好了解决了抓包问题,那就能找到登陆的接口了。

通过抓包,得到登录步骤为:

  1. 请求发送短信
  2. 需要图形验证码,请求图形验证码
  3. 带验证码请求发送短信
  4. 带短信验证码登录(登陆完成拿到cookie)
  5. 获取附近商家

每一步的接口如下:

  1. URL:https://restapi.ele.me/eus/login/mobile_send_code
  2. URL: https://restapi.ele.me/eus/v4/captchas?captcha_str={手机号码}
  3. URL:https://restapi.ele.me/eus/login/mobile_send_code
  4. URL:https://restapi.ele.me/eus/login/login_by_mobile
  5. URL:https://restapi.ele.me/shopping/v3/restaurants?extras[]=identification&extras[]=coupon&latitude=32.29290046542883&longitude=110.04603732377291&city_id=3&rank_id=b1969c73a19b4dc68b31628ea85d8eaf&network_operator=&network=WIFI&order_by=5&extra_filters=home&os=Android%2F6.0.1&deivce=Nexus%206P&weather_code=PARTLY_CLOUDY_DAY&offset=0&limit=20

直接看参考答案的感觉怎么样?

 

 

五、参数分析

 

对于抓包的相关参数(自己看报文就能知道,我没有写header参数和url参数),中间很多是我们一眼就能看出来的比如时间戳、机型、坐标、固定值等,需要逆向的主要有以下几个。

x-eleme-requestid、x-deviceinfo、deadpool相关三个参数

 

 

六、逆向分析

 

参数 x-eleme-requestid

在 jadx 中打开饿了麽 APP,搜索关键字x-eleme-requestid

饿了麽 APP 逆向及爬虫实现详参_第3张图片

看到四个,不多。

按道理来说,应该先看第四个,但是后来并没有找到a的生成位置。好我们看一下二、三。(OS:“你为啥不看一”)

饿了麽 APP 逆向及爬虫实现详参_第4张图片

看到 a 是个 static 变量,那就得看一下谁调用他了,右键 find usage。

饿了麽 APP 逆向及爬虫实现详参_第5张图片

会心一笑。手到擒来。解释一下。

饿了麽 APP 逆向及爬虫实现详参_第6张图片

点进去看一下。

饿了麽 APP 逆向及爬虫实现详参_第7张图片

我个憨憨!!! 装逼失败

好了,不要在意这些细节。我们点进去这个a()看看。

饿了麽 APP 逆向及爬虫实现详参_第8张图片

清清楚楚,国际通用的算法 UUID 去掉短杠后加上竖杠再加时间戳。

参数 x-deviceinfo

打眼一看,这是啥,base64啊!对x-deviceinfo进行base64解密,可得到:

均是设备基本信息,按照格式生成即可,注意要和外部其他设备基本信息保持一致。

 

deadpool相关三个参数

一共三个参数,分别为:

搜索 deadpoolcontent。

饿了麽 APP 逆向及爬虫实现详参_第9张图片

又是hashmap.put,为什么我们要对他敏感,因为它和我们的目标关键字呆在一起的时候,很可能就是给header里构造参数的啊。我们点开第二个看一眼。

饿了麽 APP 逆向及爬虫实现详参_第10张图片

继续找这个sneer函数。(我总觉得他这个函数叫这个名字是故意鄙视我的。)

饿了麽 APP 逆向及爬虫实现详参_第11张图片

函数

饿了麽 APP 逆向及爬虫实现详参_第12张图片

好了,在 libuiseris.so 里面,这就麻烦了,要还原这个算法有三种办法。

  1. 硬刚。逆向so。我后来看了下,so有反调试,so里面又调了java层的函数,还原比较麻烦一些。
  2. 利用。hook这个sneer函数,找到他的方法地址,在你的代码需要的时候,发请求到手机里,手机进行调用执行,计算完以后返回给外部。
  3. 虚拟。虚拟环境执行so中的sneer方法,可参见github上的Unicorn这个项目。

我用的是第二个办法,在手机里面起了HTTP服务,接受请求计算后返回给外部。

 

 

 

你可能感兴趣的:(python,爬虫相关)