jad.exe 파일을 java 소스가 있는 곳으로 옮긴 후 콘솔 창에서 아래 명령어를 입력하면 됩니다.
1. 클래스 하나만 디컴파일시
example1.class 를 디컴파일시
jad.exe 를 디컴파일할 파일과 동일한 폴더에 놓는다.
Command 창에 jad -o -sjava example1.class
결과물 : 'example1.java'
2. Package 를 디컴파일시
tree 폴더 아래의 모든 클래스파일을 디컴파일시
폴더와 같은 폴더에 jad.exe 를 위치하고
Command 창에 jad -o -r -sjava -dsrc tree/**/*.class
결과물 : 폴더내에 [src] 폴더가 생성된다
example1.class라는 단일 자바 클래스 파일을 역컴파일 하고자 한다면
다음과 같이
jad example1.class
이 명령은 example1.jad라는 파일을 현재 디렉토리에 생성한다.
만약 파일이 이미 존재한다면 닾어 쓸것인지 물어본다.
옵션 -o
-- 이러한 메시지 없이 바로 덮어쓰기 할 수 있도록 허용하는 명령어이다.
.class라는 확장자는 입력 파일에서 와일드카드의 유무에 따라 뺄수도 있다.
옵션 -s <ext>
-- 이 옵션은 출력되는 확장자를 바꿀 수 있게 해준다.
jad -sjava example1.class
이 명령은 example1.java 파일을 생성하게 된다. -o 옵션과 -sjava를 함께 사용할때는 주의해야 한다.
왜나하면 jad는 우리의 소스 파일을 엎어쓸 수 있는 사고를 낼 수 있다.
Jad는 JAVA 클래스 이름을 출력 파일 이름으로 이용 할 수 있다. 예를 들어 example1.class에 test1 이름의 클래스를 포함하고 있다면 example1.jad 파일 대신에 test1.jad를 만들 수 있다. 만약 특정 출력 파일 이름을 지정하고 싶다면 다음과 같이 할 수 있다.
jad -p example1.class > myexm1.java
옵션 -d
-- 이 옵션은 출력 파일을 다른 디렉토리로 지정할 수 있다. 단 디렉토리가 이미 생성되어 있어야 하며, 기본값은 현재 디렉토리이다.
= 추가
jad -o -dtest -sjava *.class
(or jad -o -d test -s java *.class, which has the same effect)
이 명령은 현재 디렉토리에 있는 모든 .class 파일들을 디컴파일 하고, 출력 확장자를 .java로 지정하고 test라는 디렉토리에 넣어준다.
만약 tree 내에 전체 자바 클래스를 디컴파일 하기를 원한다면 다음 명령어를 이용하라.
jad -o -r -sjava -dsrc tree/**/*.class
이 명령어는 tree의 모든 하위 디렉토리에 포함되어 있는 모든 클래스를 디컴파일 하고 출력 파일은 src라는 디렉토리로 해당 패키지 이름에 해당하는 위치에 넣어준다. 예를 들어 파일이 tree/a/b/c.class라고 한다면 클래스 c는 패키지 a.b를 포함해서 출력되는 위치는 src/a/b/c.java 에 저장될 것이다.
(**)에 해당하는 와일드 카드를 이용하는 것에 대해서 주의할 점. 이것은 셀 커맨드보다는 Jad에 의해서 처리된다. 그러므로 유닉스에서는 마지막 아규먼트에 단일 쿼터를 이용하는 것이 좋을 것이다.
jad -o -r -sjava -dsrc 'tree/**/*.class'
디컴파일의 정확성에 대해서 체크하길 원하거나, 단지 재미삼아 해보고 싶으면 -a 옵션을 사용해 보라. Jad는 가상머신의 바이트코드에 대한 출력과 어노테이션을 보여줄 것이다.
Jad는 inner나 anonymous 클래스들도 지원한다.
Jad는 입력 파일 이름에 와일드 카드를 지원할때 자동적으로 매칭되는 inner클래스를 그냥 넘어가도록 해준다.
만약 커맨드 라인에 하나 이상의 클래스가 지정된 경우 유닉스에서는 Jad는 inner 클래스들을 스킵한다.
Jad는 inner 클래스들을 최 상위 레벨의 디렉토리에서 부터 검사를 한다.
*. 커맨드 라인 옵션 리스트
Jad는 다음 옵션을 수용한다.
-a - JVM 바이트 코드와 어노테이션을 함께 보여준다.
-af - -a와 동일하다. 그라나 풀 퀄리파이 이름에 해당하는 어노테이션을 보여준다.
-clear - 모든 prefix들을 클리어 한다. 기본값을 포함한다. -cl이라고 하는 단축이름 가능하다.
-b - 추가 여분의 브레이스 기호를 같이 표현한다. (e.g., if(a) { b(); }, 기본값은: no)
-d <dir> - 출력 디렉토리를 지정한다. 단 디렉토리는 이미 있어야 한다.
-dead - dead part 부분의 코드도 포함해서 디컴파일 한다. 기본값은 : no이다.
-disass - 바이트코드 메소드를 디컴파일 한다. (no JAVA source generated)
-f - 클래스, 필드, 메소드에 대한 풀 이름이 출력된다.
-ff - 메소드 이전에 필드가 출력되게 한다. (기본값은 : 메소드 후에 출력된다.)
-i - 모든 넌 파이널 필드를 위한 기본 초기화 값이 출력된다.
-l<num> - split strings into pieces of maximum <num> chars (default: no)
-lnc - annotate the output with line numbers (default: no)
-nl - split strings on newline character (default: no)
-nodos - do not check for class files written in DOS mode (CR before NL, default: check)
-nocast - don't generate auxiliary casts
-nocode - don't generate the source code for methods
-noconv - don't convert Java identifiers (default: do)
-noctor - suppress the empty constructors
-noinner - turn off the support of inner classes (default: turn on)
-nolvt - ignore Local Variable Table information
-nonlb - don't output a newline before opening brace (default: do)
-o - overwrite output files without confirmation (default: no)
-p - send decompiled code to STDOUT (e.g., for piping)
-pi<num> - pack imports into one line after <num> imports (default: 3)
-pv<num> - pack fields with identical types into one line (default: no)
-pa <pfx>- prefix for all packages in generated source files
-pc <pfx>- prefix for classes with numerical names (default: _cls)
-pf <pfx>- prefix for fields with numerical names (default: _fld)
-pe <pfx>- prefix for unused exception names (default: _ex)
-pl <pfx>- prefix for locals with numerical names (default: _lcl)
-pm <pfx>- prefix for methods with numerical names (default: _mth)
-pp <pfx>- prefix for method parms with numerical names (default: _prm)
-r - restore package directory structrure
-s <ext> - output file extension (by default '.jad')
-space - output space between keyword (if/for/while/etc) and expression (default: off)
-stat - display the total number of processed classes/methods/fields
-t - use tabs instead of spaces for indentation
-t<num> - use <num> spaces for indentation (default: 4)
-v - display method names being decompiled
-8 - convert UNICODE strings into 8-bit strings
using the current ANSI code page (Win32 only)
-& - redirect STDERR to STDOUT (Win32 only)
All single-word options have three formats:
-o - 'reverses' value of an option
-o+ - set value to 'true' or 'on'
-o- - set value to 'false' or 'off'
기본으로 설정된 환경을 확인해 보고자 하면 다음과 같다.
JAD_OPTIONS=-ff+ -nonlb+ -t+
'Tools' 카테고리의 다른 글
Eclipse Kepler > eclipse.ini (0) | 2013.11.06 |
---|---|
토렌트(torrent) 포터블로 사용하기 (무설치) (0) | 2013.10.31 |
EditPlus3 에서 파일비교하기 - WinDiff.exe (0) | 2012.03.20 |
[mp4변환기] avi에서 mp4 변환프로그램 안내 -> 다음팟인코더 (0) | 2012.02.21 |
이클립스 역컴파일 -JadClipse (0) | 2012.02.14 |