保护Android应用免受逆向工程

时间:2017-04-25 04:18:07

标签: android security reverse-engineering

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

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

  1. 在应用中集成 Proguard

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

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

  4. 使用MD5加密api密钥。

  5. 还有其他方法可以完全保护我的Android应用免受黑客攻击,或者是上述提及的最佳解决方案。

    这些是我找到的参考资料

    How to avoid reverse engineering of an APK file?

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

2 个答案:

答案 0 :(得分:9)

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

  

在应用程序中集成Proguard

针对逆向工程的最有效的反措施是混淆。这就是Proguard所做的事情(但是,not too well来自我的收集)。 Proguard的网站称它是一个优化器,只能再次提供最小的保护。混淆只会使逆向工程的过程更难。它不会阻止逆向工程。

  

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

这是一种普遍的误解,即在本机代码中编写代码会阻止逆向工程。用C / C ++编写代码将编译和构建代码到机器语言,而更难进行逆向工程而不是Java字节码。但是,它仍然没有完全阻止它。

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

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

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

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

  

使用MD5加密api密钥

MD5是一种散列算法,它将数据散列为16字节的字符串。它也被认为是破碎的。您只能使用MD5进行哈希处理,而不能使用它进行加密。

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

建议

您希望阻止逆向工程的代码的任何敏感部分将其移动到远程服务器。说,你已经提出了一个很酷的算法,你不希望任何人进行逆向工程。

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

所有敏感和机密数据(如API密钥)也可以存储在服务器中,不会直接在应用中公开。

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

答案 1 :(得分:1)

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

我知道Proguard可以在混淆的函数和类名称上工作的框架。您知道每次我破解应用程序时,我都不需要知道函数或类名:)

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

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

有一个可以做到的框架叫做StringCare https://github.com/MostafaAnter/AndroidLibrary