【问题标题】:Lucky patcher, how can I protect from it? [duplicate]幸运的修补程序,我该如何保护它? [复制]
【发布时间】:2012-11-18 23:10:10
【问题描述】:

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

我将 LVL 与混淆一起使用。我更改了默认的 LVL ALOT,以便反 LVL 不会破坏它。然而,幸运补丁一键破解!我试图查看新损坏的 APK。是的,它只是简单地调用了我的“允许方法”。

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

【问题讨论】:

  • 大声笑,这个问题因重复而被关闭,而链接的问题因过于宽泛而被关闭。

标签: android android-lvl


【解决方案1】:

检查您的证书的代码:

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

【讨论】:

  • 嗯。那很有意思。非常感谢。我会试一试并在此处发布结果。同时。我会将此答案标记为已接受:)。和你“聊天”真是太好了。顺便说一句,如果你可以编辑你的答案并发布用于检查幸运补丁包的代码,那就太好了
  • 是的,如果有人重新打包 apk 以进行分发,那么幸运补丁程序会更改证书,因此签名检查将起作用。并且在同一设备上 packageExists("packagename") 函数工作感谢 luckypatcher 包名称的想法。
  • luckypatcher 和 antilvl 等工具已经在使用和不使用反射的情况下击败了签名检查,因此检查签名将不起作用。即使有视频中的所有建议,以及大量的自定义检查,我的应用通常会在发布后的一两天内被破解。
  • 如果我错了,请纠正我,但有什么可以阻止我安装应用程序 - 使用 LuckyPatcher 进行修补 - 卸载 LuckyPatcher - 运行已修补的应用程序。嗯?...
  • @MrOnlineCoder 有没有其他方法可以保护我们的应用程序内帐单免受幸运修补程序的影响?
【解决方案2】:

从当前版本 (6.4.6) 开始,Lucky Patcher 会生成非常短的令牌。例如,真实的购买令牌:

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

【讨论】:

  • google没有采取任何应对措施吗?
  • 我测试了你的这段代码,最初它运行起来很神奇,但是,在它上应用程序到游戏商店并通过游戏商店本身下载它并使用运气补丁程序破解内部之后购买与原始购买相同的crackeia,这种方法变得无用。 @Dima Rostopira
【解决方案3】:

实现一个在某些操作下被调用的函数,该函数检查设备中是否安装了 LuckyPatcher 包。

如果找到,则退出您的应用。不管有没有付费都不允许使用,差评胜过千千万万的盗版。或者,您可以显示一条消息,指出已找到 LuckyPatcher 并且该应用无法运行。

如果您的应用被 LuckyPatcher 修补,这意味着它已经入侵了您的 LVL 实现,那么由于 LuckyPatcher 包检测,至少您的应用不会执行。

【讨论】:

  • 感谢您的详细解答。但我认为你在下面错过了我的观点。假设您安装了幸运补丁程序并下载了我的应用程序。您将使用幸运修补程序来破解应用程序(无需实际运行应用程序和预防代码)。现在你将把这个破解的应用程序放到一些黑市上。下载破解应用程序(没有幸运补丁程序)的人只会运行它。大多数人只是下载者,他们没有破解工具。明白我的意思吗?
  • 所以是的,我阻止了破解者运行我的应用程序,但我没有阻止下载破解版的 10000 人不运行它
  • 但是,幸运的补丁程序根本无法破解apk,破解解压后的dex文件,所以没有人真正可以使用破解的补丁文件,除非重新打包,这需要你的证书。或者也许我想念幸运的 pacher 是如何工作的?
  • 那么简单,只需检查您的 apk 是否已使用您的证书签名,这很容易做到,我会将其作为答案发布,以便它适合所有代码。
  • 唯一可行的解​​决方案是在您的应用程序中使用服务器端验证,即从服务器检查您的公钥。此外,服务器必须使用 SSL 连接来防止流量嗅探。此线程中建议的所有方法都已被一种或另一种方式规避。
【解决方案4】:

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

【讨论】:

  • 这是一个很好的建议,但问题是用户可以安装我的应用程序而不必运行它。他们只需运行幸运补丁程序,它就会生成应用程序的破解版
  • 我将我的回复作为答案发布,因为在这里写的时间太长了
  • 这不起作用,因为最新的幸运补丁程序使用动态应用程序 ID 和应用程序名称
【解决方案5】:

每当 Lucky Patcher 创建一个经过修改的 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();,我无法破坏它,但最好按照@PerracoLabs 的建议使用android.os.Process.killProcess(android.os.Process.myPid());

【讨论】:

  • 你确定吗?..
  • @MehulMohan 绝对!事实上,我的应用程序使用这种方法。我和几个朋友试图打破它,但我们失败了。我们不是计算机黑客,但这是防止用户破解简单游戏的好方法。
  • 这实际上会检查设备上是否安装了给定的包名,因此如果仍然安装了具有原始包名的原始应用程序,这将不起作用。
猜你喜欢
  • 1970-01-01
  • 2021-07-16
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2021-11-12
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多