@nekolov

Любой Java байт код можно успешно декомпилировать и просмотреть его?

Добрый день,
У меня есть несколько вопросов по реверсингу/декомпиляции.

Java код исполняется на Java машине но тем не менее если не были применены сторонние(крипторы, обфускаторы) для усложнения его де компиляции, всегда возможно увидеть именно оригинальный код?

Не имеет разница что мы будем декомпилировать?
Это могут быть любые типы java приложений содержащие java байт код например: apk, jar файлы... в любом случае мы можем получить первичный java код(еще раз повторюсь если не были применены крипторы, обфускаторы)?

К примеру если программа написанная на языке высокого уровня, и скомпилированна в бинарник то максимум что мы можем увидеть это ее ассемблер код(насколько я понимаю перевести код tasm/masm/fasm в язык высоко уровня именно в оригинальную версию не возможно).... с Java насколько я понимаю дела обстоят чуть иначе?
  • Вопрос задан
  • 742 просмотра
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Нет, вы не получите оригинальный код. В нем будут отсутствовать комментарии, часть констант, возможно заинлайнятся какие то вызовы, код будет более оптимален (если включена оптимизация). Не знаю еще как насчет препроцессоров и дефайнов - но их тоже не будет, если они есть в джаве.
Ответ написан
Комментировать
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Именно полностью оригинальный код не получится(если конечно не включены все дебагсимволы). Код восстановится до конструкций похожих т.е.:
условно говоря кострукции
for(int i:0;i<100;i++){}

или
for(Object o: objects){}

и еще тонна вариантов

В байткоде будет иметь одинаковый вид(не принимайте наслово но это образно говоря). А значит декомпилятор увидит подобный байткод и восстановит конструкцию именно ту которую посчитает наиболее удобной но не ту которая была в оригинале.
Аналогично с остальными случаями, констанатами,функциями,классами.
Кроме того не будут учитываться еще тонны тонкостей, взять хотя бы аннотации.

Т.е. в целом код будет читабелен, скорее всего но не факт компилируем, вероятно что рабочим но с глюками которых не было в оригинале.
В общем все напрямую зависит от компилятора, стиля кода, используемых фич которые что то делают именно на этапе компиляции, сахара библиотек и языка.

В том же с\с++ можно декомпилировать до асемблера а затем восстановить уже его до С, который также вполне читабелен и местами рабочий. Если есть дебаг символы то еще и тонны других вещей восстановится (имена констант\переменных\функций\коментариев).

Короче все очень относительно но в целом java код даже скомпиленный с оптимизациями намного более читабелен но это связанно с особенностями работы и самих бинарных файлов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 13:20
3000 руб./за проект
29 мар. 2024, в 12:59
15000 руб./за проект
29 мар. 2024, в 12:56
1500 руб./за проект