#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. Да… Декомпилировал мое взломанное приложение, и повсюду я вижу включение в этот конкретный файл исправления….