如何避免反向工程的APK文件?

我正在开发针对Android的付款处理应用程序 ,并且我想阻止黑客访问APK文件中的任何资源,资产或源代码。

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

我已经使用了Android SDK提供的Proguard工具。 当我对使用签名的密钥库和Proguard生成的APK文件进行反向工程时,我得到了混淆的代码。 但是,Android组件的名称保持不变,并且某些代码(如应用中使用的键值)保持不变。 根据Proguard文档,该工具不能混淆Manifest文件中提到的组件。

现在我的问题是:

  • 我如何完全避免 Android APK的逆向工程? 这可能吗?
  • 我如何保护所有应用程序的资源,资产和源代码,以便黑客无法以任何方式破解APK文件?
  • 有没有办法让黑客更加困难甚至不可能? 我还能做些什么来保护APK文件中的源代码?

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

    AFAIK,完全避免逆向工程没有任何窍门。

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

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

    尽管如此,你可以使用不同的技巧来使黑客更加困难。 例如,使用混淆(如果它是Java代码)。 这通常会显着减缓逆向工程。

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

    正如大家所说,并且你可能知道,没有100%的安全性。 但是,谷歌内置的Android开始之地是ProGuard。 如果您可以选择包含共享库 ,则可以在C ++中包含所需的代码来验证文件大小,集成等。如果您需要将外部本机库添加到每个构建的APK库文件夹中,则可以使用它由下面的建议。

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

    <project>/libs/armeabi/libstuff.so
    

    AFAIK,你不能保护/ res目录中的文件,而不是保护它们。

    但是,您可以采取一些措施来保护您的源代码,或者至少如果不是所有内容都会执行哪些操作。

  • 使用ProGuard等工具。 这些会混淆你的代码,反编译时难以阅读,甚至不可能。
  • 将服务的最关键部分从应用程序移出,然后转移到Web服务中,并隐藏在服务器端语言(如PHP)后面。 例如,如果你有一个算法花费你一百万美元来编写。 你显然不希望人们从你的应用程序中窃取它。 移动算法并让它处理远程服务器上的数据,并使用该应用程序简单地向其提供数据。 或者使用NDK将它们本地写入到.so文件中,这些文件比apks反编译的可能性要小得多。 我不认为.so文件的反编译器现在甚至还存在(即使它确实存在,也不会像Java反编译器那样好)。 此外,正如评论中提到的@nikolay,您应该在服务器和设备之间进行交互时使用SSL。
  • 在设备上存储值时,请勿将其存储为原始格式。 例如,如果您有游戏,并且您正在用SharedPreferences存储游戏货币的金额。 假设它是10000硬币。 不要直接保存10000 ,而应使用像((currency*2)+1)/13这样的算法进行保存。 所以不是10000 ,而是将1538.53846154节省到SharedPreferences中。 然而,上面的例子并不完美,你必须努力想出一个不会损失货币的等式来舍入错误等。
  • 你可以为服务器端任务做类似的事情。 现在举一个例子,让我们来看看您的付款处理应用程序。 假设用户必须支付$200 。 与其向服务器发送$200的原始价值,不如发送一系列更小,预定义的值,这些值合计高达$200 。 例如,在服务器上有一个文件或表格,用于将文字与值相等。 因此,假设Charlie对应$47John对应$3 。 因此,不要发送$200 ,你可以发送Charlie四次, John发送四次。 在服务器上,解释它们的含义并将其添加。 这可以防止黑客发送任意值到您的服务器,因为他们不知道什么字与什么值相对应。 作为安全措施的附加措施,您也可以有类似于第3点的公式,并每n天更改一次关键字。
  • 最后,您可以将随机无用的源代码插入到您的应用程序中,以便黑客在干草堆中寻找针。 插入随机类,其中包含来自互联网的片段,或者只是用于计算随机事件的函数,如斐波那契数列。 确保这些类编译,但不被应用程序的实际功能使用。 添加足够的这些虚假类,黑客将难以找到真正的代码。
  • 总而言之,无法保护您的应用程序100%。 你可以让它变得更难,但并非不可能。 您的网络服务器可能会受到攻击,黑客可以通过监控多个交易金额和您为其发送的关键字来计算出您的关键字,黑客可以通过源代码精心查找哪些代码是虚拟的。

    你只能反击,但永远不会赢。


    在计算史上,从来没有人可以在向攻击者提供工作副本时阻止对软件进行逆向工程。 而且,大多数情况下, 它永远不可能

    有了这个理解,有一个明显的解决方案:不要把你的秘密给你的攻击者。 虽然您无法保护APK的内容,但您可以保护的是您不会分发的任何内容。 通常,这是服务器端软件,用于激活,支付,规则执行和其他多汁代码。 您可以通过不将它们分发到APK中来保护有价值的资产。 相反,建立一个服务器来响应来自你的应用程序的请求,“使用”这些资产(无论这可能意味着什么),然后将结果发送回应用程序。 如果这种模式不适用于您想要的资产,那么您可能需要重新考虑您的策略。

    另外, 如果您的主要目标是防止应用程序盗版 :甚至不打扰。 你已经在这个问题上花费了更多时间和金钱,而不是任何反盗版措施可能会希望拯救你的东西。 解决这个问题的投资回报如此之低,甚至连想都没有意义。

    链接地址: http://www.djcxy.com/p/16113.html

    上一篇: How to avoid reverse engineering of an APK file?

    下一篇: How to build an APK file in Eclipse?