Страницы

Поиск по вопросам

четверг, 20 декабря 2018 г.

Как отладить обфусцированную программу, декомпилированную fernflower'ом или приключения джуниора?

Честно говоря ни чем таким раньше не занимался, однако передо мной стоит задача разобрать писанину предыдущего разраба, который психанув, ушёл из проекта, и скажем так восстановить программу из последнего релиза, т.к. он забрал с собой сорцы. Я же совсем новенький в яве, мало чего ещё понимаю, но задачу эту повесили на меня. Но чтож. Немного погуглив, нашёл наиболее хорошо оцениваемый декомпилятор/деобфускатор 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'ы? Спасибо, друзья!


Ответ

Для начала, задание по восстановлению сорцов (то есть, логики) из декомпилята — задача не для джуниора, а для профи-специалиста. Если вам платят джуниорскую зарплату при этом — немедленно психуйте, убегайте и ищите себе нормальную работу. (Можете забрать с собой деобфусцированные исходники тоже.) ЗЫ: из хорошей конторы ваш предшественник сломя голову не побежал бы. Если вы и восстановите компилируемость, вам придётся разобраться в логике. Если вы всё же хотите набраться опыта — считайте декомпилированный код «намёком» на правильный, и раскидывайте куски по проектам вручную. Насколько я понимаю, автоматически восстановить обфусцированные названия классов невозможно, если только обфускатор не сохранил где-то информацию о первоначальных именах. Пичалько. Версия использованной библиотеки вполне может быть в метаданных (тут я не спец), поищите информацию. Если нет — придётся подбирать вручную. По поводу непонятных конструкций — присмотритесь к ним, скорее всего, вы найдёте в них какую-то логику, и сможете быстро понять, где оригинальный код, а где добавка от обфускатора. И ещё раз, помните, что это очень сложная и высококвалифицированная работа. Возможно, переписать проект с нуля будет более простым решением! И потребуйте хорошую премию, задание вам досталось крайне сложное.

Комментариев нет:

Отправить комментарий