我刚刚发布了一个应用程序,一个付费应用程序,4天后,一个用户告诉我,在中国有另一个网站托管我的应用程序。我从那里下载了它,它在我的设备上运行得很好!
这里有帖子说人们可以更改包名称并重新发布apk。但这不是我的情况,破解后的版本仍然使用相同的包名。我在程序中使用了Android自动售货许可,但破解版本根本不做许可检查。我使用ProGuard对其进行了模糊处理,但这并不能阻止黑客。
问题1:我是按照谷歌的指示在apk文件上签名的。但他们还是修改了代码,去掉了许可检查部分。签署apk文件是为了防止人们篡改文件内容,这是不是错了?
问题#2:对于Win32 .exe程序,我过去常常使用校验和来确定文件是否已被更改。它的工作原理是这样的:当创建签名时,我使用一个工具来计算文件的字节内容总和,然后将其填充到文件中的某个位置,例如,在文本模式"MY .exe“之后的4个字节。然后在运行时,程序打开.exe文件并计算字节和,将其与签名后的整数进行比较。
有没有人在apk文件上尝试过这种方法?愿意分享你的经验吗?
发布于 2011-12-23 12:18:33
归根结底,Android对应用程序的内置保护非常差。以下是您的最佳实践。
1)是的,谷歌建议使用代码混淆,签名编码,他们的许可证验证服务器旨在防止软件被盗。然而,他们的实现存在很大的缺陷。APK必须运行的唯一要求是它必须经过签名。不过,是谁签的并不重要。没有检查您的签名是否与签名时所用的签名相同。因此,要破解它,你只需删除许可证检查,并使用任何你想要的证书重新签名。然后,用户可以在选中“允许非市场应用”的情况下将其加载到他们的手机上。
不要按原样使用Google许可。大量修改代码。添加一些新参数,以便在生成密钥时使用。移动代码/重新设计它。不要将Google许可库作为一个库项目。将其直接放入您的代码中。让代码尽可能的细长和笨拙。添加不执行任何操作但动态修改值的函数。稍后再创建其他函数,将它们转换回来。在您的整个代码库中传播许可证验证。
如果你不做这些步骤,那么代码就会被自动破解。通过执行这些步骤,黑客至少需要花时间手动破解它。这可能最多只需要几个小时。但是,几个小时的时间比立即破解标准的谷歌许可层要多得多。有一些破解工具会自动下载新发布的安卓软件包,如果他们使用标准的安卓许可,就会破解它们,并将破解的APK上传到这些类型的网站。通过使您的实现而不是普通的实现,您只需花费几个小时的努力,就会使事情变得更加困难。
2)这是一种常见的防破解技术。如果你愿意,你可以在Android上做到这一点。但它可以在大约5分钟内被破解。如果你在谷歌上搜索,有关于如何破解这一特定技术的教程。基本上,您只需在代码中查找CRC调用,并在CRC返回后删除检查。
Android没有固有的安全性。你可以从任何手机上下载APK。您可以轻松地破解APK以启用调试,并且只需单步执行代码即可查看存储在代码中的任何密钥。所以最后我不会在这上面花太多时间。保护Android应用程序是不可能的。我只会做上面列表中的常识,然后继续前进。
3)如果你真的很偏执,你可以在你自己的许可服务器上实现你自己的许可。这是我采取的方法,但并不是为了保护应用程序不被窃取,而是为了给我一种机制,让我直接从我的网站销售应用程序,这样没有安装Google Play的用户仍然可以购买我的应用程序。
发布于 2014-02-08 08:52:39
被动/主动开凿
我同意@metalideath的观点,混淆和排除许可代码并不是万无一失的。
这是一种很容易隐藏的技术,我称之为“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允许应用程序创建者自定义带有或不带有跟踪的前端响应。
攻击性的沉船显然可以被海盗发现(砰!)。这鼓励了进一步的破解。被动清理远没有那么明显,但可能涉及到跟踪。
盗版可能无法预防,但它是可预测的、可检测的和可追踪的。
追踪可能会给盗版者带来难以克服的问题,但也会带来自身的道德问题。
如上所述,不需要网络通信的被动/主动截取可能是最佳解决方案。它很容易隐藏(与许可不同),并且可以定制为尽可能不明显。
发布于 2014-02-11 21:26:06
最好的办法就是不去担心它。在中国盗版的人不是你的客户,也永远不会是。如果没有盗版版本可用,他们仍然不会付钱给你的副本,在所有的可能性。此外,如果你的应用变得流行,它无论如何都会被克隆,就像iOS应用一样。你已经实现的安全系统就是你所需要的,因为它们可以防止大多数用户盗版应用程序。
试图让你的应用程序防盗版只会损害代码库,使其更难维护,并可能给真正的付费客户带来问题。相反,专注于推广你的应用程序,让客户更容易付费和使用。通过响应功能请求和bug报告,你增加了人们愿意付费的价值,而不是从可能是特洛伊木马的中国网站上寻找一些不可靠的破解副本。
最后,将盗版副本报告给防病毒供应商。提供APK的副本。他们会将签名添加到数据库中,以便将其标记为潜在危险。
https://stackoverflow.com/questions/8611960
复制相似问题