我一直在特别努力寻找最有效的措施来保护 apk 免受逆向工程和滥用。在继续我的研究时,我遇到了各种评分最高的应用程序,其中一个吸引了我大部分注意力(也许还有其他人)是 Snapchat。
现在,Snapchat 已尝试重建其安全措施并收紧结,以防止在 2017 年秋季发布后滥用其应用程序。长话短说,Snapchat 开始使用一个名为 X-Snapchat-Client Auth Token 的特殊标头来签署来自应用程序的所有请求。简单的反编译和重新编译的优点使应用程序毫无用处,它可能归结为特殊的标头,它有助于检测 Snapchat 服务器,该请求是非法的并且来自不受信任的来源,因此不应该被接受。
这个特殊的标头实际上是由一个名为libscplugin.so的特殊本机库准备的,该库在初始登录期间由应用程序调用,有助于生成标头和签署请求。经过一番挖掘,我发现这个库(它实际上是一个共享对象(.so),不像其他 .dex 文件那样容易被反编译)进行以下 java 方法调用:
- com.snapchat.android.app.shared.crypto.DeviceTokenManager.getInstance
- com.snapchat.android.app.shared.crypto.DeviceTokenManager.getDeviceToken1
这可以理解为它可能正在使用设备令牌做一些事情。
而且,还有以下调用:
- java.lang.ClassLoader.loadClass
- dalvik.system.BaseDexClassLoader.findClass
- dalvik.system.DexPathList$Element.toString
- 以及许多其他 Dalvik 和 String 方法调用
我想了解这种特殊的保护方法是什么,以及它如何帮助 Snapchat 识别未经授权的应用程序。上述方法调用象征或传达什么信息?它是试图从本机层获得 App 签名,还是试图计算 dex 文件的状态或任何我不知道并且非常有趣和有用的东西,并进一步使用它来生成证明令牌?
无论这些电话做什么,很明显它非常成功并且经受住了时间的考验。
任何进一步的想法和见解都非常欢迎和赞赏。