Страницы

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

вторник, 31 декабря 2019 г.

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

#java #декомпиляция #обратная_разработка


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


Ответы

Ответ 1



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

Ответ 2



декомпилируйте оба джарника совместно. Если декомпилятор не позволяет задавать 2 джарника, объедините их в один. Джарник это zip файл, просто по другому называется, так что объединять можно и ручками.

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

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