保护 Android 应用免受逆向工程

Posted

技术标签:

【中文标题】保护 Android 应用免受逆向工程【英文标题】:Protect Android App from reverse engineering 【发布时间】:2017-09-21 22:14:08 【问题描述】:

我想 100% 保护我的应用,并且不希望黑客进入内部。

这些是我从 Stack Overflow 中找到的解决方案。

    在应用中集成 Proguard

    将最重要的部分代码保留在 C/C++ 中。

    使用 NDK 将代码原生写入 .So 文件。

    使用 MD5 加密 api 密钥。

那么有没有其他方法可以完全保护我的 android 应用免受黑客攻击,或者是上述方法中的最佳解决方案。

这些是我找到的参考资料

How to avoid reverse engineering of an APK file?

How to prevent reverse engineering of an Android APK file to secure code?

【问题讨论】:

没有办法secure my app 100%。即使是最先进的 DRM 保护系统Denuvo 也将在 3 天内被黑客入侵。保护您的应用程序的唯一方法是让花太多时间对其进行重新设计毫无意义。为此,您可以使用混淆。 reverseengineering.stackexchange.com/questions/118/… 【参考方案1】:

根本没有办法完全防止对您的应用进行逆向工程。如果有足够的资源,程序最终会被逆向工程。这完全取决于你的对手的动机。

在应用程序中集成 Proguard

对逆向工程最有效的对策是混淆。这就是 Proguard 所做的(但是,我收集到的 not too well)。 Proguard 的网站说它是一个优化器,只提供最低限度的针对 RE 的保护。混淆只会使逆向工程的过程更难。它不会阻止逆向工程。

将最重要的部分代码保留在 C/C++ 中。

这是一个普遍的误解,即用本机代码编写代码会阻止逆向工程。用 C/C++ 编写代码会将您的代码编译并构建为机器语言,这比 Java 字节码更难进行逆向工程。但是,它仍然不能完全阻止它。

另外,用 C/C++ 编写代码,除非你是一个铁杆系统程序员,否则你有更多机会引入很多错误

讨厌segmentation faults memory leaks use after free

除此之外,您最终可能会在您的应用中引入大量漏洞,从信息泄露到缓冲区溢出。

允许您自己管理内存的语言(如 C/C++)非常强大。所以,它也让你更容易在脚上开枪。这就是 Java 通常被认为更安全的另一个原因(因为内存是由 JVM 在 GC 的帮助下管理的)。

因此,除非绝对需要用 C/C++ 编写代码(例如,您正在编写编解码器),否则请不要用 C 编写代码(只是为了减少逆向工程)。

使用 MD5 加密 api 密钥

MD5 是一种散列算法,可将数据散列为 16 字节字符串。它也被认为是坏的。只能用 MD5 散列,不能用它加密。

即使您使用 AES 之类的算法加密您的密钥,您也需要将密钥存储在某处以便将来解密它。攻击者可以轻松地从程序内存(运行时)或持久存储中提取密钥,然后使用它来解密您的 API 密钥。

建议

您希望防止逆向工程的代码的任何敏感部分将其移至远程服务器。比如说,你想出了一个很酷的算法,你不希望任何人对其进行逆向工程。

我建议在服务器中构建一个 REST API,它接受来自客户端的数据,运行算法并返回结果。每当您需要使用此算法时,您可以从应用程序对您的服务器进行 REST 调用,然后在您的应用程序中使用从那里获得的结果。

您的 API 密钥等所有敏感和机密数据也可以存储在服务器中,并且永远不会直接暴露在应用中。

这将确保您的代码的敏感部分不会泄露给您的对手。

【讨论】:

每个人都建议将代码放在服务器上,但这并不容易。需要一个非常强大的服务器来处理如此多的负载意味着需要更多的预算,最终您的用户将依赖互联网连接要求来使用该特定功能。 无论如何,服务器的 URL 都必须包含在 apk 中。他们总是可以冒充 android 用户并发起调用以检索密钥和其他与安全相关的项目【参考方案2】:

你可以在 Medium Protect Android App from reverse engineering. 阅读我的文章

我将向您展示如何防止 Android 应用程序被盗。我们问题的大局是应用程序的数据而不是代码,所以为什么没有内置框架可以处理混淆字符串取决于开发人员的指纹。

我知道 Proguard 是处理混淆函数和类名的框架。你知道每次我破解一个应用程序时我都不需要知道函数或类名:)

但我需要知道基本数据 URL 或屏幕上显示给用户的所有字符串。

所以保护 APK 的有效方法是使用开发人员的指纹来混淆字符串,因此当我要反编译应用程序时,如果没有原始指纹,我无法获取服务 URL 或屏幕上显示的任何重要字符串。

有一个框架可以做到这一点,叫做 StringCare https://github.com/StringCare/AndroidLibrary.

【讨论】:

以上是关于保护 Android 应用免受逆向工程的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 Android 代码免受逆向工程? [复制]

在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?

Android 保护清单和布局免受逆向工程

保护字符串常量免受逆向工程

保护字符串常量免受逆向工程

Apk 保护免受逆向工程 - 使用包名称? [复制]