証明書を確認するためのコード:
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を作成する必要があります。証明書をLogcatに出力します。
signatures[0].toCharsString();
デバッグモードに戻ると、証明書が再び異なることに注意してください。デバッグの問題を回避するには、次の行を使用して検証をスキップします。
if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
return;
次に、ラッキーパッチャーチェッカー。Lucky Patcherのすべてのバージョンを逆コンパイルしたところ、その作成者がすべての領域で2つのパッケージ名を使用していることがわかりました。したがって、新しいバージョンを追跡し、将来のパッケージ名を追加し続ける必要があるだけです。
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;
}