准备工作
模拟器
- Google AVD(Android Studio)
- Genymotion
- 夜神模拟器:https://www.yeshen.com/(macOS 上暂不支持多开)
- 网易MuMu模拟器:http://mumu.163.com/(macOS上支持多开)
抓包工具
- Fiddler: https://www.telerik.com/fiddler(支持 Windows, Linux)
Fiddler 下方命令行中输入 bpu 域名可对指定域名进行请求包拦截处理,再次输入 bpu 可取消对该域名的拦截
Fiddler 下方命令行中输入bpafter 域名可对指定域名进行响应包拦截处理,再次输入 bpa可取消对该域名的拦截 - mitmproxy
123456789# macOS 系统安装brew install mitmproxy#基于Python 的安装pip install mitmproxy# 打开网页图形界面mitmweb# Windows 下可使用 mitmdump,并且 mitmdump 可与 Python 进行交互mitmdump -p 端口号 -s xxx.pymitmproxy -p 端口号
安装证书:http://mitm.it/,双击证书在 macOS 中搜索 mitm 设置为信任,在 Windows 中按照步骤执行安装,此时即可对 https 进行抓包的加密、解密处理;除对浏览器添加代理外,也可对 Wifi 进行代理配置
iOS 上安装证书除在通用中启用描述文件外还需在“通用>关于本机>证书信息设置”中进行启用
安卓有些手机自带浏览器无法下载或无法安装,请使用其它浏览器下载,安装可在WLAN>高级设置>安装证书路径下进行
过滤内容:在 mitmproxy 命令界面输入 f,然后输入过滤命令,再次输入 f 可退出,按下 z 可清除所有的请求
123!(~c 200) # 过滤出状态码不是200的内容~d xxx.com # 过滤出域名为xxx.com的请求~m post & ~u xxx # 过滤出类型为POST类型且包含xxx的请求
拦截请求:在 mitmproxy命令界面输入 i
12~d xxx.com & ~m get # 拦截域名为xxx.com类型为GET的请求输入回车进入请求,按下 e 可选择需要修改的内容,按下 a 继续访问
mitmdump 所配合使用的 Python 脚本示例:
12345678910111213from mitmproxy import ctxdef request(flow):# print(flow.request.headers) # 查看请求头# ctx.log.info(str(flow.request.headers)) # 以日志形式输出ctx.log.warn(str(flow.request.host))ctx.log.error(str(flow.request.url))ctx.log.error(str(flow.request.method))ctx.log.error(str(flow.request.path))def response(flow):ctx.log.error(str(flow.response.status_code))ctx.log.error(str(flow.response.text)) - Packet Capture: https://www.coolapk.com/apk/app.greyshirts.sslcapture
运行于 Android 平台,无需 root 权限 - Anyproxy
12sudo npm install -g anyproxy # 安装anyproxy -i # 启动服务
Chrome 插件: SwitchyOmega
Json 在线解析:https://www.json.cn/
Android SDK 国内代理:
1 2 |
mirrors.neusoft.edu.cn 80 |
adb(Android Debug Bridge)
真机配合 adb 使用需开启 USB 调试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
adb start-server # 启动 adb 服务 adb devices #查看设备名 adb -s 设备名 shell # 进入手机操作系统,如夜神为127.0.0.1:62001 adb -s 127.0.0.1:62001 install xxx.apk # 安装安卓包 # 查看包名 adb -s 127.0.0.1:62001 shell ll /data/app # 如显示com.instagram.android-1.apk则包名为com.instagram.android adb -s 127.0.0.1:62001 uninstall com.instagram.android # 卸载 adb connect 设备名 # 在已连接设备但通过 adb devices 未进行显示时使用 adb shell pm list package # 列出系统中的所有安装包名 adb -s 设备名 push xxx.xx /sdcard/ # 拷贝本地文件到手机上,只有一台连接设备时可省略-s adb pull /sdcard/xxx.xx ~/Desktop/ # 拷贝设备中文件到本地 adb shell screencap /sdcard/test.png # 截图 # 连接Android 手机 adb devices adb tcpip 5555 # 断开 USB连接,通过安卓手机 IP 地址进行 无线连接 adb connect 192.168.x.x adb disconnect <span class="hljs-number">192.168</span><span class="hljs-number">.x</span><span class="hljs-number">.x</span> <span class="hljs-comment"># 断开无线连接</span> adb <span class="hljs-built_in">kill</span>-server # 重新启动 adb |
uiautomator
命令行直接输入uiautomatorviewer,打开连接设备时,直接点击左上角图标获取快照,即可分析页面中相应元素的 class, resource-id 等
网友开发了改进版本:https://github.com/512433465/autotest_helper,包含快速获取 xpath、生成 Python 代码等功能
https://github.com/lazytestteam/lazyuiautomatorviewer
Appium
安装包直接下载安装服务端,也可通过 NodeJS 来安装。
注:Alan 从 GitHub 上下载安装时下载 zip 解压后安装出现问题(可能和解压工具有关),而直接下载 dmg 文件则可正常安装
1 |
npm install -g appium |
安装过程如报错(npm ERR! Failed at the appium-chromedriver@x.x.x postinstall script.)在其后添加相关参数:
1 |
npm install -g appium --unsafe-perm=true --allow-root |
安装 Appium 的Python 客户端
1 |
pip install Appium-Python-Client |
连接后点击右上角放大镜图标可进入 Inspector
Desired Capabilities 详解见:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md
获取安卓包名及启动的 Activity
方法一(aapt 路径请根据实际安装情况进行调整)
1 |
/Users/alan/Library/Android/sdk/build-tools/28.0.3/aapt dump badging /xxx.apk | grep -E 'package|launchable' |
方法二
1 2 |
adb shell logcat | grep cmp= # 打开模拟器中的应用进行查看 |
Desired Capabilities示例(macOS 上改用了网页MuMu 模拟器,版本号请在设备的设置中查询)
1 2 3 4 5 6 7 8 |
{ "platformName": "Android", "platformVersion": "6.0.1", "deviceName": "emulator-5554", "appPackage": "com.tal.kaoyan", "appActivity": "com.tal.kaoyan.ui.activity.SplashActivity" "noReset": true } |
配置好后可保存设置,点击 Start Session开启可视化界面,其间可进行录制并生成多种语言的代码,右下方还会生成元素的 id 和 xpath
SSL Pinning
但此时如添加代理访问抖音等 APP会报网络错误,那我们就需要学习SSL Pinning:
HTTPS的三种连接方式
- 根据浏览器或者操作系统(Android)自带的证书链(需要去证书机构进行购买,较少)
- 使用自签名证书(多见于内部使用,较少)
- 自签名证书加上 SSL Pinning特性
SSL Pinning,即 SSL 证书绑定,是验证服务器身份的一种方式,是在 https 协议建立通信时增加的代码逻辑,它通过自己的方式验证服务器身份,然后决定通信是否继续下去,它唯一指定了服务器的身份,所以安全性较高。
SSL Pinning 的解决方案
安装 Xposed 框架 + JustTrustMe 组件
Xposed 是一个框架,它可以改变系统和应用程序的行为,而不接触任何 APK。它支持很多模块,每个模块可以用来帮助实现不同的功能。
JustTrustMe 是一个用来禁用、绕过 SSL 证书 检查的,它基于 Xposed 模块。JustTrustMe 是将 APK 中所有用于检验 SSL 证书的 API 都进行了屏蔽,从而绕过证书检查。
注意:
- 手机必须获取 root 权限
- 安装 Xposed 框架存在一定风险(真机建议使用已集成 Xposed 框架的系统)
- 手机可以直接刷带有 Xposed 框架的系统
下载地址:
https://repo.xposed.info/module/de.robv.android.xposed.installer
https://github.com/Fuzion24/JustTrustMe
官网说明了直接安装仅支持带有 root 的权限的Android 4.0.3到4.4,因此在这个版本区间内的可直接安装,安装完 JustTrustMe 之后应记得在 Xposed 的模块中勾选启用。
对于更高版本还应参见http://forum.xda-developers.com/showthread.php?t=3034811
以Android 6.0为例,下载文件有:
https://dl-xda.xposed.info/modules/de.robv.android.xposed.installer_v32_de4f0d.apk(当前稳定版)
https://dl-xda.xposed.info/framework/sdk23/x86/xposed-v89-sdk23-x86.zip(根据自己的系统是 x86, ARM,RMB64进行对应版本选择,这里为 x86)
字体解析
在查看抖音分享页面时会看到其中的点赞数等数字使用了图标字体,而非纯文本,那该如何进行解析呢?通过代码可定位到字体文件,下载到本地并使用如下工具打开:
http://fontstore.baidu.com/static/editor/index.html
如下图所示,在相应数字上右击并点击字形信息可获取每个数字对应的 Unicode,从而通过代码进行反向解析
1 2 3 4 5 6 7 8 9 10 11 12 |
regex_list = [ {'name': ['  ', '  ', '  '], 'value': 0}, {'name': ['  ', '  ', '  '], 'value': 1}, {'name': ['  ', '  ', '  '], 'value': 2}, {'name': ['  ', '  ', '  '], 'value': 3}, {'name': ['  ', '  ', '  '], 'value': 4}, {'name': ['  ', '  ', '  '], 'value': 5}, {'name': ['  ', '  ', '  '], 'value': 6}, {'name': ['  ', '  ', '  '], 'value': 7}, {'name': ['  ', '  ', '  '], 'value': 8}, {'name': ['  ', '  ', '  '], 'value': 9}, ] |
常见问题
1、adb server version (xx) doesn’t match this client (xx); killing…
这是在使用 adb 连接夜神安卓模拟器时出现的报错,解决方案:
macOS下进入/Applications/Nox\ App\ Player.app/Contents/MacOS/,备份 adb 文件,然后将platform-tools目录下的 adb 文件拷入该目录中
Windows 方法类似,不同的是需拷贝adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll多个文件
2、Original error: UIAutomation2 is only supported since Android 5.0 (Lollipop). You could still use other supported backends in order to automate older Android versions.
在使用 Appium 时遇到的这个问题,针对Mac 上的夜神 模拟器暂无解决方案,根据网上的做法改用了网易 MuMu 模拟器,执行如下命令进行连接:
1 |
adb kill-server && adb server && adb shell |