今天主要跟大家介绍一下Android的抓包和防止抓包
抓包工具的话介绍两款抓包工具,Profiter和Charles。
工具环境:
Android Studio 4.2.2
手机Google Pixel 3XL Android 11
使用Profiler 工具抓包
将自己的手机连接到电脑上,然后打开Android Studio 的Profiler
Android Studio 白狐及以下版本的NetWork Inspector 在 Profler 中,大黄蜂版本的NetWork Inspector 在 App Inspection中。
我们选中波动 ,可以看到请求的信息

然后我们点击接口信息之后,可以看到请求的详细信息
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31u2xrbT-1645260367204)(/Users/wyl/Library/Application Support/typora-user-images/image-20220219121841811.png)]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
这样我们就可以通过AndroidStudio 的Profiler 轻松的抓取我们App 的网络信息了。
使用Charles 工具抓包
1.安装证书
首先下载Charles ,打开之后点击Help->SSL Proxying -> Install Charles Root Certificate 安装根证书
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nzsXthvp-1645260367204)(/Users/wyl/Library/Application Support/typora-user-images/image-20220219122528121.png)]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
然后双击证书,进行信任
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3N7zzPlN-1645260367206)(/Users/wyl/Library/Application Support/typora-user-images/image-20220219122602811.png)]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
电脑端这就配置完了, 接下来配置 客户端
方式1:
手机端通过浏览器下载证书


手机端 对连接wifi 进行代理设置,设置手动代理,将charles 提示的代理地址 设置好,然后charles 就会有一个提示:

然后我们同意就好了。
然后浏览器输入chls.pro/ssl 进行下载证书,下载完成进行安装即可;不过有时候这种方式无法安装,可以通过方式2 进行安装。
方式2:
通过Help->SSL Proxying -> Save Charles Root Certificate 将证书保存在电脑上

然后上传到手机端,点击设置-安全-加密与凭证-安装证书-CA证书,选择我们刚刚的证书进行安装即可。
至此,安装证书的步骤我们就完成了。
2.抓包
我们可以通过左下角的Filter 进行地址过滤,找到我们想看的网络数据。
防止抓包
有时候在我们的项目中,因为一些安全问题,我们不想让我们app被抓包,就需要增加一些防止抓包的方法。
数据加密:
我们的接口信息可以采用数据加密的方式,防止信息泄露,这个客户端与后端定义好就可以了。
SSL证书校验:
这种方式需要后端或者运维方面配合,拿到SSL服务器证书。
1.提取证书的公钥
openssl rsa -in certificate.crt -pubout > public_key.pub
2.将 public_key.pub 内的 ---begin public key--- 和 ---end public key--- 去除,并合并成一行
cat public_key.pub | grep -v ‘PUBLIC’ | awk ‘{printf(“%s”,$0)}’
得到输出类似:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI...
3.利用2命令输出的结果,然后 计算sha256摘要 (下载pubkey-sha256.py)
python pubkey-sha256.py MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI…
得到的输出类似
SHA256:S8Ff3JCaO4V...
将开头的 SHA256: 改成 sha256/ ,得到
sha256/S8Ff3JCaO4V...
然后在我们的OkHttp中进行配置一下
OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.certificatePinner(new CertificatePinner.Builder() .add("域名", "sha256/S8Ff3JCaO4V...") .build());
然后我们再次用charles 进行抓包就会是这样的结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IMdspLgx-1645260367211)(/Users/wyl/Library/Application Support/typora-user-images/image-20220219133710557.png)]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
虽然存在网络请求记录,但是数据抓不到了。
禁止代理
Okhttp 在建立socket 连接之前,Okhttp 会获取系统的代理信息,如果设置代理,那么通过DNS解析其IP然后使用代理IP来建立socket连接。如果没有设置代理,那么会使用请求中的url的IP地址,来建立连接。
/ * Gets the system-wide proxy selector. * * @throws SecurityException * If a security manager has been installed and it denies * {@link NetPermission}{@code ("getProxySelector")} * @see #setDefault(ProxySelector) * @return the system-wide {@code ProxySelector} * @since 1.5 */ public static ProxySelector getDefault() {
SecurityManager sm = System.getSecurityManager(); if (sm != null) {
sm.checkPermission(SecurityConstants.GET_PROXYSELECTOR_PERMISSION); } return theProxySelector; } / * Sets (or unsets) the system-wide proxy selector. * * Note: non-standard protocol handlers may ignore this setting. * * @param ps The HTTP proxy selector, or * {@code null} to unset the proxy selector. * * @throws SecurityException * If a security manager has been installed and it denies * {@link NetPermission}{@code ("setProxySelector")} * * @see #getDefault() * @since 1.5 */ public static void setDefault(ProxySelector ps) {
SecurityManager sm = System.getSecurityManager(); if (sm != null) {
sm.checkPermission(SecurityConstants.SET_PROXYSELECTOR_PERMISSION); } theProxySelector = ps; }
OkHttp使用ProxySelector来获取代理信息,在构造OkHttpClient时是可以设置的,其默认值是ProxySelector.getDefault(),该默认值会反应出系统的代理信息。 那么我们就可以提供自己的ProxySelector实现来达到绕过系统代理的能力。
OkHttpClient client = new OkHttpClient.Builder() 2 .proxySelector(new ProxySelector() {
3 @Override 4 public List<Proxy> select(URI uri) {
5 return Collections.singletonList(Proxy.NO_PROXY); 6 } 7 8 @Override 9 public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
10 11 } 12 }).build();
设置玩完成之后,再用Charles进行抓包的话,已经抓取不到app 的访问信息了。
总结
上述内容我们主要介绍了两种抓包方式:
- 使用AndroidStudio 自带的Profiler 进行抓包
- 使用Charles
使用Charls 介绍了两种安装证书的方式:
- 使用浏览器安装证书
- 手动安装证书
三种防止抓包的方式:
- 数据加密
- 进行SSL证书校验
- 禁用代理
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218505.html原文链接:https://javaforall.net
