29

このトピックが何度も開かれ、多くのことを学びましたが、本当にアドバイスが必要な問題に遭遇しました。

オブファスケーションでLVLを使用しています。アンチLVLが壊れないように、デフォルトのLVLALOTを変更しました。しかし、ワンクリックでラッキーパッチャーはそれを壊します!私は新しい壊れたAPKを見ようとしました。はい、それは単に私の「許可メソッド」と呼ばれていました。

私の質問は、誰かがラッキーパッチャーがそれを壊すのを防ぐ方法を勧めることができるかどうかです。防弾にはできないことはわかっていますが、少なくともワンクリックソフトウェアではそれほど簡単ではないようにしたいと思います。

4

5 に答える 5

48

証明書を確認するためのコード:

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;
}
于 2013-02-06T22:50:25.533 に答える
6

現在のバージョン(6.4.6)の時点で、LuckyPatcherは非常に短いトークンを生成します。たとえば、実際の購入トークン:

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;
    }
}
于 2017-04-12T14:07:16.253 に答える
0

特定のアクションで呼び出され、LuckyPatcherパッケージがデバイスにインストールされているかどうかをチェックする関数を実装します。

見つかった場合は、アプリを終了します。支払われているかどうかに関係なく、それを使用することを許可しないでください。何千もの違法コピーよりも悪いレビューです。または、LuckyPatcherが見つかり、アプリを実行できないことを示すメッセージを表示することもできます。

アプリがLuckyPatcherによってパッチが適用された場合、つまりLVL実装がハッキングされた場合、少なくともLuckyPatcherパッケージが検出されたためにアプリは実行されません。

于 2013-02-06T14:28:56.007 に答える
-1

方法は、ラッキーパッチャーがインストールされているかどうかを確認し、インストールされている場合は、ユーザーにメッセージを表示して、後でプロセスを強制終了することです。ユーザーがそれを持っている場合、それは彼があなたのソフトウェアまたは他の開発者のものをクラックしようとしていることを意味します。そのため、アプリがインストールされている電話での使用を許可しない方がよいでしょう。海賊行為と戦う。

于 2013-02-05T19:35:40.020 に答える
-1

Lucky Patcherが変更されたAPKファイルを作成するときはいつでも、同じパッケージ名で2つのアプリを実行することはできないため、常に異なるパッケージ名で終了します。

コードが間違ったパッケージ名で実行されているかどうかを確認する簡単なソリューションは次のとおりです。

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!
}

私は自分のアプリを呼び出すだけで、それを壊すことはできませんが、@PerracoLabsが提案したようfinish();に使用するのが最善かもしれません。android.os.Process.killProcess(android.os.Process.myPid());

于 2016-12-18T15:05:56.177 に答える