Как проверить, существует ли класс где-нибудь в пакете?

В настоящее время я имею дело с определенной проблемой с моей платной заявкой. Внутри он содержит проверку лицензирования. Приложение пропатчено хакерами путем изменения приложения apk/jar. Они добавляют новый класс, который помогает обойти проверку лицензирования.

Моя цель - как-то проверить этот патч. Если я нахожу это, я знаю, что мое приложение было взломано.

Любые советы о том, как узнать, что что-то было изменено на упаковке? Создание хэша над приложением в моем случае не вариант.

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

Любое из этих возможно? Любые предложения помогут:)

4 ответа

Решение

Не уверен насчет Android, но в стандартном JDK вы бы сделали что-то вроде этого:

try {
 Class.forName( "your.fqdn.class.name" );
} catch( ClassNotFoundException e ) {
 //my class isn't there!
}

Вот что я использовал в Android - стандартная Java:

public boolean isClass(String className) {
    try  {
        Class.forName(className);
        return true;
    }  catch (ClassNotFoundException e) {
        return false;
    }
}

Пример реализации:

if (isClass("android.app.ActionBar")) {
    Toast.makeText(getApplicationContext(), "YES", Toast.LENGTH_SHORT).show();
}

Ты можешь использовать

public static Class<?> forName (String className)

и проверить ClassNotFoundException

http://developer.android.com/reference/java/lang/Class.html

Как он загружается, если это случайный класс в случайном пакете?

При этом см. Http://download.oracle.com/javase/6/docs/api/java/lang/System.html#getProperties%28%29 и java.class.path. Для нормальных java-приложений вы должны пройти путь к классам и затем искать записи (для jar) или каталоги (для файлов.class). Но в среде загрузчика контейнерных классов это не сработает (и я не уверен, как это относится к среде Android).

Другие вопросы по тегам