sun博客

记录点滴!

逆向最难的主要为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,番茄听书

发表评论

邮箱地址不会被公开。 必填项已用*标注