Как растаращить class-файл. Расширение файла CLASS


Редактирование class файлов – «больная» для большинства модмейкеров тема, ведь что бы достигнуть определенного результат в этом деле нужно не только иметь начальные знания программирования, а еще и терпение и усидчивость, ибо большинство параметров определяется «методом тыка».
На данный момент модмейкеров, которые умеют и любят редактировать class файлы, почти не осталось, поэтому я и решил написать данный урок.
Процесс редактирования класс файлов моим методом можно условно поделить на четыре этапа:
I. Дешифровка class файла
II. Редактирование class файла
III. Шифрование class файла
IV. Оптимизация class файла для выполнения на устройствах (научно выражаясь, преверификация)

Для начала нам нужно скачать KEmulator любой версии(ну я надеюсь он есть у всех) и пак программ, ссылку на который я напишу в конце статьи. Скачали? Ну тогда начинаем.

Для удобства мы начнем с создания каталогов, которые просто необходимые в данной ситуации, ибо если все бросать в одну папку, то рано или поздно можно запутаться и потерять отредактированный class файл. Для этого проходим по пути …\KEmulator\file\root\ , если вдруг папки file нет, то берем и создаем её. После того, как открыли папку root, создаем в ней папки со следующими названиями:
сlass – эта папка будет содержать в себе оригинальные class файлы
j – эта папка будет содержать дешифрированные class файлы
nclass – эта будет содержать отредактированные class файлы
ver – эта будет содержать преверифицированные class файлы
т.е. в конечном итоге у вас должно получится что-то похожее


После создания каталогов мы можем приступать к редактированию class файлов. Для начала копируем необходимый class файл и запускаем программу d2j.jar в kemulator’e. Сразу же, без всяких церемоний, мы видим окно с двумя полями для ввода адресов
В первом поле мы вводим адрес class файла т.е. «\root\class\*.class», где *- название класса
Во втором поле мы вводим адрес папки, в которой будет сохранен дешифрированный class, в нашем случае это «\root\j\»

После ввода путей, нажимаем кнопочку, которая находится в правом нижнем углу или клавишу F2. После пары секунд раздумий, программа выдаст нам желаемый результат
На этом с дешифрацией class файла покончено.


После того, как мы выполнили дешифрацию класс файла, в папке j появится файл с названием *.j, где * - название класс файла. Файлы формата.j можно открывать стандартным блокнотом Windows, хотя я рекомендую использовать WordPad, так как он поддерживает форматирование текста, из чего следует повышение вашего комфорта.
Описывать куда, что и как нужно изменить в class’е для получения результата, я не буду, так как на эту тему написан не один десяток статей и для каждой игры свои особенности их редактирования. После внесения изменений не забываем сохраниться.


Шифрование, как вы уже должны были догадаться, этот процесс обратный дешифрованию, поэтому на вход мы дадим файл формата.j, а на выходе получим заветный. class.
Для начала мы запускаем j.jar в kemulator’е и видим подобное окно с двумя полями для ввода адресов
В первом поле мы указываем адрес к.j файлу т.е. к тому, который мы открывали и редактировали в WordPad’e. В нашем случае путь будет выглядеть так «\root\j\*.j» где * - название.j файла
Во втором поле мы указываем адрес к папке, в которой будет храниться новый class файл. В нашем случае адрес будет выглядеть так «\root\nclass\».
После ввода путей нажимаем кнопку в правом нижнем углу или клавишу F2. В результате у Вас должно выскочить подобное уведомление.


После получения class файла в 3ем пункте, нам необходимо выполнить преверификацию. Это необходимо для оптимизации class файла, что бы мод мог спокойно работать на мобильных телефонах, т.е. для внутренних тестов на kemulator’e её можно не выполнять.
Что бы выполнить преверификацию, мы запускаем preverifier.jar в kemulator’e и видим такое окно с двумя полями для ввода адресов.
В первом поле мы указываем адрес к папке с новым class файлом, в нашем случае это «\root\nclass\»
Во втором указываем путь к папке, в которой будут хранится преверифицированные class файлы. В нашем случае это «\root\ver\»
После ввода путей нажимаем кнопку в правом нижнем углу или клавишу F2. В результате у Вас должно выскочить подобное уведомление.Хочу обратить Ваше внимание на то, что на выходе мы получим class с добавленной в название приставкой в виде названия папки. В нашем случае это выглядит так *class>ver*.class. Разумеется перед возвращением файла на его законное место, эту приставку нужно убрать.


