Java byte code - disassembler
Dec. 11th, 2022 05:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Компания У дала два apk с определённой задачей.
Быстро нашёл, как из apk с помощью dex2jar получить jar-файлы, а потом с помощью jd-gui получить исходный код.
Этого хватило на первую часть первого apk, а потом меня ожидала засада: некоторые java-файлы созданные jd не то чтобы не содержали кода методов, некоторые из них и классов не содержали!
А некоторые части кода не вызывали доверия, например:
Пошёл смотреть всё же, что javap рассказывает. Но это же надо знать эти инструкции, а я до такого практически никогда не спускался.
Но этого было достаточно, чтобы понять, что jd нагенерил полную чушь здесь!
Делать нечего, пошёл искать что-то более продвинутое в плане получения java-кода из class-файлов.
Через проект procyon вышел на cfr, и вот этот уже намного лучше перевёл всё в java-код, и пустой файл обрёл соответствующий класс внутри, аллилуия! Тот кусок превратился в более осмысленный.
Но "недолго музыка играла", всплыли ещё участки, где нет смысла.
"Искусство в большом долгу!" (Покровские ворота)
Что ж, пойду читать эту смешенную смешную машину, обхихикаться...
С другой стороны, понял, что ничего сверхестественного за десятилетия с явой ничего не произошло, я когда-то сам запутывал свой код для апплета.
Кто не в курсе, в яве можно много чего "накрутить", т.к. там используется юникод и есть контексты, в которых различается использование идентификатора, поэтому, например, можно:
https://mpd.livejournal.com/186127.html
Быстро нашёл, как из apk с помощью dex2jar получить jar-файлы, а потом с помощью jd-gui получить исходный код.
Этого хватило на первую часть первого apk, а потом меня ожидала засада: некоторые java-файлы созданные jd не то чтобы не содержали кода методов, некоторые из них и классов не содержали!
А некоторые части кода не вызывали доверия, например:
(new int[2])[0] = какое-то число; (new int[2])[1] = другое число; int i = (new int[2])[b];Сразу понятно, что не будет такое работать (в смысле, скомпилируется и будет работать, но смысла - нет вообще).
Пошёл смотреть всё же, что javap рассказывает. Но это же надо знать эти инструкции, а я до такого практически никогда не спускался.
Но этого было достаточно, чтобы понять, что jd нагенерил полную чушь здесь!
Делать нечего, пошёл искать что-то более продвинутое в плане получения java-кода из class-файлов.
Через проект procyon вышел на cfr, и вот этот уже намного лучше перевёл всё в java-код, и пустой файл обрёл соответствующий класс внутри, аллилуия! Тот кусок превратился в более осмысленный.
Но "недолго музыка играла", всплыли ещё участки, где нет смысла.
"Искусство в большом долгу!" (Покровские ворота)
Что ж, пойду читать эту смешенную смешную машину, обхихикаться...
С другой стороны, понял, что ничего сверхестественного за десятилетия с явой ничего не произошло, я когда-то сам запутывал свой код для апплета.
Кто не в курсе, в яве можно много чего "накрутить", т.к. там используется юникод и есть контексты, в которых различается использование идентификатора, поэтому, например, можно:
- для классов, их методов, переменных - можно такие юникодовские имена выбирать, что потом это видеть, ну, только - развидеть!!!
- вполне допустимо иметь и переменную, и метод с одним и тем же названием, т.к. по месту использования понятно, что из этого используется
- и перегрузку никто не отменял, у вас может быть метод класса (статический) и объекта
- на всё это накладывается, что в этом же коде может быть и тип с таким же именем
- наверно, я что-то забыл, например, что ключевое слово может использоваться для имени класса...
https://mpd.livejournal.com/186127.html
no subject
Date: 2022-12-11 07:28 pm (UTC)А к чему это такое издевательство вообще?
Re: к чему это такое издевательство вообще?
From:Re: к чему это такое издевательство вообще?
From:Re: не заморачиваться фигней / что-нибудь запрограммиро
From:no subject
Date: 2022-12-12 10:15 am (UTC)I patched a few methods by hand and using ASM, and the decompilers were stuck, unable to express that code in Java.
Re: only for code generated using a few standard compilers
From: