我即将发布一个应用程序,并且不希望它被盗版...有幸应用程序会像你的许可证那样破解应用程序......
任何人都知道如何保护这个?
答案 0 :(得分:12)
要阻止您的应用以破解形式分发和重新打包,请参阅下面的签名检查。然后,至少可以让你的应用程序工作的唯一人是那些安装了LuckyPatcher的人。 LuckyPatcher创建修改后的APK后,签名就会更改。
运行发布版本时,您需要了解签名是什么。在下面的例子中,它是-343553346。
String sigChk = MySigCheck.MySigCheck(context);
if (sigChk.equalsIgnoreCase("Y")){
handle signature pass
}
创建一个类
public class MySigCheck {
public static String MySigCheck(Context context) {
String sigChk = "B";
Signature[] signature = new Signature[0];
try {
signature = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
Log.d("yourapp", Integer.toString(signature[0].hashCode())); << Prints your signature. Remove once you know this and have changed it below.
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (signature[0].hashCode() == -343553346){
sigChk = "Y";
}
return sigChk;
}
}
答案 1 :(得分:10)
简短的回答并非如此。
您可以观看有关使用许可API等的一些最佳做法的Google IO聊天Google IO Anti Pirate
我知道还有另外一些关于阻止懒惰海盗的一般模式的讨论,但似乎无法找到URL。
一般情况下,如果您的保护依赖于if / then逻辑,则所有人必须做的是修补代码并反转该逻辑或将其全部绕过,这在Java中非常容易。
你可以通过混淆你在哪里做这件事,在很多地方做这件事,随机做,以及添加亲保护混淆等来劝阻随意的黑客来加剧。
即使服务器端逻辑很容易绕过,除非以某种方式使用返回包(例如与用户同步的加密令牌或解锁内容的电话信息,或者在线访问所需的用户ID验证方案)社区内容等)
最后,如果某人有决心并具备技能,他们可以解决所有这些问题,除非你失去了严重的收入,否则在我看来几乎不值得失眠,这是我们所有人都需要的问题!
在做了20年(商业开发)之后,我的方法是通过使用上述模式使其变得困难,并偶尔改变它。这会扼杀懒惰的海盗。
然后忘掉它并集中精力制作一个值得亲海盗的应用程序。
我的方法
我的应用主要是内容驱动的。
一般情况下,如果某人购买了内容,则会使用令牌服务器端对其进行加密,并使用相同的服务器对其进行加密(这些内容未使用设备和用户令牌进行存储,但会使用设备和用户令牌生成每个会话,这只会让您更难以诚实地欺骗)< / p>
然后,我可以通过用户/设备配对跟踪访问。黑客的缺点是他们必须支付一次,如果他们的代币突然被超出合理限制使用,它会提醒我这个事实,如果我愿意(我有),我可以关闭该帐户
我发现社交人员不太可能让某人使用信息作弊,如果它与他们有联系(虽然它已经发生)并且它会回到他们身上。
我仍然遵循IO / Dev Blog等的所有建议,如果我发现篡改,那么我会通知用户然后让它去N段时间,以便他们可以联系我或自我纠正。
我也从未杀过一个应用程序,但我确实告诉用户他们正在使用恶意软件,并询问他们是否真的相信那些用他们的数据窃取它的人等等。那种弹出窗口有点消息这么简单字符串搜索将无法正常工作等,并引起人们的恐慌
我还有一种方法可以向设备发送一个毒性令牌集,它实质上会锁定他们在设备上累积的所有数据,除非我解锁它但是你最好确定他们是小偷才能对它们进行核攻击。
另外,不要将分析折扣作为一种检测方法,并确定在检测到盗版副本时要采取的正确行动。
遵循博客文章和IO提到的指导原则,然后在应用它们时发挥创意,并混合一些独特的解决方案,然后经常更改它以使海盗适合。
答案 2 :(得分:3)
基于LuckyPatcher使用odex替代它的黑客目的这一事实。我认为打败其当前实施的适度方法是在单独的dex中编译您的重要代码,并通过DexClassLoader加载它。
参考:http://android-developers.blogspot.pt/2011/07/custom-class-loading-in-dalvik.html
答案 3 :(得分:2)
我这样做的方法是密切注意幸运补丁的包裹名称,以防他们改变它。因此,在运行时我检查它是否已安装,如果这个实际安装在手机上,即使他们购买了应用程序,我根本不允许使用我的应用程序。我警告用户并杀死我的应用程序。所以他必须找到另一种方法来破解它。我可以得到的更糟糕的是,他必须购买我的应用程序,并肯定会进行一次糟糕的评论。但说实话,我更喜欢黑客的一次糟糕评论,而不是每天1000份盗版。
答案 4 :(得分:1)
我听说过的唯一方法是进行服务器验证...让您的应用与服务器联系并验证他们是否购买了您的应用。
这是关于通过Google进行的应用内结算,Why is signature verification on remote server more secure than on device?
开发网站上有关Google Play的一般信息here和应用内结算here
不幸的是我找不到其他的东西......
答案 5 :(得分:1)
作为一名专业的IT工程师和普通高级用户(Linux,Windows,Android,OS X,iOS),在命令行界面和图形界面一样舒服,我使用我所掌握的工具来实现目标。我无法想象使用没有root权限的Android设备,而且我通常会加载大量需要它的实用程序。至少,我喜欢自由控制通常附带我最喜欢的设备的强制性英国媒体软件,插入我自己的系统应用程序,并对美学,舒适和便利进行合法修改。
为了在作者选择削弱根用户的应用程序中实现适当的功能,我被迫采取了一些狡猾的途径。被告知我的设备有未经授权的修改&#39; (例如)维珍电视任何地方让我热血沸腾,如果它是我追求预期功能的唯一选择,我会高兴地破坏他们的代码并违反一些许可协议。
在这方面,我同意,如果您选择上述媒体应用程序这样严苛的路径,您会邀请很多用户,无论是通过愤怒或仅仅是实用工具,来挫败您的努力。这可能甚至会在你的应用程序被修复后完全被盗用。你的代码版本比合法销售更加普遍。
就个人而言,我总是选择付费选项,即使我被迫吞下我的安全感并用我几乎不相信的工具来打破它,以使其成功。然而,对于许多人来说,他们对你的产品的最初曝光是通过邪恶的渠道进行的,并且他们很难为合法且绝望的残缺版本付出代价。
我理解为什么有些程序员被迫做出这些选择,并且很高兴看到有关保护知识产权的正确方法的合理问题。
在答案中看到感觉更令人放心。
我的tuppence。
答案 6 :(得分:0)
如果他们有一个root设备,可以隐藏su二进制文件来使用app,检查root是最好的方法,除非你可以使用非root的自由版本,然后你需要修复它。对游戏杀手等黑客工具进行检查将会阻止懒惰的人,但不能反复将字符串更改为另一个。
答案 7 :(得分:-4)
Lucky Patcher在root设备中工作。我检查手机是否已植根。在我的第一个活动中,我检查手机是否为root,我的应用程序已锁定,否则我的应用程序正在打开。
使用波纹管方法检查root:
private static boolean isRooted() {
return findBinary("su");
}
public static boolean findBinary(String binaryName) {
boolean found = false;
if (!found) {
String[] places = {"/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/",
"/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/"};
for (String where : places) {
if ( new File( where + binaryName ).exists() ) {
found = true;
break;
}
}
}
return found;
}