Итог
В данной статье я попытался подробно расписать один из методов редактирования class файлов. Разумеется, имеются и другие, более простые методы редактирования, но зачастую они просты лишь снаружи и не дают возможности воплотить все мысли модмейкера или просто не до конца выполняют свою работу, например, не производят преверификацию class файла.

Обычно при компиляции Java-файла получаются.class-файлы примерно того же размера, что и исходник. Меня заинтересовало, можно ли по небольшому исходнику сделать.class-файл, который больше, сильно больше исходника.

Можно поискать какие-то короткие конструкции языка, которые компилируются в длинные цепочки байткода, но линейный прирост меня не устраивал. Я сразу подумал про компиляцию finally-блоков: про неё уже писали на Хабре . Если вкратце, то для каждого finally-блока при непустом try-блоке создаётся минимум два варианта в байткоде: для случая нормального завершения try-блока и для случая завершения с исключением. В последнем случае исключение сохраняется в новую локальную переменную, выполняется код finally, затем исключение достаётся из локальной переменной и перебрасывается. А что если внутри finally снова разместить try-finally и так далее? Результат превзошёл все ожидания.

Я компилировал с помощью Oracle javac 1.7.0.60 и 1.8.0.25, результаты практически не отличались. Путь для исключения формируется даже в том случае, если в блоке try совсем ничего предосудительного. Например, присваивание целочисленной константы в локальную переменную - это две инструкции iconst и istore , ни про одну из них в спецификации не сказано, что они могут сгенерировать исключение. Так и будем писать:
class A {{ int a; try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { try {a=0;} finally { a=0; }}}}}}}}}}}} }}
Добавление нового нетривиального кода в самый внутренний finally вызывает ошибку компиляции code too large, поэтому ограничимся таким. Если кто-то подзабыл, это у нас блок инициализации , который подклеивается к каждому конструктору. Для нашей задачи метод объявлять смысла нет.

Такой исходник занимает 336 байт, а получившийся class-файл растаращило до 6 571 429 байт, то есть в 19 557 раз (назовём это коэффициентом растаращивания). Даже при отключении всей отладочной информации с помощью -g:none class-файл весит 6 522 221 байт, что ненамного меньше. Посмотрим, что внутри с помощью утилиты javap .

Пул констант
Пул констант получился небольшой: всего 16 записей. По сути всё самое необходимое: имена атрибутов типа Code, имя класса, Java-файла, ссылка на конструктор родительского класса Object и т. д. При отключении отладочной информации исчезают три записи: имена атрибутов LineNumberTable, SourceFile и значение A.java для атрибута SourceFile.
Код
Код конструктора по умолчанию составил 64507 байт, почти упираясь в максимально допустимый предел. Начинается он с нормального выполнения:

Код

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 локальных переменных. Небольшая статистика по инструкциям:

  • iconst_1 - 8191 раз
  • istore_1 - 8191 раз
  • goto - 4095 раз
  • athrow - 4095 раз
  • astore_2/aload_2 - 1 раз
  • astore_3/aload_3 - 1 раз
  • astore/aload - 252 раза (локальные переменные с номерами от 4 до 255)
  • astore_w/aload_w - 3841 раз (локальные переменные с номерами больше 255)
Плюс один aload_0, один invokespecial и один return - итого 32765 инструкций. Желающие могут нарисовать граф потока управления и повесить на стенку.
Таблица исключений
Таблица исключений содержит записи вида (start_pc, end_pc, handler_pc, catch_type) и говорит виртуальной машине «если при выполнении инструкций от адреса start_pc до адреса end_pc произошло исключение типа catch_type, то передай управление на адрес handler_pc». В данном случае catch_type везде равен any, то есть исключения любого типа. Записей в таблице 8188 и занимает она примерно столько же, сколько и код - около 64 килобайт. Начало выглядит так:
from to target type 26 28 33 any 24 26 41 any 42 44 49 any 49 51 49 any 22 24 61 any
Таблица номеров строк
Таблица номеров строк - это отладочная информация, сопоставляющая адресам инструкций байткода номера строк в исходнике. В ней 12288 записей и чаще всего попадаются ссылки на строчку с самым внутренним finally. Занимает она около 48 килобайт.
StackMapTable
Куда же ушло всё остальное место? Его заняла таблица StackMapTable , которая необходима для верификации class-файла. Если совсем грубо, для каждой точки ветвления в коде эта таблица содержит типы элементов в стеке и типы локальных переменных в данной точке. Так как локальных переменных у нас очень много и точек ветвления тоже, размер этой таблицы растёт квадратично от размера кода. Если бы локальные переменные для исключений в непересекающихся ветках переиспользовались, их бы потребовалось всего 13 и таблица StackMapTable была бы куда скромнее по размерам.
Таращим дальше
Можно ли растаращить class-файл ещё сильнее? Конечно, можно раскопировать метод, содержащий вложенные try-finally. Но компилятор вполне может сделать это за нас. Вспомните, что блок инициализации приклеивается к каждому конструктору автоматически. Достаточно добавить в код много пустых конструкторов с разными сигнатурами. Здесь будьте осторожны, а то у компилятора кончится память. Ну вот так можно скромненько написать, упаковав код в одну строчку:

