이 프로젝트는 더 이상 유지되지 않습니다
Jar Analyzer V2 새 버전을 사용하는 것이 좋습니다.
Jar-Analyzer 명령 줄 버전
Jar-Analyzer CLI 버전
간단한 소개 : https://mp.weixin.qq.com/s/rrx6x5m_28yrcqcdxueeq
영어 문서가 없습니다. 외국인은 직접 번역하십시오
특히 코드 보안 감사에 적합한 jar 패키지 분석을위한 GUI 도구. 여러 jar 파일을 동시에 분석 할 수 있으며 대상 방법을 쉽게 검색 할 수 있습니다. 바이트 코드의 디 컴파일을 지원하고 클래스와 방법 간의 관계를 자동으로 구성하여 Java 보안 연구원이보다 효율적으로 작업 할 수 있도록 도와줍니다.
참고 : 너무 크거나 너무 많은 Jar 패키지를 분석하지 마십시오. 300M 초과하지 않는 것이 좋습니다.
다운로드로 이동하십시오
메소드를 정확하게 찾을 수 있습니다 (왼쪽에서 강조 표시)

문자열을 직접 찾을 수 있습니다 (정확한 포지셔닝을 달성하기 위해 일정한 풀 관련 지침 분석)

Spring Framework에서 작성한 프로젝트를 직접 분석 할 수 있습니다

IDEA 분석을 선택하지 않는 이유 : IDEA 수동 코드 항아리 패키지의 분석을 지원하지 않기 때문에
6 가지 검색 방법을 지원합니다.
LDC 지침 분석)LDC 명령어 분석)세 가지 디 컴파일 방법의 선택을 지원합니다.
JSyntaxPane 구성 요소 (비공식)의 클래스 사용자 정의 사용을 사용하여 Java 코드를 표시합니다.
(많은 흑인 기술이 라이브러리에 추가됩니다 https://code.google.com/archive/p/jsyntaxpane )
원하는 정보를 검색 할 때 결합 할 수있는 매우 강력한 표현 검색을 지원합니다.
| 표현 | 매개 변수 | 효과 |
|---|---|---|
| namecectains | 끈 | 메소드 이름에는 포함됩니다 |
| 시작 | 끈 | 방법 접두사 |
| 끝 | 끈 | 방법 접미사 |
| Classnamecectains | 끈 | 클래스 이름에는 포함됩니다 |
| return -type | 끈 | 메소드 리턴 유형 |
| PARAMTEREPEMAP | int 문자열 | 메소드 파라미터 서신 |
| Paramsnum | int | 메소드 수 매개 변수 |
| isstatic | 부울 | 방법이 정적입니까? |
| issubclassof | 끈 | 누구의 서브 클래스입니다 |
| issuperclassof | 끈 | 누구의 부모 수업입니다 |
| 하안노 | 끈 | 방법의 주석 |
| Hasclassanno | 끈 | 수업 주석 |
| Hasfield | 끈 | 클래스 필드 |
알아채다:
returnType 및 paramTypeMap java.lang.String 과 같은 유사한 완전한 클래스 이름이 필요하며 기본 유형을 직접 작성합니다 (예 : intisSubClassOf 및 isSuperClassOf java.awt.Component 와 같은 전체 클래스 이름이 필요합니다.hasAnno 와 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 파일을로드해야합니다.
예를 들어, rt.jar 파일에 가입하지 않았기 때문에 javax.naming.Context 디 컴파일 할 수 없습니다. 가입하면 정상적으로 소환 될 수 있습니다.
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 의 바이트 코드는 Zoo.run -> Animal.eat INVOKEVIRTUAL Animal.eat ()V 이지만이 규칙 만 있습니다 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에게 감사드립니다. 이는 저에게 강력한 지원입니다.