逆向最难的主要为2点,抓包和脱壳。
如果是精通安卓源码的高手,可以通过改源码将客户端https的公私钥及生成的主密钥导出,从而破解。对应的,脱壳也是,找到脱壳点,将整个app的dex,或者odex导出。
至于服务器证书校验,对apk脱壳之后,拿到证书却可。
市面上常用的反逆向及反抓包手段:
1,验证是否root,root不给打开。自安卓7.0(包含7.0)之后,需要root才能安装charles证书到系统证书中。
2,是否为模拟器,模拟器不给打开。因为模拟器特别容易抓包。
3,是否为低版本安卓,低于安卓7.0。
4,URLConnection conn = url.openConnection(Proxy.NO_PROXY)。
当然这种方式只是通过代理抓不到包,如果直接通过路由还是可以抓包的。或者直接frida hook后使用charles一样能抓到。
5,内嵌证书
这种方式要在app嵌入证书,以okhttp为例:
当okhttp使用X509TrustManager对服务器证书进行校验时,如果服务器证书的 subjectDN 和嵌入证书的 subjectDN 一致,我们再进行签名内容 signature 的比对,如果不一致,抛出异常。示例代码如下:
首先从本地读出证书,获取一个X509Certificate
val myCrt: X509Certificate by lazy {
getCrt(R.raw.my_ca)
}
private fun getCrt(@RawRes raw: Int): X509Certificate {
val certificateFactory = CertificateFactory.getInstance("X.509")
val input = ApplicationContext.resources.openRawResource(raw)
input.use {
return certificateFactory.generateCertificate(input) as X509Certificate
}
}
检查服务器证书时对比嵌入的证书
private fun getTrustManagerInRelease(): X509TrustManager {
return object : X509TrustManager {
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String?) {}
override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String?) {
val myCrt: X509Certificate = myCrt
if (chain[0].subjectDN.name == myCrt.subjectDN.name) {
if (!myCrt.signature!!.contentEquals(chain[0].signature)) {
throw SSLHandshakeException("签名不符!")
}
}
}
}
}
将自定义的 SSLSocketFactory 和 X509TrustManager 将入到 okhttp 客户端
private fun getClient(ssl: SSLSocketFactory, trustManager: X509TrustManager): OkHttpClient {
return OkHttpClient.Builder()
.retryOnConnectionFailure(true)
.proxy(Proxy.NO_PROXY)
.sslSocketFactory(ssl, trustManager)
.build()
}
这样一来便无法通过 Drony或者postern + Charles 进行抓包了
6,独立编码,数据在app编码了才传输出去,即便是解密https后,也拿不到明文,需要进入app中拿到编码和解密方法。
以下为部分测试app,用于学习使用:
1,qq音乐:
2,酷我畅听:
版本:8.0.0.1
是否内嵌证书:无
是否使用代理直连(Proxy.NO_PROXY):未设置
传输数据是否独立编码(即可查看到明确内容):少部分不可查看。
3,懒人听书
4,荔枝FM
5,蜻蜓FM
6,喜马拉雅
版本:8.0.0.1
是否内嵌证书:无
是否使用代理直连(Proxy.NO_PROXY):未设置
传输数据是否独立编码(即可查看到明确内容):少部分不可查看
7,抖音
8,快手
9,酷狗
10,酷我
11,番茄听书