Class A{{int a;try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{try{a=0;}finally{a=0;}}}}}}}}}}}}}A(){}A(int a){}A(char a){}A(double a){}A(float a){}A(long a){}A(short a){}A(boolean a){}A(String a){}A(Integer a){}A(Float a){}A(Short a){}A(Long a){}A(Double a){}A(Boolean a){}A(Character a){}}
Здесь у меня 16 конструкторов, исходник занимает 430 байт . После компиляции имеем 104 450 071 байт , коэффициент растаращивания составил 242 907 . И это не предел!

Если наша система не справляется с расширением.CLASS и подвели все автоматические и полуавтоматические методы обучения его этому искусству, остается ручное редактирование реестра Windows. Этот реестр хранит всю информацию, касающуюся рабоы нашей операционной системы, в том числе соединения расширений файлов с программами для их обслуживания. Команда REGEDIT вписанная в окне „поиск программ и файлов” или „запустить в случае старших версий операционной системы, предоставляет нам доступ к реестру нашей операционной системы. Все операции, проведенные в реестре (даже не очень сложные, касающееся расширения файла.CLASS) имеют значительное влияние на работу нашей системы, поэтому прежде чем проводить какие-либо модификации следует убедится, что сделана копия актуального реестра. Интересующий нас раздел - это ключ HKEY_CLASSES_ROOT . Следующая инструкция показывает, шаг за шагом, как модифицировать реестр, а конкретно запись в реестре, содержащую информацию о файле.CLASS.

Шаг за шагом

  • Нажмите кнопку “start”
  • В окне „найти программы и файлы” (в старших версиях системы Windows это окно „Запустить”) впишите команду „regedit” а затем утвердите операцию клавишей „ENTER”. Эта операция запустит системный редактор реестра. Этот инструмент позволит не только просмотреть существующие записи, но также провести их модификацию, добавление или удаление вручную. В связи с тем, что реестр системы Windows ключевой для ее работы, все операции, проводящиеся на ней, следует выполнять рассудительно и сознательно. Неосторожное устранение или модификация несоответственного ключа может необратимо повредить операционную систему.
  • С помощью комбинации клавишей ctr+F или меню Редактирование и опции „Найти” найдите интересующее вас расширение.CLASS, вписав его в окне поисковика. Утвердите, нажав OK или с помощью клавиши ENTER.
  • Запасная копия. Чрезвычайно важным является создание запасной копии реестра, прежде чем совершить в нем какие-либо изменения. Каждое изменение имеет влияние на действие нашего компьютера. В крайних случаях ошибочная модификация реестра может привести к невозможности повторного запуска системы.
  • Интересующее Вас значение, касающееся расширения, можно вручную редактировать изменяя ключи, приписанные к найденному расширению.CLASS. В этом месте Вы можете также самостоятельно создать нужную запись с расширением а.CLASS если такое отсутствует в реестре. Все доступные варианты находятся в подручном меню (правая кнопка мышки) или в меню "Редактирование" после размещения курсора в соответствующем месте на экране.
  • После окончания редактирования записи, касающейся расширения.CLASS закройте системный реестр. Введенные изменения войдут в жизнь после повторного запуска операционной системы.

Самой частой причиной проблем с раскрытием файла CLASS является просто отсутствие соответствующих приложений, установленных на Вашем компьютере. В таком случае достаточно найти, скачать и установить приложение, обслуживающее файлы в формате CLASS - такие программы доступны ниже.

Поисковая система

Введите расширение файла

Помощь

Подсказка

Необходимо учесть, что некоторые закодированные данные из файлов, которые наш компьютер не читает, иногда можно просмотреть в Блокноте. Таким образом мы прочитаем фрагменты текста или числа - Стоит проверить, действует ли этот метод также в случае файлов CLASS.

Что сделать, если приложение со списка уже было установлено?

Часто установленное приложение должно автоматически связаться с файлом CLASS. Если это не произошло, то файл CLASS успешно можно связать вручную с ново установленным приложением. Достаточно нажать правой кнопкой мышки на файл CLASS, а затем среди доступных выбрать опцию "Выбрать программу по умолчанию". Затем необходимо выбрать опцию "Просмотреть" и отыскать избранное приложение. Введенные изменения необходимо утвердить с помощью опции "OK".

