전체 Jar 파일을 디 컴파일하는 방법은 무엇입니까? [닫은]


283

누구나 단일 클래스 대신 전체 Jar 파일을 디 컴파일 할 수있는 무료 디 컴파일러를 알고 있습니까? name $ 1.class name $ 2.class name.class와 같은 하위 클래스에 문제가 있습니다.


127
다음 두 가지 사항을 더 기억하십시오. 1) 디 컴파일러에 대한 단순한 언급은 계획된 용도가 무엇인지 모른 채 "주님보다 거만한 사람"이 나오고 동기에 대한 가치 판단을 내릴 수 있으므로 누구에게 이야기해야하는지주의하십시오. 2) 멋진 JavaDecompiler는 코드를 잘 표현하고 잘 정리하고 읽기 쉽습니다-주석 만 누락됩니다. 변수 이름으로 오랫동안 소스를 잃어버린 JAR 파일을 복구하는 것은 놀랍게도 좋습니다. 물론 우리는 사내 JAR 파일을 난독 화하지 않습니다.
앤드류

post Java decompiler 선택 및 테스트의 설명도 참조하십시오 .
dma_k

8
나는 누군가가 Bukkit 플러그인을 위해 무언가를 성취 한 방법을 연구해야 할 때이 스레드에 여러 번 멈췄다. 들릴 때마다 공감할 수 있으면 좋겠다.
Jane Panda

SecureTeam Java 디 컴파일러 가이를 수행 할 수 있습니다.
SecureTeam 소프트웨어

소프트웨어를 다운로드하지 않으려는 경우 간단한 온라인 디 컴파일러 javadecompilers.com
Nick Graham

답변:


313

2009 : JavaDecompiler 는 jar를 사용하여 잘 수행 할 수 있습니다 . 0.2.5 부터 JAR ​​파일의 모든 파일이 표시됩니다.

http://java.decompiler.free.fr/sites/default/screenshots/screenshot1.png

"자바 클래스 파일을"디 컴파일 "하는 방법" 도 참조하십시오. .

JD-Eclipse는 2009 년 말 이후로 변경되지 않은 것으로 보입니다 ( 변경 사항 참조 ).
따라서 최신 Eclipse (3.8, 4.2+)와의 통합에 문제가있을 수 있습니다.

JD-Core는 적극적으로 유지 관리됩니다.

둘 다 (SO 사용자) Emmanuel Dupuy 의 환상적인 작품의 결과입니다 .


2018 : David Kennedy Araujo 의 의견 에 언급 보다 현대적인 옵션 :

JetBrains / intellij-community / plugins / java-decompiler / engine

Fernflower는 실제로 Java 및 일반적으로 고급 프로그래밍 언어를위한 최초의 실제 작동 분석 디 컴파일러입니다.

java -jar fernflower.jar [-<option>=<value>]* [<source>]+ <destination>

java -jar fernflower.jar -hes=0 -hdc=0 c:\Temp\binary\ -e=c:\Java\rt.jar c:\Temp\source\

최근 IntelliJ IDEA로 작업하는 명령에 대해서는 java 파일 intellij idea로 디 컴파일하는 방법을 참조하십시오 .


5
참고로, 자바 디 컴파일러는 Windows, Mac 및 Linux에서 작동합니다.
yanokwa

4
@AlexS nice :) 다음 단계 : 버전 관리 ( stackoverflow.com/questions/59561/… ) 그리고 지속적인 통합 ( stackoverflow.com/questions/130592/… )
VonC

3
Java Decompiler를 사용하면 JAR 파일을 열고 File, Save All Sources로 이동할 수 있습니다. 그것은 자바 파일로 = D 모든 클래스 파일을 저장
아키라 야마모토

2
오류도 발생합니다. Member 변수가있는 클래스가 있으며 함수의 매개 변수로 이동하여 코드의 효과를 파괴합니다. 조심하십시오.
CharlesW

1
JD는 좋은 출발점이지만 복잡한 코드를 디 컴파일하지 못합니다. 좋은 대안은 github.com/JetBrains/intellij-community/tree/master/plugins/…를
David Kennedy

37

우선, 모든 Java 아카이브 파일 ( .jar/ .war/ etc ...)은 기본적으로 단지 멋진 .zip파일 이며 몇 가지 매니페스트 및 메타 데이터가 추가되어 있음을 기억해야합니다.

둘째,이 문제를 해결하기 위해 개인적으로 모든 수준 에서이 문제를 처리하는 몇 가지 도구를 사용합니다.

  • 파일디 컴파일을 위해 IDE에서 작업하는 동안 Jad + Jadclipse.class
  • 내가 가장 좋아하는 압축 도구 인 WinRAR 은 기본적으로 Java 아카이브를 지원합니다 (첫 번째 단락 참조).
  • 내가 좋아하는 diff 도구 인 Compare Beyond Compare 는 올바르게 구성된 경우jars를포함하여 모든 아카이브 파일을 즉시 비교할 수 있습니다. 시도해 볼 가치가 있습니다.

