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

#java #android #security

#java #Android #Безопасность

Вопрос:

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

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

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

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

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

Ответ №1:

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

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

Комментарии:

1. Проблема с этим вызовом заключается в том, что он указывает имя пакета. Имя пакета является случайным… Но имя файла не является…

2. итак, вы хотите найти класс, который находится в том же пакете, что и класс, из которого вы его проверяете? это вопрос?

3. Мне нужно найти класс, который может быть случайным образом расположен в любом месте моего приложения. Класс размещается случайным образом с помощью «исправления взлома»

4. Ну, я уже знал об этом вызове и использовал его… На самом деле в этом сообщении не было правильного ответа, но поскольку в итоге я использовал эту конкретную проверку, а вы опубликовали сообщение первым, я назначу вам правильный ответ.

5. Это может вызвать ошибку NoClassDefFoundError, которая не должна быть перехвачена, потому что это ошибка.

Ответ №2:

Вот что я использовал в 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();
}
  

Ответ №3:

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

 public static Class<?> forName (String className)
  

и проверьте ClassNotFoundException

http://developer.android.com/reference/java/lang/Class.html#forName(java.lang .Строка)

Комментарии:

1. Та же проблема с сообщением @Liv… Это не работает, поскольку мне пришлось бы указать точный путь в пакете, в котором найден класс. В моем случае класс мог быть где-то случайно сохранен в моем пакете приложений.

2. с риском оказаться ублюдком — отличается ли это от того, что я предложил?

3. @Liv ты видел разницу во времени между двумя ответами? Нет, это не сильно отличается. В чем смысл?

4. @Moto пожалуйста, обновите свой вопрос, объясняющий, как работает этот взлом, чтобы у нас была идея получше. На данный момент я действительно не понимаю, что вам нужно.

Ответ №4:

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

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

Комментарии:

1. Спасибо за ответ… Ну, он загружается после официального выпуска приложения. Этот конкретный файл обходит проверки лицензирования… Чем он распространяется свободно.

2. Извините, я спрашиваю, что в вашем официальном приложении загружает класс, если вы заранее не знаете, в каком пакете он находится. Классы загружаются в ответ на ссылки из других классов или загружаются через SPI или какой-либо другой механизм. Простого наличия класса в jar было бы недостаточно для его загрузки.

3. Это интересный момент. Ну, я предполагаю, что этот класс исправления подключен к моей проверке лицензирования. Не уверен точно, где, но я знаю, что он должен быть загружен, как только я выполню проверку лицензирования.

4. Да… Декомпилировал мое взломанное приложение, и повсюду я вижу включение в этот конкретный файл исправления….