防止 Android 逆向工程

信息安全 安卓 逆向工程
2021-09-07 01:29:01

我一直在特别努力寻找最有效的措施来保护 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 文件的状态或任何我不知道并且非常有趣和有用的东西,并进一步使用它来生成证明令牌?

无论这些电话做什么,很明显它非常成功并且经受住了时间的考验。

任何进一步的想法和见解都非常欢迎和赞赏。

1个回答

因此,您仍然可以对 .so 二进制文件进行逆向工程,以尝试了解有关该算法的更多信息,并查看您是否可以伪造验证令牌。请看以下软件:

https://ghidra-sre.org

https://www.hex-rays.com/products/ida/

两者都是非常强大的反编译软件,能够将机器代码 (ASM) 转换为人类可读的 C++ 以进行逆向工程。它增加了RE的难度,但并非不可能。

至于他们是怎么做到的?代码签名可用于在执行前验证代码的完整性。但是所有 .so 都是从 C/C++ 代码编译的 Linux 共享对象。因此,如果您想让攻击者难以了解有关您的模型的更多信息,您可以选择用 C++ 编写算法,然后将其作为共享对象链接到应用程序,然后在您的应用程序中导入/使用它的函数安卓项目。这将在应用程序和验证算法之间提供一层抽象。