Есть ли дизассемблер + отладчик для 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"), но я не могу найти два других "инструмента":
- отладчик, который проходит через сами инструкции (со стеком, дампами памяти и т. д.), позволяющие мне исследовать фактический код и среду.
- способ обратить процесс-отредактируйте разобранный код и воссоздайте его .файл класса (с отредактированным кодом).
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. Этот подход не является полностью автоматическим, но он должен выполнять свою работу.