Вопрос

У нас есть приложение Java EE, которого поставщик больше не существует (из -за банкротства). К сожалению, мы должны внести некоторые изменения в функциональность приложения, а это означает, что обратное создание приложения Javaee.

Мы используем JD-GUI для обратного инженера около 70% приложения/классов, а затем настраиваем их вручную, чтобы построить в затмении.

Однако остальные не так легко построить, потому что они производятся генераторами кода? Какие инструменты я могу использовать, чтобы помочь дальше?

Редактировать:

Это один из примеров трудностей:

return ((SchemaTypeSystem)Class.forName(
    "org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl",
    true,
    class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())
        .getConstructor(new Class[] { Class.class })
        .newInstance(new Object[] { TypeSystemHolder.class }));

Трудно понять, что

class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())

Нет правильного решения

Другие советы

Дай Джаду (http://www.varaneckas.com/jad) попробовать.

Проблемный код, который вы показываете, эквивалентен следующему:

1) Class class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder;
2) ClassLoader loader = class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader();
3) Class type = Class.forName("org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl", true, loader);
4) Constructor ctor = type.getConstructor(Class.class);
5) Object obj = ctor.newInstance(TypeSystemHolder.class);
6) SchemaTypeSystem result = (SchemaTypeSystem) obj;
7) return result;

Часть, с которой у вас есть проблемы, - это линия 1, которая представляет локальную переменную или поле (возможно, статическое). Компилятор Java преобразует выражение «typesystemholder.class» в вызов GetClass, сохраняющий результат в статическом поле. Эта инициализация происходит один раз в каждом классе, который ссылается на «TypeSystemholder.class», а компилятор заменяет каждую вызовов, которая использует это выражение с помощью полевого доступа.

Большинство декомпиляторов не могут перевести эту идиому обратно на оригинальный призыв к «typesystemholder.class», но Джейд справляется с этим довольно хорошо. Кроме того, есть плагин, который интегрирует JAD (и других) в Eclipse (http://jadclipse.sourceforge.net).

К сожалению, декомпиляторы не обрабатывают каждую кодовую последовательность, сгенерированную компилятором, поэтому всегда требуется некоторое ручное переписывание. Например, компилятор Java может генерировать код для одного блока обработки исключений, который перекрывается с кодом для другого блока обработки исключений. Декомпиляторы не могут разделить это на два блока улова. В этом случае, обычно видят операторы GOTO, усеянные по всему коду (не действительный Java), или декомпилятор просто отказывается от этого метода.

Кроме того, вы правы, что это сгенерированный код. В частности, это из компилятора Xmlbeans, который анализирует схему XN XML и генерирует классы связывания для Java; Позволяя тому, что кто -то займет, и десериализуйте XML -документы, соответствующие этой схеме. Если у вас есть доступ к схеме, было бы лучше включить XMLBeans в вашу сборку вместо разложения этих классов.

Взгляни на сажа. Анкет Он не декомпилирует до исходного кода Java, но использует промежуточный слой, который можно компилироваться. Хотя это еще один язык для изучения, вы получите необходимую гибкость.

Кроме того, если вы вносите только небольшие изменения, вы можете просто атаковать файлы по отдельности и оставить остальные нетронутыми.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top