Android应用程序在上传至Play Sotre之前,开发者需要先使用私钥来对其进行签名。每一个私钥都与一个公共证书进行绑定,而设备和服务都需要利用这个证书来验证应用程序来自一个可信的源。应用程序更新同样依赖于这个签名机制,因为更新程序的签名必须跟已安装App的签名相同,才能完成更新。
然而,在Play Store中发布APK其实是非常简单的。广大开发人员可以通过在根设备中下载APK来获取到APK文件,或者通过网站爬虫的方法来从Play Store中获取同一应用程序的所有不同版本的APK文件。当你拿到APK文件之后,我们就可以通过apktool和反编译器并使用自己的证书来修改这个应用程序,然后对其进行重新封装和打包。
从防御端的角度来看,应用程序开发人员会试图通过检查当前应用程序签名证书是否与目标App所使用的签名证书相同。这确实是一种有效的机制,但其缺点就是需要依赖系统API来获取应用程序签名密钥。在静态分析中,我们可以通过系统API来获取签名证书,并帮助我们定位到需要进行检测的地方,以便更好地实现安全防御。在动态分析中,我们有现成的钩子脚本可以快速绕过应用程序中的这种防御机制。比如说,RASP(运行时应用程序自我保护)就可以提供更好的安全机制来防止这种篡改操作,但在本文中我们对此不做赘述。
在这篇文章中,我们将围绕一种更加有效的检测方式来检查 Android 应用程序中的篡改行为,并且减少对系统API的依赖。
下面给出的是我们在完成这个任务时所要满足的要求