我正在为Android开发一款支付处理应用程序,我想防止黑客访问APK文件中的任何资源、资产或源代码。

如果有人将.apk扩展名更改为.zip,那么他们可以将其解压缩并轻松访问应用程序的所有资源和资产,并且可以使用dex2jar和Java反编译器访问源代码。对Android APK文件进行反向工程非常容易-有关更多详细信息,请参阅堆栈溢出问题从APK文件到项目的反向工程。

我已经使用了Android SDK提供的Proguard工具。当我对使用签名密钥库和Proguard生成的APK文件进行反向工程时,我得到了混淆的代码。

然而,Android组件的名称保持不变,一些代码(如应用程序中使用的关键值)保持不变。根据Proguard文档,该工具无法混淆Manifest文件中提到的组件。

现在我的问题是:

如何完全防止Android APK的反向工程?这可能吗?我如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?


当前回答

当他们在手机上安装该应用程序时,他们可以完全访问该应用程序的内存。因此,如果你想防止它被黑客入侵,你可以尝试将其制作成这样,你就不能通过使用调试器直接获取静态内存地址。如果有地方可以写并且有限制,那么它们可能会发生堆栈缓冲区溢出。所以在他们写东西的时候尽量做到这一点,如果你必须有一个限制,如果他们发送的字符数超过了限制,如果(input>limit)则忽略,这样他们就不能把汇编代码放在那里。

其他回答

你的客户应该雇佣一个知道他们在做什么、能够做出正确决定并能够指导你的人。

上面所说的你有能力改变后端的事务处理系统是荒谬的——你不应该被允许进行这样的架构改变,所以不要期望能够这样做。

我的理由是:

由于您的域是支付处理,因此可以安全地假设PCI DSS和/或PA DSS(以及潜在的州/联邦法律)对您的业务非常重要-为了符合要求,您必须证明自己是安全的。为了不安全,然后(通过测试)发现自己不安全,再进行修复、重新测试等,直到安全性能够在合适的水平上得到验证=昂贵、缓慢、高风险的成功方法。要做正确的事情,要事先认真思考,让有经验的人才投入工作,以安全的方式发展,然后测试、修复(更少)等,直到安全性可以在合适的水平上得到验证=廉价、快速、低风险的成功方式。

只是上面已经很好的答案的补充。

我知道的另一个技巧是将有价值的代码存储为Java库。然后将该库设置为Android项目。与C.so文件一样好,但Android Lib可以。

这样,这些存储在Android库中的宝贵代码在反编译后将不可见。

我知道一些银行应用程序正在使用DexGuard,它提供了类、字符串、资产、资源文件和本地库的混淆和加密。

Android 7.0中的APK签名方案v2(Nougat)

PackageManager类现在支持使用APK签名方案v2验证应用程序。APK签名方案v2是一个完整的文件签名方案,通过检测对APK文件的任何未经授权的更改,显著提高了验证速度并加强了完整性保证。

为了保持向后兼容性,APK必须在使用v2签名方案签名之前使用v1签名方案(JAR签名方案)签名。使用v2签名方案,如果在使用v2方案签名后使用附加证书对APK进行签名,则验证失败。

APK签名方案v2支持稍后将在N开发者预览版中提供。

http://developer.android.com/preview/api-overview.html#apk_signature_v2

我如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?

APK文件受SHA-1算法保护。您可以在APK的META-INF文件夹中看到一些文件。如果您提取任何APK文件并更改其内容并再次压缩,当您在Android机器上运行新的APK文件时,它将无法工作,因为SHA-1哈希永远不会匹配。