чем редактировать class файлы
Я использую Ubuntu.
Вот мой декомпилированный код:
9 ответов
Вы можете выполнить следующие шаги, чтобы изменить свой класс Java:
Используйте редактор байт-кода, например:
Будьте осторожны, потому что вам нужно очень хорошее знание байт-кода Java.
Вы также можете изменить класс во время выполнения с помощью переплетения байт-кода (например, AspectJ).
когда вы декомпилируете и изменяете код, вам нужно перейти в корневую папку вашего проекта eclipse и проверить свой класс в папке bin, который находится на том же уровне, что и src. затем откройте исходную банку с помощью инструмента zip ( 7zip подходит для этого) и поместите измененный класс в та же упаковка внутри банки.
— > Spring, Hibernate, EJB, использующий это для реализации прокси
— > мы можем манипулировать байт-кодом, чтобы выполнить некоторый программный анализ
— > мы можем использовать Javassist для реализации прозрачного кэша для возвращаемых значений метода, перехватывая все вызовы метода и делегируя только супер реализации при первом вызове.
Если вы хотите, чтобы на самом деле была программа, которая это делает, вам стоит взглянуть на некоторые из автоматических установщиков.
Вот способ, который я нашел:
Вы можете использовать любой декомпилятор, чтобы сначала декомпилировать файл.
Однажды я столкнулся с подобной проблемой, когда у меня не было исходного кода приложения, и мне пришлось внести очень небольшое изменение в файл.
Ниже то, что я сделал:
Извлеченный файл класса из банки
Открыл его в декомпиляторе (я использую JD GUI, вы можете легко получить его из многих ресурсов в интернете) Вы можете скачать его с здесь
Вы можете просмотреть все файлы в банке с помощью графического интерфейса JD.
Иногда нам нужно собрать один файл из тысячи файлов, чтобы решить проблему. В таком случае можно создать такую же структуру папок, как путь к классу, декомпилировать файл в java или скопировать файл java из исходного кода. Внесите необходимые изменения, скомпилируйте один конкретный файл в класс со всеми зависимостями /классами и, наконец, замените файл класса. Наконец перезапустите контейнер. После того, как война взорвана, файл не будет заменен.
Русские Блоги
Пошагово декомпилируйте apk, научите модифицировать smali и переупаковывать
1. Введение в инструмент:
1. apktool: aapt.exe, apktool.bat, apktool.jar; эти три файла используются вместе в одном каталоге для декомпиляции apk и переупаковки apk;
3. Auto-Sign: инструмент автоматической подписи, который будет подписывать переупакованный apk. Если он не подписан, его нельзя установить и использовать.
Сценарий использования: исходный код проекта потерян, только онлайн-apk, и нет подкрепления, требуется изменить адрес интерфейса apk, перепаковать его и выпустить снова.
2. Использование инструментов:
Инструментарий после декомпрессии показан на рисунке:
1. Идеи:Используйте инструмент dex2jar для декомпиляции и инструмент jd-gui для просмотра структуры проекта, просмотра исходного кода, поиска класса адреса интерфейса и изменения адреса интерфейса;
получитьФайл classes.dex(Он скомпилирован java файлом, а затем упакован инструментом dx), получит
Скопируйте classes.dex в папку распакованного инструмента dex2jar-0.0.9.15,
Под командной строкой перейдите в каталог, где находится dex2jar.bat, и введите команду:
Шаг второй:После завершения операции в этом каталоге будет сгенерирован файл class_dex2jar.jar, как показано на рисунке:
Затем откройте jd-gui.exe в папке jd-gui инструмента, используйте инструмент, чтобы открыть сгенерированный файл classes_dex2jar.jar, вы можете увидеть исходный код
2. Мышление: Apktool, декомпилируйте и измените файл smali, упакуйте его, найдите класс адреса интерфейса с помощью инструмента jd-gui и
Сравните файл smali и измените адрес интерфейса;
Загрузите apktool в вышеуказанных инструментах, разархивируйте и получите 3 файла: aapt.exe, apktool.bat, apktool.jar, которые нужно будет декомпилировать.
Файл APK помещается в этот каталог, как показано на рисунке:
Откройте интерфейс командной строки (run-CMD), найдите папку apktool и введите следующую команду:
После декомпиляции вы получите тестовую папку, откройте тестовую папку, внутри находятся различные декомпилированные файлы ресурсов.
Используйте jd-gui для просмотра исходного кода, чтобы найти класс адреса, затем найдите файл smali адреса в файле smali и измените адрес интерфейса в файле smali. к
, как показано на рисунке:
Найдите соответствующий адрес smali-файл в smali-файле
Измените адрес в smali-файле интерфейса и замените IP на доменное имя, как показано на рисунке:
После модификации сохраните.
3. Репак.Выполнить команды упаковки
В тестовом файле будет еще два файла, как показано ниже:
4. Подпишите apk,Переиздавать.
Следующим шагом будет использование инструмента подписи. Если он не подписан, он не будет работать правильно. Инструмент: auto-sign.zip
Скопируйте упакованный файл test.apk в распакованную папку автоподписи и выполните команду:
5. После запуска, Обнаружил, что он вылетает непосредственно при запуске на 5.0, студия Android обнаружила ошибку:
Вот расположение исходного кода на jd-gui
Как показано в сообщении об ошибке, после версии Android 5.0 необходимо явно указать назначение службы.
Затем вам нужно изменить классы, связанные с файлом smali, вот файл java2smali
Установка плагина, выберите локальную установку, не знаю, как установить плагин, загрузите его на Baidu.
Найдите расположение кода файла smali соответствующей проблемы:
Поскольку я не очень разбираюсь в грамматике smali, мы напрямую конвертируем написанный код Java в грамматику smali с помощью плагина, копируем его и заменяем исходный код smali.
Это код Java
Преобразовать в код smali
Соответствующий код будет отображаться непосредственно, и будет найден соответствующий результат преобразования:
Замените соответствующий код в соответствующем файле smali, который был декомпилирован, а затем выполните команду переупаковки, команду подписи и третий шаг.
Весь процесс несложный, если у вас есть терпение, вы можете успешно его изменить.
Существует ли редактор классов Java / байт-кода для редактирования инструкций? [закрыто]
Если вы разрабатываете приложение с нуля, вы можете сделать некоторые образованные выборы о том, когда звонить бесплатно. Ваша примерная программа в порядке: она выделяет память, возможно, у вас есть ее работа на несколько секунд, а затем закрывается, освобождая все ресурсы, которые она требовала.
Если вы пишете что-нибудь еще, сервер / долговременное приложение или библиотеку, которую должен использовать кто-то другой, вы должны ожидать бесплатного вызова всего, что вы malloc.
Игнорируя прагматическую сторону на секунду, гораздо безопаснее следовать строжайшему подход и заставить себя освободить все, что вы malloc. Если у вас нет привычки смотреть на утечки памяти, когда вы код, вы можете легко запустить несколько утечек. Так что, другими словами, да, вы можете обойтись без него; пожалуйста, будьте осторожны.
4 ответа
Я использую reJ для непосредственного редактирования файлов классов.
Позволяет редактировать инструкции, методы, пул констант, классы сравнения и разделенное представление с помощью шестнадцатеричного редактора.
Это невероятно круто.
Это позволяет вам разобрать файл класса в удобочитаемую сборку, отредактировать его, а затем снова собрать в класс. Первоначально он был разработан для написания запутанных крэкмесов, поэтому он поддерживает множество неясных функций, которых не поддерживают многие другие инструменты. Если вам нужны какие-либо функции, которые в данный момент не поддерживаются, не стесняйтесь связаться со мной, и я посмотрю, что я могу сделать.
Редактирование class файлов. Файл с расширением.class
Файлы CLASS можно компилировать из файлов JAVA при помощи команды javac, входящей в состав пакета инсталляции JVM. Многие интегрированные среды разработки Java, такие как Eclipse, могут компилировать файлы CLASS на ходу, пока разработчики пишут программный код.
Поскольку существует множество версий JVM (например, 1.4, 1.5 и 1.6), некоторые файлы CLASS могут быть несовместимы с определенными версиями JVM. Java Runtime Environment (JRE) может выполнять файлы CLASS, но не может компилировать их, поскольку не включает в себя бинарный javac.
Расширение файла.class представляет собой файл класса Java. Данный файл может быть открыт с помощью следующих программ: Oracle Java Runtime Environment, Eclipse IDE for Java Developers с подключаемым модулем JD-Eclipse, dirtyJOE, JD-GUI.
Файл формата CLASS открывается специальными программами. Чтобы открыть данный формат, скачайте одну из предложенных программ.
Чем открыть файл в формате CLASS
Расширение CLASS может быть представлено двумя основными исполнениями:
Выполняя команду javac, входящую в состав инсталляционного пакета JVM, можно получить расширение CLASS из Java-файлов. Некоторые интегрированные разновидности Java, например, Eclipse, поддерживают параллельную генерацию формата CLASS в процессе написания программного кода.
Ввиду того, что существует несколько модификаций JVM (включая версии 1.4-1.6), некоторые исполнения CLASS файлов могут не поддерживаться на определенных версиях JVM.
Отсутствие бинарного javac в комплексе Java Runtime Environment (JRE) не позволяет компилировать файлы CLASS, но не исключает возможности их фактического выполнения. JRE и JVM зачастую применяются как идентичные понятия, когда речь идет о платформе, запускающей Java приложения.
Методы и средства программирования, а также архитектура языка во многом схожа с представлением Java.
В основе Gambas следующие программные модули:
Программы для открытия CLASS файлов
Если CLASS расширение представляет собой категорию файлов, скомпилированную при помощи Java, для генерации и воспроизведения его на базе ОС Windows можно воспользоваться самыми разнообразными программными комплексами:
В данном представлении CLASS адаптирован и для платформы ОС Mac:
Расширение может быть открыто и на базе ОС Linux с применением все тех же программных плагинов
Обычно при компиляции Java-файла получаются.class-файлы примерно того же размера, что и исходник. Меня заинтересовало, можно ли по небольшому исходнику сделать.class-файл, который больше, сильно больше исходника.
Пул констант
0: aload_0 1: invokespecial #1 // Method java/lang/Object.» «:()V 4: iconst_0 5: istore_1 6: iconst_0 7: istore_1 8: iconst_0 9: istore_1 10: iconst_0 11: istore_1 12: iconst_0 13: istore_1 14: iconst_0 15: istore_1 16: iconst_0 17: istore_1 18: iconst_0 19: istore_1 20: iconst_0 21: istore_1 22: iconst_0 23: istore_1 24: iconst_0 25: istore_1 26: iconst_0 27: istore_1 28: iconst_0 29: istore_1 30: goto 38
То есть вызывается конструктор родительского класса, а затем 13 раз записывается единица в первую локальную переменную. После этого начинается длинная цепочка goto, которая обходит мимо всех остальных копий finally: 30->38->58->104->198->388->770->1536->3074->7168->15358->31740->64506, а по адресу 64506 мы находим долгожданную инструкцию return.
В промежутках между этими goto всевозможные комбинации нормальных и исключительных завершений каждого блока try. Неожиданным оказалось то, что для каждого finally, обрабатывающего исключение, для хранения исключения создаётся новая локальная переменная, даже если блоки заведомо взаимоисключающие. Из-за этого коду требуется 4097 локальных переменных. Небольшая статистика по инструкциям:
Таблица исключений
Таблица номеров строк
StackMapTable
Таращим дальше
Редактирование class файлов – «больная» для большинства модмейкеров тема, ведь что бы достигнуть определенного результат в этом деле нужно не только иметь начальные знания программирования, а еще и терпение и усидчивость, ибо большинство параметров определяется «методом тыка».
На данный момент модмейкеров, которые умеют и любят редактировать class файлы, почти не осталось, поэтому я и решил написать данный урок.
Процесс редактирования класс файлов моим методом можно условно поделить на четыре этапа:
I. Дешифровка class файла
II. Редактирование class файла
III. Шифрование class файла
IV. Оптимизация class файла для выполнения на устройствах (научно выражаясь, преверификация)
Для начала нам нужно скачать KEmulator любой версии(ну я надеюсь он есть у всех) и пак программ, ссылку на который я напишу в конце статьи. Скачали? Ну тогда начинаем.
После создания каталогов мы можем приступать к редактированию class файлов. Для начала копируем необходимый class файл и запускаем программу d2j.jar в kemulator’e. Сразу же, без всяких церемоний, мы видим окно с двумя полями для ввода адресов
В первом поле мы вводим адрес class файла т.е. «\root\class\*.class», где *- название класса
Во втором поле мы вводим адрес папки, в которой будет сохранен дешифрированный class, в нашем случае это «\root\j\»
После ввода путей, нажимаем кнопочку, которая находится в правом нижнем углу или клавишу F2. После пары секунд раздумий, программа выдаст нам желаемый результат
На этом с дешифрацией class файла покончено.
После получения class файла в 3ем пункте, нам необходимо выполнить преверификацию. Это необходимо для оптимизации class файла, что бы мод мог спокойно работать на мобильных телефонах, т.е. для внутренних тестов на kemulator’e её можно не выполнять.
Что бы выполнить преверификацию, мы запускаем preverifier.jar в kemulator’e и видим такое окно с двумя полями для ввода адресов.
В первом поле мы указываем адрес к папке с новым class файлом, в нашем случае это «\root\nclass\»
Во втором указываем путь к папке, в которой будут хранится преверифицированные class файлы. В нашем случае это «\root\ver\»
После ввода путей нажимаем кнопку в правом нижнем углу или клавишу F2. В результате у Вас должно выскочить подобное уведомление.Хочу обратить Ваше внимание на то, что на выходе мы получим class с добавленной в название приставкой в виде названия папки. В нашем случае это выглядит так *class>ver*.class. Разумеется перед возвращением файла на его законное место, эту приставку нужно убрать.
Итог
В данной статье я попытался подробно расписать один из методов редактирования class файлов. Разумеется, имеются и другие, более простые методы редактирования, но зачастую они просты лишь снаружи и не дают возможности воплотить все мысли модмейкера или просто не до конца выполняют свою работу, например, не производят преверификацию class файла.
Внутренности JVM, Часть 2 — Структура class-файлов
Всем привет! Перевод статьи подготовлен специально для студентов курса «Разработчик Java».
Продолжаем разговор о том, как Java Virtual Machine работает внутри. В предыдущей статье (оригинал на анг.) мы рассмотрели подсистему загрузки классов. В этой статье мы поговорим о структуре class-файлов.
Рисунок — компиляция исходного кода Java
Давайте напишем простую программу.
Запуск javac для этого файла приведет к появлению следующих файлов.
Как видите, для каждого класса и интерфейса создается отдельный class-файл.
Что внутри class-файла?
Class-файл имеет бинарный формат. Информация в нем обычно записывается без отступов между последовательными частями информации, все выравнивается по границам байтов. Все 16-битные и 32-битные значения записываются с помощью двух или четырех последовательных 8-битных байтов.
Class-файл содержит следующую информацию.
Версия файла. Следующие четыре байта содержат мажорную и минорную версию файла. Вместе эти номера определяют версию формата class-файла. Если class-файл имеет основной мажорную версию M и минорную m, то мы обозначаем эту версию как M.m.
У каждой JVM есть ограничения по поддерживаемым версиям class-файлов. Например, Java 11 поддерживает major версию с 45 до 55, Java 12 — с 45 по 56.
Пул констант. Таблица структур, представляющих строковые константы, имена классов, интерфейсов, полей, методов и другие константы, которые есть в структуре ClassFile и ее подструктурах. Каждый элемент пула констант начинается с однобайтового тега, определяющего тип константы. В зависимости от типа константы следующие байты могут быть непосредственным значением константы или ссылкой на другой элемент в пуле.
This class. Ссылка на запись в пуле констант.
Super class. Ссылка на запись в пуле констант.
Интерфейсы. Количество интерфейсов, реализованных классом.
Количество полей. Количество полей в классе или интерфейсе.
Поля. После количества полей следует таблица структур переменной длины. По одной для каждого поля с описанием типа поля и названия (со ссылкой на пул констант).
Количество методов. Количество методов в классе или интерфейсе. Это число включает только методы, которые явно определены в классе, без методов, унаследованных от суперклассов.
Методы. Далее находятся сами методы. Для каждого метода содержится следующая информация: дескриптор метода (тип возвращаемого значения и список аргументов), количество слов, необходимых для локальных переменных метода, максимальное количество слов стека, необходимых для стека операндов метода, таблицу исключений, перехватываемых методом, байт-коды метода и таблица номеров строк.
Количество атрибутов. Количество атрибутов в этом классе, интерфейсе или модуле.
Атрибуты. После количества атрибутов следуют таблицы или структуры переменной длины, описывающие каждый атрибут. Например, всегда есть атрибут “SourceFile”. Он содержит имя исходного файла, из которого был скомпилирован class-файл.
Хотя class-файл напрямую не человекочитаемый, в JDK есть инструмент под названием javap, который выводит его содержимое в удобном формате.
Давайте напишем простую программу на Java, указанную ниже.
Здесь вы можете увидеть, что класс публичный ( public ) и у него в пуле констант 37 записей. Есть один атрибут (SourceFile внизу), класс реализует два интерфейса (Serializable, Cloneable), у него нет полей и есть два метода.
Больше почитать про javap вы можете здесь.
Совет: вы также можете использовать javap для того, чтобы увидеть, чем лямбды отличаются от анонимных внутренних классов.