27

我刚刚发布了一个应用程序,一个付费应用程序,4 天后一个用户告诉我在中国有另一个网站托管我的应用程序。我从那里下载了它,它在我的设备上运行良好!

这里有帖子说人们可以更改包名称并重新发布 apk。但这不是我的情况,破解版仍然使用相同的包名。我在程序中使用了Android Vending Licensing,但是破解版根本不做授权检查。我使用 ProGuard 对其进行了混淆,但这并不能阻止黑客。

问题 #1:我根据 Google 的说明签署了 apk 文件。但是,他们仍然修改了代码并取出了许可检查部分。签署apk文件是为了防止人们篡改文件内容,我错了吗?

问题 #2:对于 Win32 .exe 程序,我曾经使用校验和来确定文件是否已被更改。它是这样工作的:创建 .exe 时,我使用一个工具来计算文件字节内容的总和,然后将其填充到文件中的某个位置,例如,文本模式“我的签名”之后的 4 个字节. 然后在运行时,程序打开 .exe 文件并计算字节总和,将其与签名后的整数进行比较。

有没有人在apk文件上尝试过这种方法?愿意分享您的经验吗?

4

4 回答 4

30

最终,Android 应用程序的内置保护非常差。这是您的最佳实践。

1) 是 谷歌建议使用代码混淆,签名编码,他们的许可证验证服务器旨在防止软件被盗。然而,它们的实施存在很大缺陷。APK 必须运行的唯一要求是对其进行签名。不管是谁签的都无所谓。没有检查您的签名是与它签署的那个。因此,要破解它,您只需删除许可证检查并使用您想要的任何证书重新签名。然后用户可以在他们的手机上加载它并选中“允许非市场应用程序”。

不要按原样使用 Google 许可。大量修改代码。添加一些新参数以在生成密钥时使用。移动代码/重新架构它。不要将 Google 许可库作为库项目包含在内。将其直接放入您的代码中。使代码尽可能细长和笨拙。添加不执行任何操作但动态修改值的函数。稍后制作其他功能将它们转换回来。在整个代码库中传播许可证验证。

如果您不执行这些步骤,则可以自动破解代码。通过执行这些步骤,至少破解者需要花时间手动破解它。这可能最多只需要几个小时。但是几个小时比立即破解标准的谷歌许可层要多得多。有些破解工具实际上只会自动下载新发布的 android 软件包,如果他们使用标准的 android 许可,破解它们并将破解的 APK 上传到这些类型的网站。通过让你的实现不是普通的实现,你会让事情变得更加困难,只需要几个小时的努力。

2)这是一种常见的抗裂技术。如果需要,您可以在 Android 上执行此操作。但它可以在大约5分钟内破解。如果你谷歌有关于如何破解这个特定技术的教程。基本上,您只需在代码中查找 CRC 调用并在 CRC 返回后删除检查。

Android 没有固有的安全性。您可以root任何手机并下载APK。您可以轻松破解 APK 以启用调试,并且只需单步执行代码即可查看您存储在代码中的任何密钥。所以最后我不会花太多时间在这上面。保护 Android 应用程序是不可能的。我只会在上面的列表中做一些常识性的事情,然后继续。

3)如果你真的很偏执,你可以在自己的许可服务器上实施自己的许可。这是我采用的方法,但不是为了保护应用程序以防被盗,而是为我提供了一种机制,可以直接从我的网站销售应用程序,这样没有 Google Play 的用户仍然可以购买我的应用程序。

于 2011-12-23T04:18:33.213 回答
12

被动/主动凿井

我同意@metalideath 的观点,即混淆和包含许可代码并非万无一失。

这是一种很容易隐藏的技术,我称之为“scuttling”,适用于部署到 Google 和 Amazon 的应用程序。Scuttling 是应用程序的前端盗版检测。一旦检测到该做什么由应用程序创建者提供。

  • 激进的凿井:例如。盗版应用程序的终止和/或警报。不一定需要网络通信。
  • 被动偷渡:无需修改应用程序。例如。启用跟踪。
  • Passive/Agressive Scuttling:细微的应用修改。例如。静默禁用关键功能。引导盗版者认为他们搞砸了,并取消发布盗版应用程序。

如果您的应用程序被重命名和/或从 Google 或 Amazon 以外的任何来源安装,则 scuttle() 返回 true。

// Dont just copy/paste this code - that is what automated crackers look for - cludge it!
// No network communication is required at runtime.
// myPackageName should decode at runtime to "com.yourpackagename"
// google        should decode at runtime to "com.android.vending";
// amazon        should decode at runtime to "com.amazon.venezia"; 

public boolean scuttle(Context context, String myPackageName, String google, String amazon)
{
  //Scallywags renamed your app?

  if (context.getPackageName().compareTo(myPackageName != 0)
    return true; // BOOM!

  //Rogues relocated your app?

  String installer = context.getPackageManager().getInstallerPackageName(myPackageName);

  if (installer == null)
    return true; // BOOM!

  if (installer.compareTo(google) != 0 && installer.compareTo(amazon) != 0)
    return true; // BOOM!

  return false; 
}

结果

以下屏幕截图取自谷歌分析,显示了一个来自 playstore (com.android.vending) 的盗版跟踪免费应用程序,该应用程序被重新部署并进行了激进的破坏(检测并终止了非 playstore 安装)。非 Playstore(未设置)跟踪下降。跟踪不是必需的,但对这些测量启用。

在此处输入图像描述

讨论

注意服务签名在破坏中发挥作用:包管理器强制使用具有唯一签名的唯一包名称。

这提出了当应用程序被凿沉(应用程序检测到盗版)时该怎么办的问题。盗版是您的应用程序病毒化(不受控制的分发)的一种形式。通过启用分析跟踪后端已经可以检测到它。Scuttling 允许应用程序创建者自定义带有或不带有跟踪的前端响应。

海盗显然可以检测到激进的凿沉行为(BOOM!)。这鼓励了进一步的开裂。被动凿井远不那么明显,但可能涉及跟踪。

盗版可能无法预防,但它是可预测、可检测和可追踪的。

追踪会给海盗带来难以克服的问题,但也会带来其自身的道德问题。

如上所述,不需要网络通信的被动/主动凿井可能是最好的解决方案。它很容易隐藏(与许可不同),并且可以定制为尽可能不明显。

于 2014-02-08T00:52:39.413 回答
1

最好的办法就是不用担心。在中国盗版的人不是你的客户,也永远不会是。如果没有可用的盗版版本,他们很可能仍然不会向您支付副本费用。除此之外,如果您的应用程序变得流行,它将被克隆,就像 iOS 应用程序一样。您已经实施的安全系统就是您所需要的,因为它们可以防止大多数用户盗版应用程序。

试图让您的应用程序防盗版只会损害代码库并使其更难维护,并可能给真正的付费客户带来问题。而是专注于推广您的应用程序,让客户更容易付费和使用。通过响应功能请求和错误报告,您可以增加人们愿意支付的价值,而不是从中国网站上寻找一些可能是木马的狡猾破解副本。

最后,将盗版报告给反病毒供应商。提供 APK 的副本。他们会将签名添加到他们的数据库中,以便将其标记为潜在危险。

于 2014-02-11T13:26:06.310 回答
0

我通过查看 Google 市场条款的理解是,您不能直接从您自己的网站销售您的应用程序,因为它违反了 Google 应用程序市场条款。我认为在您的代码中实施自定义保护是最好的方法。标准方法是无效的,因为代码很容易被反汇编

于 2012-02-04T00:37:53.260 回答