Комментарии 9
Почему декомпиляторы код не всегда могут восстановить?
По моему опыту, это происходит в случае когда едет стэк и в итоге не правильно пересчитывается размер фрейма.
А более понятным языком можете объяснить? И что делать в таких случаях? Какой декомпилятор умеет нормально это делать?
Сложно ответить в одно сообщение… такие случаи могут возникнуть если вы декомпилируете байт-код написанный под особые интерпритаторы (или надстройки языка например), или если в код внесли изменения, но не соблюли спецификацию java
можно взять декомпилятор jd-gui, он вполне не плохо разбирает байт-код, но например код котлин он разбирает не всегда
Почему декомпиляторы код не всегда могут восстановить?
Кратко: Потому что не любая валидная последовательность инструкций байткода может быть представлена в виде кода на Java.
Например, в байткоде есть инструкция безусловного перехода (
goto
), а в Java нет. Или пример посложнее: Декомпиляторы рассчитывают, что для конструкции
try ... catch ... finally
тело catch
идёт после try
, а finally
— после их обоих. В байткоде может быть не так. Тела и catch
и finally
могут располагаться где угодно в пределах метода и даже быть общим для нескольких конструкций try ...
.Ну и банально в декомпиляторе может быть не учтён какой-нибудь вариант, генерируемый
javac
. Генерируемое компиляторами других языков обычно вообще не учитывают, а там всё может быть сильно иначе.А более понятным языком можете объяснить?
Вы не в детском саду, чтобы вам «понятным языком» объясняли. Задайте конкретный вопрос и получите конкретный ответ.
И что делать в таких случаях?
У вас три варианта:
- Заняться самообразованием и изучить Java Virtual Machine Specification. В частности — строение class-файлов, инструкции байткода и то, как исходный код на Java транслируется в байткод.
После этого вы сможете исследовать логику программы даже если декомпилятор окажется бессилен. Авторы модов для Майнкрафта смогли разобраться и вы тоже сможете, там не сложно. - Нанять кого-либо, кто сделал пункт №1 вместо вас.
- Смириться и довольствоваться тем, что есть.
Какой декомпилятор умеет нормально это делать?
Если вам нужен декомпилятор, который из абсолютно любого class-файла сгенерирует исходный код на Java, то такого декомпилятора не существует и существовать не может.
С большинством необфусцированных class-файлов прекрасно справляется декомпилятор, встроенный в IntelliJ IDEA. Обфусцированные же class-файлы, то есть такие, исследование которых намеренно попытались затруднить, в полностью автоматическом режиме вы не декомпилируете.
Красиво, можно кстати посмотреть как в jazzer инструментируют, может интересное что-нибудь найдете
Хорошие инструментаторы) я про вот этот juzzer https://github.com/CodeIntelligenceTesting/jazzer
Инструментация байт-кода Java