This question already has an answer here:
-
Way to protect from Lucky Patcher / play licensing [closed]
8 answers
I know this topic has been opened multiple times and I learnt a lot but I stumbled across a problem I really need advice on.
I'm using LVL with Obfuscation. I changed the default LVL ALOT so that anti-LVL does not break it. However, Lucky Patcher with one click breaks it! I tried to see the new broken APK. Yes it simply called my "allow method".
My question is if someone can recommend a way to prevent Lucky Patcher from breaking it? I know I can't make it bullet-proof, but I want it at least to be not so easy for one-click software.
代码来检查您的证书
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());
}
}
而如何找到哪一个是你的证书,很简单。 你必须产生一个APK,在释放模式,如调试证书是永远释放一个不同。 输出证书串到一个临时的TextView复制它,或者在后续的调用一个文本文件,重要提示:不要将它输出的logcat中,作为字符串是太大,logcat中不会显示这一切,并切断最后一个字符特点:
signatures[0].toCharsString();
example: YourTextView.setText(signatures[0].toCharsString());
现在,请记住,当你返回到调试模式,证书又有所不同,并可能会在每个版本有时是不同的,所以你会得到一个调试地狱。 然后,它是更好地使用下一行有它更容易进行开发时,将其右调用证书测试之前:
if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
return;
}
所以要避免在调试模式下调用此认证代码,如果
而现在的幸运补丁检查
此代码将检查它的存在。 我反编译幸运修补器的所有版本,我已经发现,它的创造者所使用的所有realeases之间2个名。 所以,你只需要跟踪的新版本,并不断增加未来的幸运补丁包名称检查功能。
另外一个建议,加密包名字符串,而不是只harcoding它们作为例子,太幸运了补丁不会用新版本刚刚替换字符串修补他们出来。 让我们很难让饼干。
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;
}
由于当前版本(6.4.6),幸运修补程式产生非常短的令牌。 例如,真正的购买令牌:
felihnbdiljiajicjhdpcgbb.AO-J1OyQgD6gEBTUHhduDpATg3hLkTYSWyVZUvFwe4KzT3r-O7o5kdt_PbG7sSUuoC1l6dtqsYZW0ZuoEkVUOq5TMi8LO1MvDwdx5Kr7vIHCVBDcjCl3CKP4UigtKmXotCUd6znJ0KfW
这是幸运的令牌:
kvfmqjhewuojbsfiwqngqqmc
非常简单的解决办法是检查令牌的字符串长度
@Override public void onIabPurchaseFinished(IabResult result, Purchase info) {
if (info.getToken().length < 25) {
Log.wtf("PIRATE", "PIRATE DETECTED");
return;
}
}
从某种意义上说,是检查是否安装补丁的幸运,如果是这样,那么显示的信息给用户,事后杀死你的进程。 如果用户拥有它,意味着他试图破解软件或其他开发人员的一个。 所以,最好不要允许使用你的应用程序中有它安装了一个电话。 打击盗版。
每当幸运修补程式创建一个改装成APK文件,它总是用不同的包名结束了,因为你不能在同一个软件包名称下运行两个应用程序。
下面是一个检查,如果你的代码是错误的包名称下运行的简单的解决方案:
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());
作为@PerracoLabs建议。
是的,这是我的建议的尖尖的。 在你的代码,实现了将在某些操作调用的函数,这些行动必须检查包装幸运修补的,如果这是安装或没有。 这是很容易做到的,我可以共享代码,如果你不知道怎么办。 如果您发现它,然后停止你的应用程序。 只是不允许使用它,即使所支付的用户,改善自己的差评超过10000个非法拷贝。 然后还,即使您的应用程序被破解,这将是只为LVL,幸运的补丁无法知道有反对这样的算法,市场每一个应用程序,就不可能使覆盖所有的应用程序幸运的补丁版本在市场上,像以前开发商会写自己的方式来检测它。 所以在最后你的应用程序可能会被破解,并不再有LVL保护,但你永远不会允许,如果手机已经安装了补丁幸运运行它。 现在,甚至进一步,保持标志设置文件,如果在你的应用程序第一次运行你发现幸运补丁检测,万一他的裂缝,然后卸载补丁的幸运。 这样,即使用户卸载luckypatcher后,您仍然可以停止执行您的应用程序,用户将不得不再次重新安装你的未开裂的应用程序。 他会责备幸运修补所有的时间。 https://www.androidjungles.com/lucky-patcher-apk/