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

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

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

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

现在我的问题是:

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


当前回答

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

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

我的理由是:

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

其他回答

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

那是不可能的

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

开发人员可以采取一些措施,例如使用ProGuard之类的工具来混淆他们的代码,但到目前为止,要完全阻止某人对应用程序进行反编译还是相当困难的。

这是一个非常棒的工具,可以增加“反转”代码的难度,同时缩小代码的占地面积。

集成ProGuard支持:ProGuard现在与SDK工具一起打包。开发人员现在可以将其代码作为发布构建的集成部分进行模糊处理。

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

在研究期间,我了解了HoseDex2Jar。此工具将保护您的代码不被反编译,但似乎不可能完全保护您的。

一些有用的链接,你可以参考它们。

Proguard、Android和许可服务器保护Android LVL应用程序堆栈溢出问题:保护Android应用程序不受反向工程的影响真的不可能吗?堆栈溢出问题如何防止Android APK文件反向工程以保护代码?

完全避免逆向工程是不可能的,但通过在内部使其更加复杂,攻击者可能更难看到应用程序的清晰操作,这可能会减少攻击向量的数量。

如果应用程序处理高度敏感的数据,则存在各种技术,这些技术会增加代码反向工程的复杂性。一种技术是使用C/C++来限制攻击者容易进行的运行时操作。有大量的C和C++库非常成熟,易于集成,Android提供JNI。

攻击者必须首先绕过调试限制,才能在较低级别上攻击应用程序。这增加了攻击的复杂性。Android应用程序应在应用程序清单中设置Android:debuggable=“false”,以防止攻击者或恶意软件轻易地进行运行时操作。

跟踪检查–应用程序可以确定调试器或其他调试工具当前是否正在跟踪它。如果被跟踪,应用程序可以执行任意数量的可能的攻击响应动作,例如丢弃加密密钥以保护用户数据、通知服务器管理员或其他此类类型的响应以试图自卫。这可以通过检查进程状态标志或使用其他技术来确定,如比较ptrace附件的返回值、检查父进程、进程列表中的黑名单调试器或比较程序不同位置的时间戳。

优化-为了隐藏高级数学计算和其他类型的复杂逻辑,利用编译器优化可以帮助混淆目标代码,使其不易被攻击者分解,从而使攻击者更难理解特定代码。在Android中,这可以通过使用NDK本地编译的库更容易地实现。此外,使用LLVM混淆器或任何保护器SDK将提供更好的机器代码混淆。

剥离二进制文件–剥离本机二进制文件是一种有效的方法,可以增加攻击者查看应用程序低级功能组成所需的时间和技能水平。通过剥离二进制文件,二进制文件的符号表被剥离,这样攻击者就无法轻松调试或反向工程应用程序。您可以参考GNU/Linux系统上使用的技术,如sstriping或使用UPX。

最后,您必须了解混淆和ProGuard等工具。

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

这是不可能的

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

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

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

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

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

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

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

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

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

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