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

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

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

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

现在我的问题是:

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


当前回答

在计算历史上,当您将软件的工作副本提供给攻击者时,从未有过阻止软件逆向工程的可能。而且,在大多数情况下,这是不可能的。

明白了这一点,就有了一个显而易见的解决方案:不要把你的秘密泄露给攻击者。虽然你不能保护APK的内容,但你可以保护的是你没有分发的任何内容。通常,这是服务器端软件,用于激活、支付、规则执行和其他有趣的代码。您可以通过不在APK中分发有价值的资产来保护它们。相反,设置一个服务器来响应应用程序的请求,“使用”资产(无论这意味着什么),然后将结果发送回应用程序。如果这个模型不适用于你心目中的资产,那么你可能需要重新思考你的战略。

此外,如果你的首要目标是防止应用程序盗版,那就别费心了。你已经在这个问题上花费了比任何反盗版措施都能挽救你的时间和金钱。解决这一问题的投资回报率很低,甚至连思考都没有意义。

其他回答

这里其他被否决的答案是正确的。我只是想提供另一种选择。

对于您认为重要的某些功能,您可以在应用程序中托管WebView控件。然后,该功能将在您的web服务器上实现。它看起来像是在您的应用程序中运行的。

我可以看出这个问题有很好的答案。除此之外,您可以使用FacebookReDex来优化代码。ReDex在.dex级别工作,而ProGuard在.class级别工作。

不,不可能!

你的三个问题围绕着100%保护应用程序不被阅读。原则上这是做不到的。而且,你在尝试做这件事上投入的越多,你的体验就会越差,最终,无论哪台机器只想读你的应用。想想HTTP的HTTPS本质上有多慢,因为需要处理安全层和数学。层数越多,有人打开它的速度就越慢,但如果你真的想让它被阅读,那就永远不可能,这就是为什么它会被打包并交付的原因。

一个简单的类比是将任何给定的隐藏对象交给某人。如果那个人能看到里面的东西,那么他们就可以拍一张照片,做一些完全类似的事情。更重要的是,在代码的情况下,有足够的专业人员可以创建该对象的精确副本,即使使用完全不同的过程。

假安全感

作为一个处理应用程序,你不应该关心你认为可以在二进制代码中创建的任何安全性,也不应该关心整个系统的完整性。假设来自客户机的任何信息都可能很快变得不可靠。保持应用程序简单、流畅、快速。相反,请担心您的服务器。例如,制定一个严格的通信协议以方便地监控服务器。这是我们唯一可以依靠的。

现在,坚持我的另一个想法,如何改进服务器端。。。

嘴上的钱

我正在开发支付处理应用程序

谷歌通过使用一种简单的财务方法来“保护”谷歌Chrome,在总体上成功地避免了恶意黑客,我引述如下:

我们有50000美元的奖励,奖励参与者可以在客户模式下使用Chromebook或Chromebox进行设备持久性测试

我们真正接近100%“安全”的最佳选择是为我们的金钱价值选择正确的斗争。也许大多数人都无法提供50k的奖励,但即使是1k的奖励也会有很长的路要走,而且这也比将这些钱投资于设计任何类型的bug捕捉器要便宜得多。

投资于人工智能来识别资金流动模式,以预测潜在风险并发现小的泄漏,这也比通过任何工程来防止这两种情况要便宜得多。

明显的例外

当然,这并不能保护我们免受“疯子”和“幸运的恶作剧者”的伤害。。。但什么都不会。同时,如果设置得当,当系统重新调整时,后一组只会享受很少的时间。而一个疯子,我们只需要担心,以防它大到有一个克星。无论如何,这将是一个伟大的故事!:)

太长;没有阅读;

换言之,也许一个更好的问题可以问你自己,而不是“如何避免在我的应用程序中进行逆向工程”,而是“如何设计一个更安全的支付处理系统”,并专注于你实际想要实现的目标:一个安全的系统。

很久以前,我曾尝试写更多关于以上所有内容的文章,以回答一些问题,比如为什么我在引号中加上“安全”和“保护”(它们到底是什么意思?)。

1.如何完全避免Android APK的反向工程?这可能吗?

这是不可能的

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

当某人将.apk扩展名更改为.zip,然后在解压缩之后,某人可以轻松地获取所有资源(Manifest.xml除外),但使用APKtool,也可以获取清单文件的真实内容。同样,一个不。

3.有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?

同样,不,但你可以在一定程度上防止,

从Web下载资源并执行一些加密过程使用预编译的本机库(C、C++、JNI、NDK)始终执行一些哈希(MD5/SHA密钥或任何其他逻辑)

即使使用Smali,人们也可以使用您的代码。总而言之,这是不可能的。

如果你的应用程序如此敏感,那么你应该考虑服务器端的支付处理部分。尝试更改付款处理算法。使用Android应用程序仅用于收集和显示用户信息(即账户余额),而不是在Java代码中处理付款,请使用带有加密参数的安全SSL协议将此任务发送到您的服务器。创建一个完全加密和安全的API来与服务器通信。

当然,它也可能被黑客入侵,它与源代码保护无关,但考虑到它是另一个安全层,使黑客更难欺骗你的应用程序。