Честно говоря ни чем таким раньше не занимался, однако передо мной стоит задача разобрать писанину предыдущего разраба, который психанув, ушёл из проекта, и скажем так восстановить программу из последнего релиза, т.к. он забрал с собой сорцы. Я же совсем новенький в яве, мало чего ещё понимаю, но задачу эту повесили на меня. Но чтож. Немного погуглив, нашёл наиболее хорошо оцениваемый декомпилятор/деобфускатор fernflower. Написал простенькую прогу, скомпилил, а потом декомпильнул ффом. Вроде годный, компилируемый сорц получился. Потом принялся за работу над задачей: Программа в целом состояла из двух частей: стартер/апдейтер и собственно сама программа. Стартер апдейтит прогу при необходимости, после чего запускает её через SwingUtils.InvokeLater runnable ProccessBuilder. Я декомпильнул стартер, получившийся код впряг в новый проджект в моей любомой NetBeans IDE, определил и вынес либы, но код не стал декомпилиться: проблема оказалась в том, что где-то запрашивался класс, не присутствующий в жарнике стартера (крэшрепортер), также заметил что в этом же жарнике лежат "лишние" классы, т.е. те классы, которые вообще не из мира сего. И я сначала свалил всё на фф, но заглянув в папку, куда распаковал собственно жарник стартера (с компилированными классами), я обнаружил что действительно не хватает нужных классов. Тогда я решил, что стоит попробовать декомпильнуть второй жарник, и к моему величайшему удивлению, в нём оказался тот самый класс крэшрепортера, а пошарив по классам второго жарника, нашёл импорты "лишних" классов из первого o_0. Тут я понял, что если не решу это говнище, то меня наверняка выпрут с работы, я впаду в депрессию и сопьюсь, и с такой нехилой мотивацией начал искать и сравнивать с декомпиленными сорцами, в поисках используемой версии, кучу либ... Сейчас добавил больше половины, но при просмотре классов во втором жарнике, обнаружил, что они были обфусцированны, т.к. в большинстве случаев, названия переменных были аля var151 и так далее, но ещё больше меня поразило обилие классов вида a.class, aa.class, ab.class в основном пакете. Также во втором жарнике в классах нередко встречались конструкции аля: try { a = b(); } catch (Exception var7) { ; } И самое ужасное, что обфусцированный код второго жарника теперь кишит ошибками CannotFindSymbol... Я знаю, что спрашивать несколько вопросов в одном - нехорошо, но разносить описание на кучу вопросов - тоже будет неправильно. И как вы поняли дорогие друзья, я прошу вашей помощи: 1. Как объяснить несказанно раскиданные классы (моё предположение, что стартер и основное приложение было одним проектом, а при сборке распихивалось по разным ярникам, т.к. иначе присутствие классов с ошибками импорта в скомпиленном проекте нельзя объяснить) 2. Как быстро распутать белиберду в основном пакете. Может есть какой-то способ автоматом восстановить названия классов, свойств и методов, или всё придётся делать вручную? 3. Как быстро определить версию используемой библиотеки, если нигде про неё не написано. Может есть какая-нибудь программа? 4. Как легче всего отладить программу и убрать все эти непонятные конструкции и cannotfindsymbol'ы? Спасибо, друзья!
Ответ
Для начала, задание по восстановлению сорцов (то есть, логики) из декомпилята — задача не для джуниора, а для профи-специалиста. Если вам платят джуниорскую зарплату при этом — немедленно психуйте, убегайте и ищите себе нормальную работу. (Можете забрать с собой деобфусцированные исходники тоже.) ЗЫ: из хорошей конторы ваш предшественник сломя голову не побежал бы. Если вы и восстановите компилируемость, вам придётся разобраться в логике. Если вы всё же хотите набраться опыта — считайте декомпилированный код «намёком» на правильный, и раскидывайте куски по проектам вручную. Насколько я понимаю, автоматически восстановить обфусцированные названия классов невозможно, если только обфускатор не сохранил где-то информацию о первоначальных именах. Пичалько. Версия использованной библиотеки вполне может быть в метаданных (тут я не спец), поищите информацию. Если нет — придётся подбирать вручную. По поводу непонятных конструкций — присмотритесь к ним, скорее всего, вы найдёте в них какую-то логику, и сможете быстро понять, где оригинальный код, а где добавка от обфускатора. И ещё раз, помните, что это очень сложная и высококвалифицированная работа. Возможно, переписать проект с нуля будет более простым решением! И потребуйте хорошую премию, задание вам досталось крайне сложное.
Комментариев нет:
Отправить комментарий