Code by sprawdzić certyfikat
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());
}
}
i jak znaleźć których jeden jest certyfikat, zbyt proste. Musisz utworzyć plik APK w trybie zwolnienia, ponieważ certyfikat debugowania zawsze różni się od wydania. Wypisz ciąg certyfikatu do tymczasowego widoku tekstowego, aby go skopiować, lub do pliku tekstowego z następnym wywołaniem, WAŻNE: NIE WYDAWAJ go logcat, ponieważ ciąg znaków jest zbyt duży i logcat nie pokaże go wszystkie i odciąć ostatni znak znaków:
signatures[0].toCharsString();
example: YourTextView.setText(signatures[0].toCharsString());
teraz należy pamiętać, że kiedy jesteś z powrotem do trybu debugowania, certyfikat jest jeszcze inny, a czasami może być inna na każdej budowie, więc dostaniesz piekło debugowania. Wtedy lepiej jest użyć następną linię mieć łatwiej, kiedy się rozwija, i umieścić go tuż przed wywołaniem testowanie certyfikatu:
if ((context.getApplicationContext().getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0)
{
return;
}
więc unikać wywoływania ten kod certyfikacyjny, jeśli w trybie debugowania
A teraz szczęśliwy patcher checker
Ten kod sprawdzi jego istnienie. Dekompilowałem wszystkie wersje Lucky Patchera i odkryłem, że jego twórca używał 2 nazw paczek między wszystkimi realeases. Musisz tylko śledzić nowe wersje i dodawać przyszłe nazwy pakietów patcha do funkcji sprawdzania.
Polecamy również szyfrowanie ciągów nazw paczek zamiast ich harcodować, tak jak w przykładzie, więc lucky patcher nie wychodzi z nową wersją, która po prostu zamienia łańcuchy na łatanie ich. Ułatwmy krakersy.
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;
}
Lol to pytanie zamknięte duplikat, a powiązane pytanie jest zamknięte jako zbyt szerokie. –