2010-11-30 5 views
5

나는 몇 가지 자바 코드를 찾고 있어요, 나는 다음과 같은 나타났습니다 :이 구문이되지는 않는다 세미콜론이 키워드 jsr 후 예상되는 말,jsr 키워드는 무엇을 의미합니까?

if (!foo(bar, baz, qux)) { 
    i = 0; jsr 433; 
} 

javac의 그것에 질식.

Google 검색을 수행했으며 some code containing the same thing을 발견하여 의도적으로 (비록 컴파일 할 수는 없지만) 믿을 수있게되었습니다. 그렇다면 jsr은 무엇을합니까? 컴파일하는 코드를 어떻게 얻습니까?

+2

답변이없는 유사한 질문 http://stackoverflow.com/questions/2135864/are-these-encoded-codes – HeDinges

답변

10

이 코드가 Java 디 컴파일러에서 온 것 같습니다.

JSR 432은 디 컴파일러 노트와 같은 냄새가납니다. 디 컴파일러는 "점프"코드를 발견했지만 자바 언어로 표현하는 방법에 대한 단서는 없습니다.

+0

그게 다야. 나는 90 % 확신 코드를 decompiled 코드입니다. 여기서 일어나는 일을 함께 할 수있는 방법은 없습니까? 또는 원본 소스를 유일한 옵션으로 사용하고 있습니까? –

+1

@ 마크 - 말하기가 어렵습니다. 직접 수정 해 볼 수는 있지만이 방법의 바이트 코드를 해체하고 알고리즘이 계속되는 곳을 찾아야합니다. 432는 바이트 코드 색인입니다. 나는 약간의 경우에 그것을했다. 그래서 예, 기술적으로 그것은 가능하다. –

+0

Gotcha, 고마워! –

3

대부분의 경우 decompiler가 처리 할 수없는 일부 코드를 디 컴파일하는 결과를보고 있습니다. JSR은 점프 서브 루틴 바이트 코드에 대한 니모닉입니다. 목록을 보려면 this page을 참조하십시오. 따라서 jsr 432은 바이트 코드 주소 432에서 개인 메소드를 호출 할 수 있습니다. 그러나 디 컴파일러는이를 파악할 수 없으므로 메서드가 합성되어 있거나 다른 작업이 진행 중일 수 있습니다.

편집

당신은 확실히 출력을 디 컴파일러입니다 발견하고, JSR들과 부품이 난독, 바이트 코드 수정/생성하여 하나의 원인은, 또는 디 컴파일러의 stuffup입니다 것 같습니다 봤 예.

0

list of Java keywords에 없습니다. 그래서 나는 그것이 어떤 의미가 있다고 생각하지 않습니다. 그리고 나는 그것을 컴파일하는 것이 불가능하다고 생각합니다.

+0

@downvoter - 설명해 주시겠습니까? – Bozho

1

JSR은 Java Specification Request의 약자입니다.

아마 그 코드에 오타가 그리고 그것은

if (!foo(bar, baz, qux)) { 
    i = 0; //jsr 433; 
} 

했어야 누군가가 어떤 이유로 비 작동 체크인을했던 나에게 보인다.

하지만 코드를 보면 인공적으로 보이므로 Andreas_D가 이미 설명한 것처럼 코드가 디 컴파일 된 것일 수 있습니다.

미니 업데이트 : 나는 누군가가 난독 화 한 서명 된 jar 파일을 만들라고 말하고 싶지만,이에서

/* Location:   C:\Users\Matteo\Downloads\FreeDownApplet.signed.jar 
* Qualified Name:  FreeDownApplet 
* JD-Core Version: 0.5.4 
*/ 

, 누구든지 그 코드를 게시 그것을 디 컴파일 : 아래 설명을 확인합니다.

업데이트 2 : "JD core"를 검색하면 http://java.decompiler.free.fr/이 첫 번째 결과로 나타납니다.

+0

그래, 내가 인터넷 검색을 찾았는데의 예 였지만, 개인적으로 내가 뭘보고 있는지는 어쨌든 디 컴파일 된 코드라고 확신한다. 흥미 롭 군. –

2

jsr 433은 (는) 잘못된 Java 문입니다. "Sub Routine으로 이동"을 나타내는 VM 명령어입니다 (자세한 내용은 VM Spec 참조). 디 컴파일러는 바이트 코드 명령어를 이해하지 못했기 때문에 삽입 했으므로 (아마도 난독 화 되었기 때문에) 올바른 Java 소스로 디 컴파일 할 수 없었습니다.

+0

'javac'는'finally' 블록에 대해서만'jsr' 명령을 내 보냅니다. 나는 더 이상 그렇게 생각하지 않는다. –

0

JSR (점프 서브 루틴을 나타냄)은 Java Virtual Machine Specification의 일부입니다. 이것은 JVM을위한 명령어 세트입니다.

간략한 설명

어드레스 즉시 JSR 명령어 다음 인스트럭션의 오피 코드의 유형 리턴 주소 값으로 오퍼랜드 스택으로 푸시된다.

JVM book 2nd edition에서 확인할 수 있습니다.