幸运补丁,我怎么能保护它?

我知道这个话题已经被多次打开了,我学到了很多东西,但是我偶然发现了一个我真正需要build议的问题。

我正在使用LVL和混淆。 我改变了默认的LVL ALOT,使抗LVL不会破坏它。 然而,幸运的Patcher只需点击一下就可以了! 我试图看到新的破解APK。 是的,它只是叫我的“允许方法”。

我的问题是,如果有人可以推荐一种方法来防止Lucky Patcher破坏它? 我知道我不能让它防弹,但是我希望它至less对于一键式软件来说并不那么容易。

Solutions Collecting From Web of "幸运补丁,我怎么能保护它?"

代码来检查你的证书

public void checkSignature(final Context context) { try { Signature[] signatures = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures; if (signatures[0].toCharsString() != <YOUR CERTIFICATE STRING GOES HERE>) { // Kill the process without warning. If someone changed the certificate // is better not to give a hint about why the app stopped working android.os.Process.killProcess(android.os.Process.myPid()); } } catch (NameNotFoundException ex) { // Must never fail, so if it does, means someone played with the apk, so kill the process android.os.Process.killProcess(android.os.Process.myPid()); } } 

以及如何find哪一个是你的证书,也很简单。 您必须以发行模式生成APK,因为debugging证书始终与发行版不同。 输出你的证书string到一个临时的textview复制它,或到一个文本文件下一个调用,重要提示:不要输出它的logcat,因为string太大,logcat不会显示全部和剪切最后一个字符特点:

 signatures[0].toCharsString(); example: YourTextView.setText(signatures[0].toCharsString()); 

现在,请记住,当您回到debugging模式时,证书会有所不同,并且在每个构build中可能会有所不同,所以您将得到一个debugging地狱。 那么最好在开发时使用下一行,以便在调用证书testing之前将其放在正确的位置:

 if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) { return; } 

因此,如果在debugging模式下,请避免调用此authentication码

现在是幸运的补丁检查器

这段代码将检查它的存在。 我反编译了Lucky Patcher的所有版本,我发现它的创build者在所有的发行版之间使用了两个包名。 所以你只需要跟踪新版本,并不断添加未来的幸运补丁包名称的检查function。

还有一个build议,encryption包名string,而不是像上例那样对它们进行编码,所以幸运的修补程序不会出现一个新版本,只是replace修补它们的string。 让cookies变得困难。

 private boolean checkLuckyPatcher() { if (packageExists("com.dimonvideo.luckypatcher")) { return true; } if (packageExists("com.chelpus.lackypatch")) { return true; } if (packageExists("com.android.vending.billing.InAppBillingService.LACK")) { return true; } return false; } private boolean packageExists(final String packageName) { try { ApplicationInfo info = this.getPackageManager().getApplicationInfo(packageName, 0); if (info == null) { // No need really to test for null, if the package does not // exist it will really rise an exception. but in case Google // changes the API in the future lets be safe and test it return false; } return true; } catch (Exception ex) { // If we get here only means the Package does not exist } return false; } 

每当Lucky Patcher创build一个已修改的APK文件时,它总是以不同的软件包名称结尾,因为无法使用相同的软件包名称运行两个应用程序。

这是一个简单的解决scheme,检查你的代码是否运行在错误的包名下:

 PackageManager pm = getPackageManager(); try { PackageInfo packageInfo = pm.getPackageInfo("YOUR_PACKAGE_NAME",PackageManager.GET_ACTIVITIES); } catch (PackageManager.NameNotFoundException e){ finish(); //If you get here, your code is running under a different package name... Kill the process! } 

我只是叫finish(); 在我的应用程序,我不能打破它,但它可能是最好的使用android.os.Process.killProcess(android.os.Process.myPid()); 作为@PerracoLabsbuild议。

截至目前的版本(6.4.6),幸运Patcher生成非常短的标志。 例如,真正的购买令牌:

 felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW 

这就是幸运令牌:

 kvfmqjhewuojbsfiwqngqqmc 

非常简单的解决scheme是检查令牌的string长度

 @Override public void onIabPurchaseFinished(IabResult result, Purchase info) { if (info.getToken().length < 25) { Log.wtf("PIRATE", "PIRATE DETECTED"); return; } } 

一种方法是检查是否安装了幸运修补程序,如果是,则显示一条消息给用户,然后杀掉你的进程。 如果用户拥有它,意味着他正试图破解你的软件或其他开发者的软件。 所以最好不要在已安装的手机中使用您的应用程序。 打击盗版。

是的,这是我的build议的重点。 在你的代码中,实现一个你将会在某些动作中被调用的函数,在这些动作中你必须检查幸运补丁包是否安装。 这很容易做,如果你不知道如何分享代码。 如果你发现它,然后停止你的应用程序。 即使用户支付了费用,也不允许使用它,更好的是他的坏评价超过10000个非法副本。 而且,即使你的应用程序被破解,只有LVL,幸运补丁不能知道市场上的每一个应用程序都有这样的algorithm,并且将使得不可能做出一个幸运的补丁版本覆盖所有的应用程序在市场上,开发者会用自己的方式来检测它。 所以最后你的应用程序可能会被破解,不再具有lvl保护,但是如果手机安装了幸运补丁程序,则永远不会允许运行它。 现在甚至更进一步,在设置文件中保留一个标志,以检测您的应用程序的第一次运行时,你检测到幸运修补程序,以防他破解,然后卸载幸运修补程序。 这种方式,即使用户卸载luckypatcher后,你仍然可以停止执行你的应用程序,用户将不得不重新安装你的uncracked应用程序。 而且他一直都会责怪幸运者。