Google в покупке и взломе приложений

Я разработал приложение, которое стало очень популярным, и кто-то взломал его. Я хотел бы знать, знает ли кто-нибудь, прежде всего: как?, знает ли кто-нибудь обходной путь, чтобы избежать этого. Приложение использует покупку в приложении в соответствии с примером Google, чтобы разблокировать некоторые дополнительные функции следующим образом:

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

Хорошо, кто-то каким-то образом взломал его. Это означает, что контент, доступный в профессиональной версии, бесплатен без оплаты. Может быть, кто-то поделится своим опытом и подскажет, как этого избежать?

И еще, кто-нибудь знает, как это можно сделать? Спасибо


person iGio90    schedule 06.03.2014    source источник


Ответы (2)


Краткое объяснение

Приложения для Android довольно легко взломать. Прежде всего, если вы не используете обфускацию в своем коде (ProGuard, DexGuard, ..), код можно легко прочитать и понять с помощью некоторых инструментов, таких как JD-GUI. В некоторых случаях код smali тоже довольно легко понять.

Обфускация сама по себе не спасет вас от взлома. На рынке доступны деобфускаторы, но кто-то с высокими навыками реверс-инжиниринга все равно сможет выяснить, как обойти вашу (или защиту Google) защиту.

Наконец, есть LuckyPatcher. Это, пожалуй, самый известный инструмент для взлома защиты Android-приложений. Он нацелен на определенные типы защиты (Google LVL, IAP, рекламные сети и т. д.) и пытается удалить их на статистической основе. На самом деле, это не гарантируется на 100%, но в подавляющем большинстве случаев будет работать просто отлично.

Как же тогда быть в безопасности?

You simply can't. Не существует идеальной стопроцентной безопасности, особенно в мобильной среде. Однако вы можете попытаться усложнить работу взломщика.

Несколько идей:

  1. Всегда запутывайте. Это не нанесет никакого вреда вашему приложению (если настроено правильно) и станет еще одним уровнем защиты вашего кода.
  2. Используйте функцию обнаружения несанкционированного доступа DexGuard. Это определенно уменьшит вероятность того, что ваше приложение будет взломано через два дня после выпуска обновления.

Есть еще несколько, я добавлю их, как только вспомню их всех.

person Sebastiano    schedule 06.03.2014
comment
Здравствуйте, спасибо за ответ! Я использую proguard для запутывания (забудьте сказать по моему вопросу). Попробую с dexguard! - person iGio90; 06.03.2014
comment
DexGuard будет улучшение. Он предлагает функции защиты высокого уровня, прежде всего строковое шифрование. Но, вероятно, это не спасет вас от таких инструментов, как LuckyPatcher. Опять же, это всегда вопрос усиления безопасности и предотвращения взломщиков :) - person Sebastiano; 06.03.2014
comment
DexGuard немного дороже :D - person iGio90; 06.03.2014
comment
К сожалению, безопасность имеет свою цену. - person Sebastiano; 06.03.2014
comment
@ iGio90 Тем не менее, если вы считаете, что мой комментарий удовлетворителен, отметьте его как ответ на ваш вопрос, чтобы другие могли использовать его в качестве отправной точки. - person Sebastiano; 06.03.2014

Ваш код действительно легко взломать, вам просто нужно заменить

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

с:

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

Это можно сделать несколькими способами, как, например, antilvl. Вам нужно значительно повысить свою защиту, возможно, путем перекрестной проверки вашего собственного сервера.

person greywolf82    schedule 18.01.2015