Существует ли дизассемблер + отладчик для Java (крыло OllyDbg / SoftICE для ассемблера)?

Существует ли утилита, подобная OllyDbg / SoftICE для Java? Т.е. выполните класс (от банки / с путем к классу) и, без исходного кода, покажите, что дизассемблирование промежуточного кода со способностью ступить через / переступает / поиск ссылок / редактирует определенный промежуточный код в памяти / применяют редактирование к файлу...

В противном случае даже возможно записать что-то вроде этого (предположение, что мы готовы жить без горячей точки на время отладки)?

Править: Я не говорю о JAD или JD или Cavaj. Это прекрасные декомпиляторы, но я не хочу декомпилятор по нескольким причинам, самый известный то, что их вывод является неправильным (в лучшем случае иногда просто неправильно). Я не ищу волшебные "скомпилированные байты к коду Java" - я хочу видеть фактические байты, которые собираются быть выполненными. Кроме того, я хотел бы способность изменить те байты (точно так же, как в отладчике блока) и, надо надеяться, записать измененную часть обратно в файл класса.

Edit2: Я знаю, что javap существует - но он делает только один путь (и без любого вида анализа). Пример (код, взятый из vmspec документации): Из кода Java мы используем "javac" для компиляции этого:

void setIt(int value) {
    i = value;
}
int getIt() {
    return i;
}

к Java .class файл. Используя javap-c я могу получить этот вывод:

    Method void setIt(int)
   0    aload_0
   1    iload_1
   2    putfield #4
   5    return
    Method int getIt()
   0    aload_0
   1    getfield #4
   4    ireturn

Это хорошо для части дизассемблирования (не действительно хороший без анализа - "поле № 4, Example.i"), но я не могу найти два других "инструмента":

  1. Отладчик, который пробегается через сами инструкции (со стеком, дампами памяти, и т.д.), позволяя мне исследовать фактический код и среду.
  2. Способ инвертировать процесс - редактирует демонтированный код и воссоздает .class файл (с отредактированным кодом).
17
задан Ran Biron 31 March 2010 в 11:35
поделиться

2 ответа

Я не думаю, что это действительно полный ответ, но некоторые указатели, которые могут дать что-то работоспособное:

(1) В плане просмотра и непосредственной работы с байткодом может быть полезен старый BCEL Class Construction Kit (это единственный известный мне GUI-редактор байткода).

(2) Что касается отладки и пошагового просмотра байткода, этот плагин для Eclipse, который интегрируется с отладчиком Eclipse, может удовлетворить ваши потребности.

Я не знаю ни одной утилиты, которая объединила бы эти возможности и позволила бы вам манипулировать байткодом во время выполнения кода (по крайней мере, так, как это можно делать в OllyDbg и т.д.). Однако API отладчика Java должен поддерживать манипуляции с кодом во время выполнения (хотя, учитывая природу HotSpot и JIT в целом, я не знаю, возможно ли переписать инструкцию непосредственно перед ее вызовом - текущий исполняемый опкод байткода на самом деле является абстракцией того, как интерпретатор решит реализовать операцию, в отличие от родного кода, где дизассемблированный опкод на самом деле является инструкцией, отправленной в CPU). В качестве альтернативы можно рассмотреть Java Instrumentation API, который предоставляет способ переопределения байт-кода во время выполнения. И, конечно, любая из различных библиотек манипулирования байткодом с открытым исходным кодом может помочь или вдохновить.

И, конечно, всегда есть возможность обойти всю инфраструктуру JVM и просто прикрепить отладчик к процессу JVM. Есть некоторое обсуждение этого в этом вопросе и на этой странице, связанной с этим вопросом.

Суть, однако, в том, что то, чего вы, похоже, пытаетесь достичь, хотя и является обычной практикой в мире нативного кода, не так уж часто встречается в мире Java (часть причины использования Java - абстрагирование от всех деталей). Это, а также относительно тривиальный характер декомпиляции байт-кода (по сравнению, скажем, с C++) привели к ситуации, когда требований такого типа мало, как и инструментов такого типа.

12
ответ дан 30 November 2019 в 14:21
поделиться

Взгляните на JAD Decomplier для декомпиляции кода Java. Затем вы можете запустить встроенный отладчик IDE, используя созданные источники. IDE может быть IntelliJ, Eclipse или NetBeans. Этот подход не является полностью автоматическим, но он должен работать.

2
ответ дан 30 November 2019 в 14:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: