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

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

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

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

现在我的问题是:

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


当前回答

以下是一些可以尝试的方法:

使用混淆和ProGuard等工具。加密部分源代码和数据。在应用程序中使用专有的内置校验和来检测篡改。引入代码以避免在调试器中加载,也就是说,让应用程序能够检测调试器并退出/终止调试器。将身份验证分离为在线服务。使用应用程序多样性在验证设备之前,使用指纹技术,例如,来自不同子系统的设备的硬件签名。

其他回答

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

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

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

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

AFAIK,没有任何技巧可以完全避免逆向工程。

@inazaruk也说得很好:无论你对代码做了什么,潜在的攻击者都可以以她或他认为可行的任何方式修改代码。你基本上无法保护你的应用程序不被修改。您在其中放置的任何保护都可以禁用/删除。

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

不过,你可以使用不同的技巧来提高黑客攻击的难度。例如,使用混淆(如果是Java代码)。这通常会大大降低逆向工程的速度。

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

正如大家所说的,正如你可能知道的,没有100%的安全性。但谷歌内置的安卓系统的起点是ProGuard。如果您可以选择包含共享库,则可以在C++中包含所需的代码,等。如果您需要在每次构建时将外部本机库添加到APK的库文件夹中,那么你可以根据以下建议使用它。

将库放在默认为“libs”的本机库路径中您的项目文件夹。如果您为“armeabi”目标构建了本机代码,请将其放入在libs/armeabi下。如果它是用armeabi-v7a建造的,那么把它放在下面libs/armeabi-v7a。

<project>/libs/armeabi/libstuff.so

100%避免Android APK的反向工程是不可能的,但您可以使用以下方法避免提取更多数据,如源代码、APK中的资产和资源:

使用ProGuard混淆应用程序代码使用使用C和C++的NDK将应用程序核心和安全部分代码放在.so文件中为了保护资源,不要将所有重要资源都包含在APK的资产文件夹中。在应用程序首次启动时下载这些资源。

基本上,有五种方法可以保护APK文件:

隔离Java程序,加密类文件,转换为本地代码,代码混淆联机加密

我建议你使用在线加密,因为它既安全又方便。你不必花太多时间来实现这一点。

如APK Protect。这是APK的在线加密网站。它提供Java代码和C++代码保护,以实现反调试和反编译效果。操作过程简单易行。

作为一个在支付平台(包括一个移动支付应用程序(MyCheck))上广泛工作的人,我想说,您需要将这种行为委托给服务器。移动应用程序中不应存储或硬编码支付处理器的用户名或密码(以其为准)。这是您最不希望看到的,因为即使您混淆了代码,也可以理解源代码。

此外,您不应在应用程序上存储信用卡或支付令牌。一切都应该再次委托给您构建的服务。这也会让你以后更容易遵守PCI标准,信用卡公司也不会像对待我们那样,让你喘不过气来。