2016-06-03 2 views
1

Наша коммерческая банка, которая запускается с пакетными файлами (java -jar ..), распространяется вместе с нашей подписью. Это NOT, запущенное с JNLP. Он также содержит дополнительные сторонние библиотеки. Если какой-либо злоумышленник заменяет какой-либо класс java, банка перестает работать, потому что несоответствие подписи. Но если он удаляет файлы размером MANIFEST из фляги, больше нет чек. Как мы можем предотвратить запуск программы при замене любого класса? Одним из вариантов может быть проверка файлов манифеста в источнике Java, как указано Verifying Jar Signature и How to verify a jar signed with jarsigner programmatically, такие какJava предотвращает несанкционированное использование файлов сертификатов (манифест) в файлах jar

jarFile jar = new JarFile(new File("path/to/your/jar-file")); 

// This call will throw a java.lang.SecurityException if someone has tampered 
// with the signature of _any_ element of the JAR file. 
// Alas, it will proceed without a problem if the JAR file is not  signed at all 
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF")); 
Manifest manifest = new Manifest(is); 

, а также проверки CodeSigners и т.д.

manifest.getCodeSigners(); 

Но что происходит, когда человек, который пытается разбить банку, выполняет декомпиляцию (например, с помощью jad)? Чтобы предотвратить декомпиляцию, мы применили некоторые обфускаторы, но при декомпиляции мы можем видеть логику, даже если имена методов были изменены. Так что обфускации недостаточно.

Какое ваше предложение? Хороший ли подход к написанию кода проверки знака, сложного, например, с отражением api, добавление искаженных данных, некоторый код спагетти с goto, или вы можете посоветовать другую процедуру для предотвращения манифеста, а также сделать декомпиляторы неудачными? Я проверил параметры в обфускаторе, но что мы можем сделать на этапе написания кода, чтобы улучшить и усилить шаг обфускации?

+1

Одна вещь, которую я сделал, это включить мой открытый ключ в код и проверить подписи с использованием этого открытого ключа. Опять же, он не совершенен, ничего нет, но он сильнее, и он полагается на манифест и сертификаты. – EJP

ответ

1

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

Смежные вопросы