谷歌在应用程序购买和破解

时间:2014-03-06 09:45:39

标签: android in-app-purchase in-app-billing cracking

我开发了一款非常受欢迎且有人破解它的应用程序。我想知道,如果有人知道,首先:如何?,如果有人知道任何解决方法,以避免这种情况。该应用根据谷歌示例使用应用内购买以这种方式解锁一些高级功能:

 private IabHelper mHelper;

        if (!isPro(getActivity())) {
            mHelper = new IabHelper(getActivity(), KKK);
            mHelper.enableDebugLogging(true);
            mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
                public void onIabSetupFinished(IabResult result) {

                    if (!result.isSuccess()) {
                        return;
                    }

                    // Have we been disposed of in the meantime? If so, quit.
                    if (mHelper == null) return;

                    // IAB is fully set up. Now, let's get an inventory of stuff we own.
                    mHelper.queryInventoryAsync(mGotInventoryListener);
                }
            });
        }

    IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

            // Have we been disposed of in the meantime? If so, quit.
            if (mHelper == null) return;

            // Is it a failure?
            if (result.isFailure()) {
                return;
            }

            Purchase pro = inventory.getPurchase(PRO_STRING);
            SettingsProvider.putSecBoolean(getActivity(), "pro", pro != null && verifyDeveloperPayload(pro));
        }
    };

    IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
            if (mHelper == null) return;

            if (result.isFailure()) {
                return;
            }

            if (purchase.getSku().equals(PRO_STRING)) {
                SettingsProvider.putSecBoolean(getActivity(), "pro", true);
            }
        }
    };

    boolean verifyDeveloperPayload(Purchase p) {
        String payload = p.getDeveloperPayload();
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mHelper != null) {
            mHelper.dispose();
            mHelper = null;
        }
    }

并购买过程:

mPro.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            RandomString randomString = new RandomString(36);
            String payload = randomString.nextString();

            if (mHelper != null) mHelper.flagEndAsync();
            mHelper.launchPurchaseFlow(getActivity(), PRO_STRING,
                    IabHelper.ITEM_TYPE_INAPP, RC_REQUEST,
                    mPurchaseFinishedListener, payload);
        }
    });

好的,有人在某种程度上破解了它。这意味着专业版中提供的内容是免费的,无需付费。也许有人可以分享他的经验,并建议一些方法来避免这种情况?

而且,是否有人知道如何做到这一点?感谢

2 个答案:

答案 0 :(得分:4)

简要说明

Android应用程序很容易破解。首先,如果您没有对代码(ProGuard,DexGuard,...)使用任何混淆,可以使用JD-GUI.之类的工具轻松阅读和理解代码。在某些情况下, smali代码也很容易理解。

混淆本身不会让你免于破解。市场上有一些去混淆器,但具有高调逆向工程技能的人仍然能够找出如何绕过你(或谷歌)的保护。

最后,有LuckyPatcher。这可能是破解Android应用程序保护的最着名的工具。它特别针对某些类型的保护(Google LVLIAP,广告网络......),并尝试在统计基础上删除它们。事实上,它不能100%保证,但在绝大多数情况下它都能正常工作。

如何安全呢?

You simply can't。没有完美的100%安全性,尤其是在移动环境中。但是,你可以做的是努力使一个破解者的工作尽可能困难

一些想法:

  1. 总是混淆。它不会对您的应用程序造成任何损害(如果配置正确),它将是您代码的另一层保护。
  2. 使用DexGuard的篡改检测功能。它肯定会降低您的应用在更新发布两天后破解的可能性。
  3. 还有一些,我会在我回忆起它们时立即添加它们。

答案 1 :(得分:0)

您的代码非常容易破解,您只需要替换

SettingsProvider.putSecBoolean(getActivity(), "pro", pro != null && verifyDeveloperPayload(pro));

使用:

SettingsProvider.putSecBoolean(getActivity(), "pro", true);

它可以通过几种方式完成,例如antilvl。您需要通过交叉检查自己的服务器来增加保护。