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