很高兴看到Android应用程序中越来越多采用证书固定。当我遇到一个尝试代理请求时抛出连接错误的应用程序时,我倾向于对深入研究感兴趣。我最近使用Subway应用程序时就是这种情况。反转APK可以发现证书固定在其他一些有趣的发现中。

在代理请求时启动应用程序导致此错误:
固定很容易绕过。我首先对应用程序进行反编译,然后分析用于固定关键字的源代码。实际上,我在实现X509TrustManager的两个单独的类中发现了固定实现 。这是强制固定的方法之一:
绕过此过程就像在smali代码中添加return语句以跳过上述方法中的固定代码一样简单。注意 下面的 return-void语句:
重新编译应用程序并安装后,我很惊讶地看到这个新错误:
Subway正在使用自定义应用签名验证过程,以防止其APK反转。收集源代码以提及此过程,我将其追溯到以下方法:
这是防止逆向工程的有趣尝试,尽管实际上只是造成了一点延迟。为了绕过此过程,我简单地添加了一行,通过添加另一条return-void 行来跳过方法的执行,类似于上面的固定绕过过程。
重新编译并安装应用程序后,我能够成功代理请求:
在研究期间,我偶然发现了这个Reddit帖子。显然,Subway还在确定用户的设备是否已扎根。我在源中进行了搜索,并确认提到了根检测方法。
这是一个非常重视安全性的应用程序的很好的例子,但是我不太确定根检查过程背后的原因。尽管证书固定和签名验证技术通常是一个好主意,但它们仅会稍微阻碍反向工程过程。

