Есть ли дизассемблер + отладчик для java (ala OllyDbg / SoftICE для ассемблера)?

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

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

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

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

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

на java .файл класса. Используя 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 является примером.i"), но я не могу найти два других "инструмента":

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

2 ответов


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

(1) с точки зрения просмотра и непосредственной работы с байт-кодом старый строительный комплект класса BCEL может быть полезно (это единственный редактор GUI для байт-кода, о котором я знаю).

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

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

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

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


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