Android admob предотвращает удаление рекламы путем декомпиляции apk - PullRequest
0 голосов
/ 23 марта 2019

После декомпиляции apk с помощью APK Easy Tool и редактирования AndroidManifest.xml файла:

измените его:

<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:exported="false" android:name="com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>

-> "com.google.android.gms.ads.AdActivity "

to:

<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:exported="false" android:name="hacked_com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>

->" hacked_com.google.android.gms.ads.AdActivity "

или отредактируйте:

<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-0000000000000000~123456789"/> // change app id

и сохраните и снова скомпилируйте в apk.мои баннеры и рекламные вставки не показываются.как исправить эту сложную ошибку?

1 Ответ

1 голос
/ 23 марта 2019

Попробуйте это из этого источника: https://www.airpair.com/android/posts/adding-tampering-detection-to-your-android-app:

2 Проверка сертификата подписи вашего приложения во время выполнения

Условие: в блоге разработчиков Android есть отличная статья о подписании вашего приложения.Я рекомендую сначала прочитать это, так как этот метод опирается на эти знания.

В двух словах, разработчики должны подписать приложения своим закрытым ключом / сертификатом (содержащимся в файле .keystore), прежде чем приложение можно будет установить на пользовательские устройства.,Сертификат подписи должен оставаться неизменным на протяжении всего жизненного цикла приложения и, как правило, иметь срок действия в будущем 25 лет.

Надежность сертификата подписи разработчика зависит от системы Android при работе с приложениемобновления.Например, хотя я мог создать приложение с тем же идентификатором приложения, что и Facebook, я не смог обманом заставить пользователей перейти на мою версию, поскольку она не подписана сертификатом Facebook.Как разработчики, мы должны держать этот сертификат в секрете, в противном случае мы рискуем, что другие смогут подписывать приложения под нами.

Совет. Держите ваш закрытый ключ (файл .keystore) вне контроля исходного кода и в отдельном защищенном и защищенном хранилище.up system.

Подпись приложения будет нарушена, если файл .apk будет каким-либо образом изменен - ​​неподписанные приложения обычно не могут быть установлены.Например, мы можем представить, как злоумышленник удаляет код проверки лицензии, чтобы включить все функции приложения без оплаты.Более опасный пример - изменение .apk для включения вредоносного ПО в легитимное приложение для сбора конфиденциальных пользовательских данных.Чтобы установить измененный .apk, злоумышленник должен подать его в отставку.

Этот метод подробно описывает, как убедиться, что ваш .apk был подписан вашим сертификатом разработчика, и использует тот факт, что сертификат остается согласованным.и что только у вас есть доступ к нему.

Мы можем разбить эту технику на 3 простых шага:

Найти вашу подпись сертификата разработчика.Вставьте свою подпись в константу String в вашем приложении.Убедитесь, что подпись во время выполнения соответствует нашей встроенной подписи разработчика.

  private static final int VALID = 0;

  private static final int INVALID = 1;

  public static int checkAppSignature(Context context) {

    try {

      PackageInfo packageInfo = context.getPackageManager()

          .getPackageInfo(context.getPackageName(),

              PackageManager.GET_SIGNATURES);

      for (Signature signature : packageInfo.signatures) {

        byte[] signatureBytes = signature.toByteArray();

        MessageDigest md = MessageDigest.getInstance("SHA");

        md.update(signature.toByteArray());

        final String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);

Log.d("REMOVE_ME", "Include this string as a value for SIGNATURE:" + currentSignature);

        //compare signatures

        if (SIGNATURE.equals(currentSignature)){

          return VALID;

        };

      }

    } catch (Exception e) {

//assumes an issue in checking signature., but we let the caller decide on what to do.

    }

    return INVALID;

  }

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

Проверьте вывод logcat на наличие сообщения, похожего на это:

10-10 17: 37: 11.483: D / REMOVE_ME: (111): 478yYkKAQF + KST8y4ATKvHkYibo =

Запишите кодированную подпись и замените значение статической константы. ПОДПИСЬ:

private static final String SIGNATURE = "478yYkKAQF + KST8y4ATKvHkYibo =";

Во время выполнения PackageManager позволяет запрашивать сигнатуры нашего приложения.Мы перебираем этот массив подписей и сравниваем его с нашей подписью.

Теперь, когда вы запускаете checkAppSignature в своем приложении - когда оно подписано с помощью вашего сертификата разработчика релиза - вы должны увидеть, что оно возвращает 0, то есть действительное.Эта жестко закодированная подпись является идеальным кандидатом для шифрования строк DexGuard.


В качестве альтернативы вы можете считать подписи.Если их больше 1 -> Прервать:

public final String checkSignature()
{
    Log.i(TAG, "executeSignatureCheck()");

    Signature[] sigs;
    try
    {
        sigs = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
    }
    catch (PackageManager.NameNotFoundException e)
    {
        throw new RuntimeException("PackageManager name not found.");
    }

    String signature = null;
    int sigCount = 0;
    for (Signature sig : sigs)
    {
        signature = getSHA1(sig.toByteArray());
        Log.i(TAG, "Signature: " + signature);
        sigCount++;
    }

    if (sigCount > 1)
    {
        throw new RuntimeException("Invalid signature.");
    }

    return signature;
}

Вы также должны проверить, было ли приложение загружено из Google Play.(См. «Проверка установщика» по той ссылке, которую я разместил).Но, к сожалению, вы не можете быть уверены, что это работает на каждом устройстве.Я развернул такую ​​проверку и выпустил ее в Google Play для Alpha, но 2 из 9 устройств не вернули строку.Я не смог выяснить, не работает ли Google Play Store или устройства действительно не возвращают ни одной из этих строк.(см. мою проблему здесь: Возможно ли, что getInstallerPackageName () имеет значение NULL при загрузке приложения из Google Play Store? )

...