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

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

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

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

现在我的问题是:

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


当前回答

基本上这是不可能的。这永远不可能。然而,这是有希望的。你可以使用混淆器来实现,这样一些常见的攻击就更难执行了,包括:

重命名方法/类(因此在反编译器中,您可以获得像.a这样的类型)使控制流混乱(因此在反编译器中,代码很难阅读)加密字符串和可能的资源

我肯定还有其他的,但这是主要的。我在一家名为PreEmptive Solutions的公司工作,负责.NET混淆器。他们还有一个适用于Android的Java混淆器,一个叫做DashO的混淆器。

不过,困惑总是有代价的。值得注意的是,性能通常更差,通常需要一些额外的时间来发布。然而,如果你的知识产权对你来说非常重要,那么它通常是值得的。

否则,你唯一的选择就是让你的Android应用程序直接传递到一个承载你应用程序所有真实逻辑的服务器。这有其自身的问题,因为这意味着用户必须连接到Internet才能使用您的应用程序。

此外,不仅仅是Android有这个问题。这是每个应用商店的问题。这只是获取程序包文件有多困难的问题(例如,我不相信在iPhone上很容易,但仍然有可能)。

其他回答

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

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

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

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

如果我们想让逆向工程(几乎)不可能实现,我们可以将应用程序放在一个高度防篡改的芯片上,该芯片在内部执行所有敏感的内容,并与一些协议通信,使控制GUI在主机上成为可能。即使是防篡改芯片也不能100%防裂;他们只是设定了比软件方法高得多的标准。当然,这是不方便的:该应用程序需要一些小的USB疣来保持芯片插入设备。

这个问题并没有揭示出想要如此谨慎地保护这个应用程序的动机。

如果目的是通过隐藏应用程序可能存在的任何安全缺陷(已知或其他)来提高支付方法的安全性,那么这是完全错误的。如果可行的话,安全敏感位实际上应该是开源的。您应该尽可能方便任何审查您的应用程序的安全研究人员查找这些信息并仔细检查其操作,并与您联系。付款应用程序不应包含任何嵌入证书。也就是说,不应该有任何服务器应用程序仅仅因为设备具有来自工厂的固定证书而信任该设备。支付交易应仅凭用户的凭证进行,使用正确设计的端到端认证协议,避免信任应用程序、平台或网络等。

如果目标是防止克隆,除了防篡改芯片之外,你无法采取任何措施来保护程序不被反向工程和复制,从而使某人将兼容的支付方法融入自己的应用程序,从而导致“未经授权的客户”。有一些方法可以使开发未经授权的客户端变得困难。一种方法是基于程序完整状态的快照创建校验和:所有状态变量,所有内容。GUI、逻辑等等。克隆程序将不具有完全相同的内部状态。当然,它是一个状态机,具有类似的外部可见状态转换(可以通过输入和输出观察到),但几乎没有相同的内部状态。服务器应用程序可以询问程序:您的详细状态是什么?(即给我一个所有内部状态变量的校验和)。这可以与虚拟客户端代码进行比较,虚拟客户端代码在服务器上并行执行,并经过真正的状态转换。第三方克隆人必须复制真实程序的所有相关状态变化,才能给出正确的响应,这将阻碍其开发。

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

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