我刚刚发布了一个应用程序,一个付费应用程序,4天后用户告诉我,中国有另一个网站托管我的应用程序。我从那里下载了它,它在我的设备上运行正常!
这里有帖子说人们可以更改包名并重新发布apk。但这不是我的情况,破解版仍然使用相同的包名。我在程序中使用了Android Vending Licensing,但破解版本根本不进行许可检查。我使用ProGuard来混淆它,但这并没有阻止黑客。
问题#1:我根据Google的说明签署了apk文件。但是,他们仍然修改了代码并取出了许可检查部分。签署apk文件是为了防止人们篡改文件内容,这是错误的吗?
问题#2:对于Win32 .exe程序,我曾经使用校验和来确定文件是否已被更改。这是它的工作原理:当创建.exe时,我使用工具计算文件的字节内容之和,然后将其填充到文件中的某个位置,例如,文本模式“MY SIGNATURE”之后的4个字节。然后在运行时,程序打开.exe文件并计算字节总和,将其与签名后的整数进行比较。
有人在apk文件上尝试过这种方法吗?关心分享您的经历?
答案 0 :(得分:28)
最终,Android内置应用的内置保护功能非常差。以下是您的最佳做法。
1)是的,谷歌建议使用代码混淆,签名编码及其许可证验证服务器,旨在防止软件被盗。然而,它们的实施存在很大缺陷。 APK必须运行的唯一要求是签名。谁签了它并不重要。没有检查您的签名是否与其签名。因此,要破解它,您只需删除许可证检查并使用您想要的任何证书重新签名。然后用户可以在手机上加载“允许非市场应用”。
请勿按原样使用Google许可。大量修改代码。添加一些在生成密钥时使用的新参数。移动代码/重新构建它。不要将Google许可库包含为库项目。直接把它放在你的代码中。使代码尽可能细长和克隆。添加无效的函数,但动态修改值。稍后再制作其他功能以将其转换回来。在整个代码库中传播许可证验证。
如果您不执行这些步骤,则可以自动破解代码。通过这些步骤,至少裂解装置需要花时间手工破解它。这可能最多只需要几个小时。但是,花费几个小时比立即破解标准Google许可层要花费更多时间。有一些破解工具实际上只是自动下载新发布的Android软件包,如果他们使用标准的Android许可,请破解它们并将破解的APK上传到这些类型的网站。通过使您的实现不是vanilla实现,您可以更加努力,只需要花费几个小时的努力。
2)这是一种常见的防裂技术。如果需要,您可以在Android上执行此操作。但它可以在大约5分钟内破解。如果你谷歌有关于如何破解这种特定技术的教程。基本上,您只需在代码中查找CRC调用,并在CRC返回后删除检查。
Android没有固有的安全性。您可以root任何手机并下载APK。您可以轻松破解APK以启用调试,只需单步执行代码即可查看代码中存储的任何密钥。所以最后我不会花太多时间在这上面。安全的Android应用程序是不可能的。我会在上面的列表中做常识并继续前进。
3)如果你真的很偏执,你可以在自己的许可服务器上实现自己的许可。这是我采取的方法,但不是为了保护应用程序的盗窃,因为它是给我一个直接从我的网站销售应用程序的机制,所以没有Google Play的用户仍然可以购买我的应用程序。
答案 1 :(得分:10)
我同意@metalideath认为,混淆和清理许可代码并非万无一失。
这是一种易于隐藏的技术,我称之为“scuttling”,适用于部署到Google和亚马逊的应用。 Scuttling是应用程序的前端盗版检测。检测到的内容是应用创建者的推荐。
如果您的应用是从Google或亚马逊以外的任何来源重命名和/或安装的,则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!)。这鼓励进一步破解。被动凿沉不太明显,但可能涉及跟踪。
盗版可能无法预防,但它是可预测的,可检测的和可追踪的。
跟踪可能会给海盗带来难以逾越的问题,但也会出现其自身的道德问题。
如上所述,无需网络通信的被动/侵略性凿沉可能是最佳解决方案。它很容易隐藏(与许可不同),并且可以定制为尽可能不显眼。
答案 2 :(得分:2)
最好的办法就是不用担心。在中国盗版的人不是你的顾客,也不会是你的顾客。如果没有可用的盗版版本,他们仍然不会支付你的副本费用。除此之外,如果您的应用程序变得流行,它将被克隆,就像iOS应用程序一样。您已经实施的安全系统就是您所需要的,因为它们可以防止大多数用户盗用应用程序。
尝试使您的应用提供盗版功能只会损害代码库并使其难以维护,并可能为您的真正付费客户带来问题。而是专注于推广您的应用并让客户轻松付费和使用。通过响应功能请求和错误报告,您可以增加人们愿意支付的价值,而不是从中国网站中寻找一些可能是特洛伊木马的狡猾的破解副本。
最后,将盗版副本报告给反病毒软件供应商。提供APK的副本。他们将向他们的数据库添加签名,以便将其标记为具有潜在危险。
答案 3 :(得分:0)
我对审核Google市场条款的理解是,您无法直接从自己的网站销售应用,因为它违反了Google应用市场条款。我认为在代码中实现自定义保护是最好的方法。标准方法无效,因为代码很容易被分解