앞에서 언급 한 모든 장점은 작업 환경을 어지럽히는 다른 외부 도구를 유지할 필요가 없다는 것입니다. 해당 파일 중 하나에서 필요한 모든 것을 IDE 내에서 처리하거나 다른 파일과 기본적으로 비교할 수 있습니다.


lolz 나는 크롬과 파이어 폭스 확장을 압축 해제 유지하고 .jar도 그냥 지퍼라는 것을 잊었다 :)
카터 콜

36

bash 쉘과 jad가 모두있는 경우 :

JAR=(your jar file name)
unzip -d $JAR.tmp $JAR
pushd $JAR.tmp
for f in `find . -name '*.class'`; do
    jad -d $(dirname $f) -s java -lnc $f
done
popd

나는 그것으로 작고 작은 비트 일지 모르지만 광고 된대로 다소 작동해야합니다. $JAR.tmp디 컴파일 된 파일 을 포함해야합니다.


1
우분투에서 #! / bin / sh 대신 #! / bin / bash를 사용하십시오. becausw pushd는 기본 우분투 쉘에서 작동하지 않습니다 ...
mossplix

1
javap이 기본 루프 구조 내에서 사용 하고 있으며 나를 위해 노력하고 있습니다.
Chris Prince

25

" JD : Java Decompiler " 라는 도구를 사용하여 합리적인 성공을 거두었습니다 .

Java 5 이상을 위해 컴파일 된 클래스를 다룰 때 대부분의 디 컴파일러보다 낫다 . 불행히도 JAD가 정상적으로 성공할 수있는 딸꾹질이 여전히있을 수 있습니다.


JD-GUI의 Windows 또는 Linux 버전을 다운로드 할 수 없습니다. 이 문제가 나에게만 나타 납니까?
mmdemirbas

@JanusTroelsen 삭제했습니다. 알려 주셔서 감사합니다. 답변을 깨끗하게 유지
합시다

@
Zero3

11

다음과 같은 것 :

jar -xf foo.jar && find . -iname "*.class" | xargs /opt/local/bin/jad -r

아마도?


1
나는 jad를 잠시 동안 사용했고 전체 항아리를 추출하고 디 컴파일하는 빠른 방법이 필요했습니다. 고마워, 이것은 엄청나게 도움이되었습니다.
Alper Akture

5

decompile.jar.sh에 다음을 삽입하십시오.

# Usage: decompile.jar.sh some.jar [-d]

# clean target folders
function clean_target {
  rm -rf $unjar $src $jad_log
}

# clean all debug stuff
function clean_stuff {
  rm -rf $unjar $jad_log
}

# the main function
function work {
  jar=$1
  unjar=`basename $jar.unjar`
  src=`basename $jar.src`
  jad_log=jad.log

  clean_target

  unzip -q $jar -d $unjar
  jad -d $src -ff -r -lnc -o -s java $unjar/**/*.class > $jad_log 2>&1

  if [ ! $debug ]; then
    clean_stuff
  fi

  if [ -d $src ] 
    then
      echo "$jar has been decompiled to $src"
    else
      echo "Got some problems check output or run in debug mode"
  fi
}

function usage {
  echo "This script extract and decompile JAR file"
  echo "Usage: $0 some.jar [-d]"
  echo "    where: some.jar is the target to decompile"
  echo "    use -d for debug mode"
}

# check params
if [ -n "$1" ]
  then
    if [ "$2" == "-d" ]; then
      debug=true
      set -x
    fi
    work $1
  else
    usage
fi
  • chmod + x decomplie.jar.sh // 실행 가능
  • ln -s ./decomplie.jar.s / usr / bin / dj

사용할 준비가 dj your.jar되었으면 입력 만하면 your.jar.src소스 가있는 폴더가 나타납니다. -d디버그 모드에 옵션을 사용하십시오 .


고맙지 만 23 행에서 "jad"를 "./jad"로 변경하고 bin 폴더를 오염시키지 않기 위해 "bash decompile.jar.sh foo.jar -d"를 실행해야했습니다
Sam

재 컴파일러? jad 파일을 jar로 다시 컴파일합니까?
N Jay

2

jar 파일은 jar 확장자를 가진 zip 파일 일뿐입니다. jar 파일을 zip 파일처럼 압축 해제 (winzip) 할 수 있어야합니다.


1

압축을 풀고 dir에 대해 jad를 사용하십시오.


나는 당신이 디렉토리에 대해 그것을 실행할 수 있다고 생각하지 않습니다. {dir} / ** / *. class를 지정해야합니다
Vihung

항아리를 추출하고 jad {dir}과 같은 것을 사용하십시오. 방금 테스트 한 결과 창문에서 작동하지 않습니다.
Jaime Hablutzel

1

참고 :이 솔루션은 Mac 및 * nix 사용자 만 사용할 수 있습니다.

나는 또한 운없이 Jad를 찾으려고 노력했다. 빠른 해결책은 jad가 포함 된 MacJad 를 다운로드하는 것이 었습니다 . 다운로드 한 후에는 [where-you-downloaded-macjad] / MacJAD / Contents / Resources / jad에서 jad를 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.