Как стать автором
Обновить

Комментарии 9

Почему декомпиляторы код не всегда могут восстановить?

По моему опыту, это происходит в случае когда едет стэк и в итоге не правильно пересчитывается размер фрейма.

А более понятным языком можете объяснить? И что делать в таких случаях? Какой декомпилятор умеет нормально это делать?

Сложно ответить в одно сообщение… такие случаи могут возникнуть если вы декомпилируете байт-код написанный под особые интерпритаторы (или надстройки языка например), или если в код внесли изменения, но не соблюли спецификацию java

можно взять декомпилятор jd-gui, он вполне не плохо разбирает байт-код, но например код котлин он разбирает не всегда

Почему декомпиляторы код не всегда могут восстановить?

Кратко: Потому что не любая валидная последовательность инструкций байткода может быть представлена в виде кода на Java.

Например, в байткоде есть инструкция безусловного перехода (goto), а в Java нет.

Или пример посложнее: Декомпиляторы рассчитывают, что для конструкции try ... catch ... finally тело catch идёт после try, а finally — после их обоих. В байткоде может быть не так. Тела и catch и finally могут располагаться где угодно в пределах метода и даже быть общим для нескольких конструкций try ....

Ну и банально в декомпиляторе может быть не учтён какой-нибудь вариант, генерируемый javac. Генерируемое компиляторами других языков обычно вообще не учитывают, а там всё может быть сильно иначе.
А более понятным языком можете объяснить?

Вы не в детском саду, чтобы вам «понятным языком» объясняли. Задайте конкретный вопрос и получите конкретный ответ.

И что делать в таких случаях?

У вас три варианта:
  1. Заняться самообразованием и изучить Java Virtual Machine Specification. В частности — строение class-файлов, инструкции байткода и то, как исходный код на Java транслируется в байткод.

    После этого вы сможете исследовать логику программы даже если декомпилятор окажется бессилен. Авторы модов для Майнкрафта смогли разобраться и вы тоже сможете, там не сложно.
  2. Нанять кого-либо, кто сделал пункт №1 вместо вас.
  3. Смириться и довольствоваться тем, что есть.


Какой декомпилятор умеет нормально это делать?

Если вам нужен декомпилятор, который из абсолютно любого class-файла сгенерирует исходный код на Java, то такого декомпилятора не существует и существовать не может.

С большинством необфусцированных class-файлов прекрасно справляется декомпилятор, встроенный в IntelliJ IDEA. Обфусцированные же class-файлы, то есть такие, исследование которых намеренно попытались затруднить, в полностью автоматическом режиме вы не декомпилируете.

Вы не в детском саду, чтобы вам «понятным языком» объясняли. Задайте конкретный вопрос и получите конкретный ответ.

Вопрос был конкретным. Вы же смогли понятно и достаточно кратко на него ответить, за что вам спасибо.

Красиво, можно кстати посмотреть как в jazzer инструментируют, может интересное что-нибудь найдете

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории