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

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

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

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

现在我的问题是:

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


当前回答

此处同意@Muhammad Saqib:https://stackoverflow.com/a/46183706/2496464

@Mumair提供了良好的开始步骤:https://stackoverflow.com/a/35411378/474330

假设您分发到用户设备的所有内容都属于用户,这总是安全的。简单明了。你也许可以使用最新的工具和程序来加密你的知识产权,但没有办法阻止一个有决心的人“研究”你的系统。即使目前的技术可能会让他们很难获得不需要的访问权限,明天,甚至下一个小时,可能会有一些简单的方法!

因此,方程式如下:

说到钱,我们总是认为客户是不可信的。

即使在游戏内经济这么简单的情况下。(尤其是在游戏中!那里有更多“老练”的用户,漏洞在几秒钟内就扩散了!)

我们如何保持安全?

大多数(如果不是全部)关键处理系统(当然还有数据库)都位于服务器端。客户端和服务器之间存在加密通信、验证等。这就是瘦客户端的概念。

其他回答

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

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

我的理由是:

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

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

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

当您将其放在最终用户手中时,没有什么是安全的,但一些常见的做法可能会使攻击者更难窃取数据。

将主要逻辑(算法)放在服务器端。与服务器和客户端通信;确保服务器和客户端之间的通信通过SSL或HTTPS进行安全;或者使用其他技术用于密钥对生成算法(ECC和RSA)。确保敏感信息保持端到端加密。使用会话并在特定时间间隔后使其过期。加密资源并按需从服务器获取资源。或者你可以制作一个混合应用程序,通过webview访问系统,保护服务器上的资源+代码

多种方法;很明显,您必须牺牲性能和安全性。

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

这是不可能的

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

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

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

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

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

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