一篇文章了解Android抓包
今天主要给大家介绍一下Android的抓包以及抓包的预防。
抓包工具方面,我们介绍两款抓包工具Profiter和Charles。
工具环境:
AndroidStudio4.2.2
移动版GooglePixel3XLAndroid11
使用Profiler工具抓包
将手机连接电脑,然后打开AndroidStudio的Profiler
NetWorkInspectorforAndroidStudioWhiteFox及以下版本位于Profiler中,NetWorkInspectorforBumblebee版本位于AppInspection中。
那么当app访问网络时,会有这样的提示:

我们选择波动,可以看到请求的信息

然后我们点击接口信息后就可以看到请求的详细信息

这样我们就可以通过AndroidStudio的Profiler轻松捕获我们App的网络信息了。
使用Charles工具抓包
1.安装证书
首先下载Charles,打开点击Help->SSLProxying->InstallCharlesRootCertificate安装根证书

然后双击该证书以信任它

至此,电脑端已经配置完毕。接下来,配置客户端。
方式一:
通过手机浏览器下载证书


在手机上设置连接wifi的代理,设置手动代理,设置charles提示的代理地址,然后charles会有提示:

然后我们同意了,那很好。
然后在浏览器中输入chls.pro/ssl即可下载证书。下载完成后,安装;但有时此方法无法安装,可以通过方法2安装。
方式二:
通过Help->SSLProxying->SaveCharlesRootCertificate将证书保存在您的计算机上

然后上传到手机上,点击设置-安全-加密和凭证-安装证书-CA证书,选择我们刚刚安装的证书。
至此,我们已经完成了安装证书的步骤。
2.抓包
此时,当我们访问网络时,就可以在Charles上看到我们访问的数据

我们可以通过左下角的Filter过滤地址,找到我们想要看到的网络数据。
防止数据包捕获
有时在我们的项目中,由于一些安全问题,我们不希望我们的应用被抓包,所以我们需要添加一些方法来防止抓包。
数据加密:
我们的接口信息可以进行数据加密,防止信息泄露。只需定义客户端和后端即可。
SSL证书验证:
该方式需要后端或运维配合获取SSL服务器证书。
1.提取证书的公钥
opensslrsa-incertificate.crt-pubout>publickey.pub
2.从publickey.pub中删除—beginpublickey—和—endpublickey—并将它们合并为一行
catpublickey.pub|grep-v’PUBLIC’|awk'{printf(“%s”,$0)}’
获得类似于以下内容的输出:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI…
3.利用2命令输出的结果,然后计算sha256摘要(下载pubkey-sha256.py)
pythonpubkey-sha256.pyMIIBIjANBgkqhkiG9w0BAQEFAAAOCAQ8AMI…
结果输出类似于
SHA256:S8Ff3JCaO4V…
将开头的SHA256:改为sha256/即可得到
sha256/S8Ff3JCaO4V…
然后在我们的OkHttp中进行配置
OkHttpClient.BuilderbuildernewOkHttpClient.Builder();
builder.certificatePinner(newCertificatePinner.Builder()
.add(“域名”,”sha256/S8Ff3JCaO4V…”)
。建造());
然后我们再次使用Charles抓包,结果是这样的:

虽然有网络请求记录,但无法捕获数据。
#####禁止代理
在Okhttp建立socket连接之前,Okhttp会获取系统的代理信息。如果设置了代理,它将通过DNS解析其IP,然后使用代理IP建立套接字连接。如果未设置代理,则将使用请求中URL的IP地址来建立连接。
/**
*获取系统范围的代理选择器。
*
*@抛出安全异常
*如果已安装安全管理器并且它拒绝
*{@linkNetPermission}{@code(“getProxySelector”)}
*@see#setDefault(ProxySelector)
*@returnthesystem-wide{@codeProxySelector}
*@since1.5
*/
publicstaticProxySelectorgetDefault(){
SecurityManagersmSystem.getSecurityManager();
如果(sm!null){
sm.checkPermission(SecurityConstants.GETPROXYSELECTORPERMISSION);
}
返回代理选择器;
}
/**
*设置(或取消设置)系统范围的代理选择器。
*
*注意:非标准协议处理程序可能会忽略此设置。
*
*@parampsTheHTTPproxyselector,或者
*{@codenull}取消设置代理选择器。
*
*@抛出安全异常
*如果已安装安全管理器并且它拒绝
*{@linkNetPermission}{@code(“setProxySelector”)}
*
*@see#getDefault()
*@since1.5
*/
publicstaticvoidsetDefault(ProxySelectorps){
SecurityManagersmSystem.getSecurityManager();
如果(sm!null){
sm.checkPermission(SecurityConstants.SETPROXYSELECTORPERMISSION);
}
theProxySelectorps;
}
OkHttp使用ProxySelector来获取代理信息,可以在构造OkHttpClient时设置。它的默认值是ProxySelector.getDefault(),它将反映系统的代理信息。那么我们可以提供自己的ProxySelector实现来实现绕过系统代理的能力。
OkHttpClientclientnewOkHttpClient.Builder()
2.proxySelector(newProxySelector(){
3@覆盖
4publicListselect(URIuri){
5returnCollections.singletonList(Proxy.NOPROXY);
6}
7
8@覆盖
9publicvoidconnectFailed(URIuri,SocketAddresssa,IOExceptionioe){
10
11}
12}).build();
设置完成后,如果使用Charles抓包,将无法再捕获应用的访问信息。
总结
在上面的内容中,我们主要介绍了两种抓包方式:
使用AndroidStudio自带的Profiler抓包
使用查尔斯
使用Charls引入了两种安装证书的方法:
使用浏览器安装证书
手动安装安装证书
防止抓包的三种方法:
数据加密
执行SSL证书验证
禁用代理
希望通过本文的讲解,您能够对抓包有所了解,并对反抓包有一个预案。
您的喜欢和关注是我最大的动力!