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: к чему это такое издевательство вообще?
Date: 2022-12-11 09:00 pm (UTC)Re: к чему это такое издевательство вообще?
Date: 2022-12-11 09:02 pm (UTC)Хм. Можно не заморачиваться так уж такой фигней. А просто дать что-нибудь запрограммировать. Чуть ли не физ-баз.
Re: не заморачиваться фигней / что-нибудь запрограммиро
Date: 2022-12-11 11:47 pm (UTC)Там из математики тоже есть, чем заняться.
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
Date: 2022-12-12 01:21 pm (UTC)But I should say that at least cfr is quite good and smart with obfuscated code!
For example, it even do some hints about problems it faced, like object fields with the same name, that completely impossible in the case of (as you said) a few standard compilers.
Look what it said to me: And after calling it with these flags in comments, it produced for the same bytecode: Do you see these prefixes for duplicated names? That's good!
Anyway, as I said, there are still some problems, and I created this one in their issue tracker:
"aload_0 - astore_2 for different types produces wrong code"
https://github.com/leibnitz27/cfr/issues/333