我刚刚发布了一个应用程序,一个付费应用程序,4天后,用户告诉我,中国有另一个网站托管我的应用程序.我从那里下载了它,它在我的设备上运行正常!
这里有帖子说人们可以更改包名并重新发布apk.但这不是我的情况,破解版仍然使用相同的包名.我在程序中使用了Android Vending Licensing,但破解版本根本不进行许可检查.我使用ProGuard对其进行了模糊处理,但这并没有阻止黑客.
问题1:我根据Google的说明签署了apk文件.但是,他们仍然修改了代码并取出了许可检查部分.我错误的是签署一个apk文件旨在防止人们篡改文件内容?
问题2:对于Win32 .exe程序,我曾经使用校验和来确定文件是否已被更改.这是它的工作原理:当创建.exe时,我使用工具计算文件的字节内容之和,然后将其填充到文件中的某个位置,例如,文本模式"MY SIGNATURE"之后的4个字节.然后在运行时,程序打开.exe文件并计算字节总和,将其与签名后的整数进行比较.
有没有人在apk文件上尝试过这种方法?关心分享您的经历?
w.d*_*hue 28
最终,Android内置应用程序的内置保护功能非常差.以下是您的最佳做法.
1)是的谷歌建议使用代码混淆,签名编码和他们的许可证验证服务器旨在防止软件被盗.然而,它们的实施存在很大缺陷.APK必须运行的唯一要求是签名.谁签了它并不重要.没有检查您的签名是否与其签名.因此,要破解它,您只需删除许可证检查并使用您想要的任何证书重新签名.然后,用户可以在手机上加载"允许非市场应用".
请勿按原样使用Google许可.大量修改代码.添加一些在生成密钥时使用的新参数.移动代码/重新构建它.不要将Google许可库包含为库项目.直接把它放在你的代码中.使代码尽可能细长和克隆.添加无效的函数,但动态修改值.稍后再制作其他函数将其转换回来.在整个代码库中传播许可证验证.
如果您不执行这些步骤,则可以自动破解代码.通过这些步骤,至少裂解装置需要花时间手工破解它.这可能最多只需要几个小时.但是,花费几个小时比立即破解标准Google许可层要花费更多时间.有一些破解工具实际上只会自动下载新发布的Android软件包,如果他们使用标准的Android许可,请破解它们并将破解的APK上传到这些类型的网站.通过使您的实现不是vanilla实现,您可以更加努力,只需要花费几个小时的努力.
2)这是一种常见的防裂技术.如果需要,您可以在Android上执行此操作.但它可以在大约5分钟内破解.如果你谷歌有关于如何破解这种特定技术的教程.基本上,您只需在代码中查找CRC调用,并在CRC返回后删除检查.
Android没有固有的安全性.您可以root任何手机并下载APK.您可以轻松破解APK以启用调试,只需单步执行代码即可查看代码中存储的任何密钥.所以最后我不会花太多时间在这上面.安全的Android应用程序是不可能的.我会在上面的列表中执行常识并继续前进.
3)如果你真的很偏执,你可以在自己的许可服务器上实现自己的许可.这是我采取的方法,但不是为了保护应用程序的盗窃,因为它是给我一个直接从我的网站销售应用程序的机制,所以没有谷歌播放的用户仍然可以购买我的应用程序.
Dom*_*ano 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;
}
Run Code Online (Sandbox Code Playgroud)
以下屏幕截图来自谷歌分析,显示了来自playstore(com.android.vending)的盗版跟踪免费应用程序,该应用程序通过积极的凿沉(非Playstore安装检测到并终止)进行了重新部署.非Playstore(未设置)跟踪丢失.不需要跟踪,但可以进行这些测量.

注意服务签名在破坏中起作用:包管理器强制使用唯一签名的唯一包名称.
这提出了应用程序被破坏时应该做什么的问题(应用程序检测到盗版).盗版是您的应用程序的一种病毒化(不受控制的分发)形式.通过启用分析跟踪后端,已经可以检测到它.Scuttling允许应用创建者在有或没有跟踪的情况下自定义前端响应.
海盗很明显可以发现激进的凿沉(BOOM!).这鼓励进一步破解.被动凿沉不太明显,但可能涉及跟踪.
盗版可能无法预防,但可预测,可检测和可追踪.
跟踪可能会给海盗带来难以逾越的问题,但也会出现其自身的道德问题.
如上所述,无需网络通信的被动/侵略性凿沉可能是最佳解决方案.它很容易隐藏(与许可不同),并且可以定制为尽可能不显眼.