Этот проект больше не поддерживается
Рекомендуется использовать новую версию Jar Analyzer V2 https://github.com/jar-analyzer/jar-analyzer
Версия командной строки JAR-Analyzer
Jar-analyzer cli версия
Краткое введение: https://mp.weixin.qq.com/s/rrx6x5m_28ircqqcdxueeq
Нет английского документа, иностранцы, пожалуйста, переведите его самостоятельно
Инструмент GUI для анализа пакетов jar , особенно подходящий для аудитов безопасности кода. Несколько файлов jar могут быть проанализированы одновременно, и целевой метод можно легко найти. Поддерживает декомпиляцию байт -кода и автоматически конструировать отношения между классами и методами, чтобы помочь исследователям безопасности Java работать более эффективно.
Примечание. Не анализируйте слишком большие или слишком много пакетов Jar , рекомендуется не превышать 300M
Перейти к скачиванию
Может точно найти метод (выделено слева)

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

Может напрямую анализировать проекты, написанные Spring Framework

Почему бы не выбрать анализ IDEA : потому что IDEA не поддерживает анализ пакетов пассивных кодовых банок
Поддерживает шесть методов поиска:
LDC , чтобы найти точное местоположение)LDC , чтобы найти точное местоположение)Поддерживает выбор трех методов декомпиляции:
Используйте настройку класса компонентов JSyntaxPane (неофициально), чтобы показать код Java
(Много черных технологий добавлено в библиотеку https://code.google.com/archive/p/jsyntaxpane )
Поддерживает супер сильный поиск выражения, который можно объединить, как вы хотите найти информацию, которую вы хотите
| выражение | параметр | эффект |
|---|---|---|
| Namecontains | Нить | Имя метода содержит |
| запустить | Нить | Метод префикс |
| Энд | Нить | Метод суффикс |
| ClassnameContains | Нить | Имя класса содержит |
| returntype | Нить | Метод возврата типа |
| ParamtyPemap | int String | Метод Параметр соответствия |
| Paramsnum | инт | Количество параметров методов |
| ISSTATIC | логический | Метод статичен? |
| IssubClassof | Нить | Чья подкласс это |
| issuperclassof | Нить | Чей родительский класс это |
| Хасано | Нить | Аннотация метода |
| Хасклассано | Нить | Классовая аннотация |
| Хасфилд | Нить | Классовые поля |
Уведомление:
returnType и paramTypeMap требуют аналогичных полных имен классов, таких как java.lang.String , и напишите основной тип напрямую, например, intisSubClassOf и isSuperClassOf требуют полных имен классов, таких как java.awt.ComponenthasAnno и hasClassAnno не требуют полного имени класса, просто напишите его напрямую, например, Controller 
Основой поиска является метод, какой метод вы хотите найти
Например, я хочу, чтобы метод поиска начал с set и заканчиваться value
# method
. startWith ( "set" )
. endWith ( "value" ) Например, я хочу искать методы, имя которого содержит Context и имя метода, содержит lookup
# method
. nameContains ( "lookup" )
. classNameContains ( "Context" ) Например, я хочу найти метод, который возвращает в общей сложности 3 параметра типа Process , а второй параметр - String
# method
. returnType ( "java.lang.Process" )
. paramsNum ( 3 )
. paramTypeMap ( 1 , "java.lang.String" ) Например, мы хотим найти все подклассы javax.naming.spi.ObjectFactory (включая подклассы подклассов и т. Д.)
Просто напишите следующие правила, и программа будет рекурсивно искать все классы родителей
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" ) Если вы хотите найти все родительские классы определенного класса, просто используйте isSuperClassOf (обратите внимание на полное имя класса)
Обратите внимание, что вышеупомянутое непосредственно найдет все методы, которые соответствуют критериям, поэтому я предлагаю добавить немного фильтрации
Например
# method
. isSubClassOf ( "javax.naming.spi.ObjectFactory" )
. startWith ( "xxx" )
. paramsNum ( 0 ) Например, мы хотим найти все методы всех классов, аннотированных @Controller
Напишите следующие правила
# method
. hasClassAnno ( "Controller" ) Например, я хочу найти все методы аннотации @RequestMapping
# method
. hasAnno ( "RequestMapping" )Точно так же, поскольку найдены все методы, которые соответствуют классу критериев, я предлагаю добавить еще немного фильтрации
В соответствии с условиями Swing RCE , предоставленными онлайн -мастером:
Component (включая косвенные подклассы)Итак, мы пишем правило
# method
. startWith ( "set" )
. paramsNum ( 1 )
. paramTypeMap ( 0 , "java.lang.String" )
. isSubClassOf ( "java.awt.Component" )Результаты поиска

ВАЖНО: Пожалуйста, используйте Java 8+ для запуска (11 Рекомендованная и EXE Версия встроенной Java 11 JRE предоставлена)
(Лучший шрифт использовался в Java 11 , другие версии используют шрифты по умолчанию)
(1) Шаг 1: добавить файл jar (поддерживает отдельный файл jar и каталог jar )
Select Jar File , чтобы открыть файл JARПожалуйста, не волнуйтесь, требуется немного времени, чтобы проанализировать файл JAR
Примечание. Пожалуйста, подождите, пока панель прогресса не будет заполнен, а анализ будет завершен.
(2) Шаг 2: введите информацию, которую вы искали
Мы поддерживаем ввод в трех форматах:
javax.naming.Context (например)javax/naming/ContextContext (будет искать все *.Context классы)Предоставляет способ быстро войти

ПРИМЕЧАНИЕ: Общий контент поиска здесь может быть настроен для добавок
Создайте новый файл search.txt в текущем каталоге, разделите имя класса и метод один на один с # , например,
java.lang.Runtime#getRuntime
java.lang.String#equals
Бинарный поиск вернется только в том, существует или нет, и не будет возвращать конкретную информацию.

(3) Шаг 3: Вы можете дважды щелкнуть, чтобы декомпилировать
Курсор будет точно указать на местоположение вызова метода
Во время декомпиляции будут построены взаимосвязь между методами
Вы можете дважды щелкнуть в любом месте панели, чтобы декомпилировать и построить новые отношения и презентации.
Обратите внимание: если вы сталкиваетесь с ситуацией, когда вы не можете декомпилировать, вам нужно загрузить правильный файл JAR
Например, я не могу декомпилировать javax.naming.Context , потому что я не присоединился к файлу rt.jar , если вы присоединитесь к нему, он может быть нормально декомпилирован
Вы можете использовать Ctrl+F для поиска кода и редактировать
Вы можете нажать на любую опцию, и подробности метода будут отображаться дальше
Вы можете щелкнуть правой кнопкой мыши, чтобы отправить эту опцию в цепочку. Вы можете понять ссылку в качестве любимой или записи. В цепочке вы также можете дважды щелкнуть декомпил, а затем отобразить новое соотношение вызова метода или отобразить детали на автономной основе. Если вариант в цепочке-это то, что вы не хотите, вы можете щелкнуть правой кнопкой мыши, чтобы удалить опцию из цепи
Поэтому вы можете построить цепочку вызовов, которая принадлежит вам только
谁调用了当前方法, и当前方法调用了谁весь метод, в котором можно также разместить взаимосвязь между методом, нажмите, чтобы увидеть детали, щелкните правой кнопкой мыши, чтобы присоединиться к цепочке
Вы можете просмотреть текущий байтовый код класса с одним щелчком

(1) Какова взаимосвязь между методами
class Test {
void a (){
new Test (). b ();
}
void b (){
Test . c ();
}
static void c (){
// code
}
} Если текущий метод равен b
Кто назвал текущий метод: метод Test класса a
Кто вызывает текущий метод: метод Test класса c
(2) Как решить проблему реализации интерфейса
class Demo {
void demo (){
new Test (). test ();
}
}
interface Test {
void test ();
}
class Test1Impl implements Test {
@ Override
public void test () {
// code
}
}
class Test2Impl implements Test {
@ Override
public void test () {
// code
}
} Теперь у нас есть Demo.demo -> Test.test Demo.demo -> TestImpl.test
Итак, мы добавили новые правила: Test.test -> Test1Impl.test и Test.test -> Test2Impl.test .
Сначала убедитесь, что данные не потеряны, тогда мы можем вручную проанализировать декомпилированный код сами
Demo.demo -> Test.testTest.test -> Test1Impl.test / Test.test -> Test2Impl.test(3) Как разрешить отношения наследования
class Zoo {
void run (){
Animal dog = new Dog ();
dog . eat ();
}
}
class Animal {
void eat () {
// code
}
}
class Dog extends Animal {
@ Override
void eat () {
// code
}
}
class Cat extends Animal {
@ Override
void eat () {
// code
}
} Zoo.run -> dog.cat 's Bytecode INVOKEVIRTUAL Animal.eat ()V , но у нас есть только это правило Zoo.run -> Animal.eat , а Zoo.run -> Dog.eat Правило отсутствует
В этом случае мы добавили новые правила: Animal.eat -> Dog.eat и Animal.eat -> Cat.eat
Сначала убедитесь, что данные не потеряны, тогда мы можем вручную проанализировать декомпилированный код сами
Zoo.run -> Animal.eatAnimal.eat -> Dog.eat / Animal.eat -> Cat.eat Этот проект разработан с использованием идеи JetBrains. Спасибо Jetbrains за предоставление мне бесплатной лицензии, которая является для меня сильной поддержкой.