Программы, открывающие файл CLASS

Windows
Mac OS
Linux

Почему я не могу открыть файл CLASS?

Проблемы с файлами CLASS могут иметь также другую почву. Иногда даже установление на компьютере программного обеспечения, обслуживающего файлы CLASS не решит проблему. Причиной невозможности открытия, а также работы с файлом CLASS может быть также:

Несоответственные связи файла CLASS в записях реестра
- повреждение файла CLASS, который мы открываем
- инфицирование файла CLASS (вирусы)
- слишком маленький ресурс компьютера
- неактуальные драйверы
- устранение расширения CLASS из реестра системы Windows
- незавершенная установка программы, обслуживающей расширение CLASS

Устранение этих проблем должно привести к свободному открытию и работе с файлами CLASS. В случае, если компьютер по-прежнему имеет проблемы с файлами, необходимо воспользоваться помощью эксперта, который установит точную причину.

Мой компьютер не показывает расширений файлов, что сделать?

В стандартных установках системы Windows пользователь компьютера не видит расширения файлов CLASS. Это успешно можно изменить в настройках. Достаточно войти в "Панель управления" и выбрать "Вид и персонализация". Затем необходимо войти в "Опции папок", и открыть "Вид". В закладке "Вид" находится опция "Укрыть расширения известных типов файлов" - необходимо выбрать эту опцию и подтвердить операцию нажатием кнопки "OK". В этот момент расширения всех файлов, в том числе CLASS должны появится сортированные по названию файла.

Что это за файл - CLASS?

File with a .CLASS extension contains a compiled Java source code in binary form, it is executable within the Java virtual machine environment - JVM. CLASS files are created as a result of using the javac compiler on a file with a . extension. The may originate from different versions of Java environment (JRE), therefore, they may not be compatible with a specific version of JVM, but still they can be run. JRE and JVM are sometimes used interchangeably, as description of environment in which Java files are executed. Currently, the Oracle Corporation develops the environment, which was acquired by Sun Microsystems.

Some programming environments which support Java enable verification of the source code and compiling it on the fly, while writing programs. It helps to prevent errors within a project and enables its faster building and running. CLASS files are usually packed into JAR files, which enable gathering files from a project or a library in one place, defined with the $CLASSPATH environment variable.

Программа(ы), умеющие открыть файл .CLASS

Windows
Mac OS
Linux

Если появилась ситуация, в которой Вы не можете открыть файл CLASS на своем компьютере - причин может быть несколько. Первой и одновременно самой важной (встречается чаще всего) является отсутствие соответствующей аппликации обслуживающей CLASS среди установленных на Вашем компьютере.

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

В дальнейшей части этой страницы Вы найдете другие возможные причины, вызывающие проблемы с файлами CLASS.

Возможные проблемы с файлами в формате CLASS

Отсутствие возможности открытия и работы с файлом CLASS, совсем не должен значить, что мы не имеем установленного на своем компьютере соответствующего программного обеспечения. Могут выступать другие проблемы, которые также блокируют нам возможность работы с файлом Java Bytecode Class Format. Ниже находится список возможных проблем.

  • Повреждение открываемого файла CLASS.
  • Ошибочные связи файла CLASS в записях реестра.
  • Случайное удаление описания расширения CLASS из реестра Windows
  • Некомплектная установка аппликации, обслуживающей формат CLASS
  • Открываемый файл CLASS инфицирован нежелательным, вредным программным обеспечением.
  • На компьютере слишком мало места, чтобы открыть файл CLASS.
  • Драйверы оборудования, используемого компьютером для открытия файла CLASS неактуальные.

Если Вы уверены, что все перечисленные поводы отсутствуют в Вашем случае (или были уже исключены), файл CLASS должен сотрудничать с Вашими программами без каких либо проблем. Если проблема с файлом CLASS все-таки не решена, это может значить, что в этом случае появилась другая, редкая проблема с файлом CLASS. В таком случае остается только помощь специалиста.

Unix Static Object Code Library Format
.a2w Alice Program World Format
.actx DS Game Maker Action Description Format
.ada ADA Language Source Code Format
.addin Microsoft Visual Studio Addin Format
Notatnik позволит нам увидеть часть данных, закодированных в файле. Этот метод позволяет просмотреть содержимое многих файлов, однако не в такой форме, как программа, предназначенная для их обслуживания.






2024 © gtavrl.ru.