Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Получение байткода


Автор: vorondev 1.11.2011, 08:36
Решили написать защиту байт кода, сам class зашифровали, для запуска немного изменен стандартный classloader, native библиотека его расшифровывает и возвращает уже объект типа Class.
Собственно вопрос, возможно ли как то перехватить этот байт код после расшифровки и трансформации в Class ?

Автор: dobrolub 1.11.2011, 08:56
Посмотри на java.lang.instrument.ClassFileTransformer. Судя по описанию, с помощью этой штуки можно вытащить байткод.

Автор: vorondev 1.11.2011, 09:29
Цитата(dobrolub @ 1.11.2011,  08:56)
Посмотри на java.lang.instrument.ClassFileTransformer. Судя по описанию, с помощью этой штуки можно вытащить байткод.

Эта штука создана для замена существующего байт кода на новый. Так что не подойдет.

Автор: Skipy 1.11.2011, 12:46
У Вас должен быть хотя бы один незашифрованный класс. Подозреваю, что это Ваш classloader. Дизассемблируем, получаем принцип работы с Вашей native-библиотекой. Пишем свой код, который делает то же, что и Ваш classloader. Получаем байткод. Как-то так.

Автор: vorondev 1.11.2011, 12:59
Расшифровка идет в native библиотеке, изъять оттуда алгоритм и ключ шифрования проблематично, да и это уже совсем другая тема. Интересует именно получения байткода после расшифровки.

Автор: vorondev 1.11.2011, 13:15
Т.е. вот кусок кода

Код

   private final Class<?> defineClassCond(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain, boolean verify) throws ClassFormatError
         {
                 protectionDomain = preDefineClass(name, protectionDomain);
                 Class c;
                 String source = defineClassSourceLocation(protectionDomain);
                 try
                 {
                        c = ClassTransform.defineClass3(this, name, b, off, len, protectionDomain, source, verify);
                 }
                 catch(Exception e)
                 {
                        c = defineTransformedClass(name, b, off, len, protectionDomain, e, source, verify);
                 }
                 postDefineClass(c, protectionDomain);
                 return c;
         }


ClassTransform.defineClass3 - это тот самый native метод 

Автор: dobrolub 1.11.2011, 18:37
Цитата
Эта штука создана для замена существующего байт кода на новый. Так что не подойдет. 

Я вы всё таки проверил.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)