2010-11-30 6 views
5

Ich freue mich auf einige Java-Code, und ich habe folgendes bemerkt:Was bedeutet das Schlüsselwort jsr?

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

Javac Drosseln auf sie, nach dem Schlüsselwort erwartet wird jsr es ist keine Aussage, und dass ein Semikolon zu sagen.

Ich habe etwas googeln, und ich fand some code containing the same thing, was mich zu der Annahme führt, dass es absichtlich dort ist (obwohl sie nicht in der Lage waren, es zu kompilieren). Was macht jsr? Wie bekommt man Code, der das kompiliert?

+2

Ähnliche Frage ohne akzeptierte Antwort http://stackoverflow.com/questions/2135864/are-these-encoded-codes – HeDinges

Antwort

10

Ich bin fast sicher, dass dieser Code von einem Java-Decompiler kommt.

Die JSR 432 riecht wie eine Decompiler-Notiz, wo der Decompiler einen "Sprung" -Code gefunden hat, aber keine Ahnung hat, wie er in Java ausgedrückt werden kann.

+0

Das muss es sein. Ich bin mir 90% sicher, dass der Code, den ich mir ansehe, ein dekompilierter Code ist. Gibt es eine Möglichkeit, zusammenzufügen, was hier versucht wurde? Oder ist die ursprüngliche Quelle die einzige Option? –

+1

@Mark - Schwer zu sagen. Sie können versuchen, es von Hand zu korrigieren, aber Sie müssen den Byte-Code für diese Methode zerlegen und versuchen herauszufinden, wo der Algorithmus fortfährt. 432 ist ein Byte-Code-Index. Ich habe es manchmal gemacht, also ja, technisch ist es möglich. –

+0

Gotcha, danke! –

3

Sie werden höchstwahrscheinlich die Ergebnisse der Dekompilierung eines Codes betrachten, mit dem der Decompiler nicht umgehen konnte. JSR ist das Kürzel für den Sprung-Unterprogramm-Bytecode; Eine Liste finden Sie unter this page. Also jsr 432 kann bedeuten, eine private Methode an Bytecode Adresse 432 aufrufen. Allerdings kann der Decompiler das nicht herausfinden, also ist die Methode vielleicht synthetisch, oder etwas anderes passiert.

EDIT

gegoogelt Beispiel Sie ist definitiv Ausgabe Decompiler gefunden, und es sieht aus wie der Teil mit der JSRs entweder Ursache durch Verschleierung ist, Byte-Code-Änderung/Generation oder durch einen Decompiler stuffup.

0

Es ist nicht in der list of Java keywords. Ich glaube also nicht, dass es eine Bedeutung hat. Und ich bezweifle, dass es möglich ist, es zu kompilieren.

+0

@ downvoter - könnten Sie das erklären? – Bozho

1

JSR steht für Java Specification Request.

Wahrscheinlich gibt es ein Tippfehler in diesem Code und es sollte

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

Es scheint mir gewesen, dass jemand aus irgendeinem Grund einen nicht funktionierenden checkin tat.

Aber wenn man sich diesen Code ansieht, sieht er furchtbar künstlich aus, also ist es wahrscheinlich dekompilierter Code, wie Andreas_D schon gesagt hat.

Mini-Update: Überprüfen Sie die unten Kommentar:

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

Daraus würde ich sagen, jemand eine signierte JAR-Datei aus, die verschleiert wurde, und wer diesen Code geschrieben dekompilierten es.

Update 2: Googling "JD-Kern" ergibt http://java.decompiler.free.fr/ als erstes Ergebnis.

+0

Ja, es war ein Beispiel für das, was ich beim Googlen gefunden habe, aber ich bin mir ziemlich sicher, dass ich persönlich den dekompilierten Code sowieso sehe. Interessant. –

2

jsr 433 ist keine gültige Java-Anweisung. Es ist ein VM-Befehl, der für "Springe zu Unterroutine" steht (siehe VM Spec für weitere Informationen). Der Decompiler hat ihn eingefügt, weil er die Bytecode-Anweisung nicht verstanden hat (vielleicht wurde sie verschleiert) und konnte sie daher nicht in eine gültige Java-Quelle dekompilieren.

+0

'javac' verwendet' jsr' Anweisungen nur für 'finally' Blöcke. Ich glaube nicht, dass es das überhaupt mehr macht. –

0

JSR (was für Jump Subroutine steht) ist Teil der Java Virtual Machine Specification. Es ist ein Befehlssatz für die JVM.

Kurzbeschreibung

Die Adresse des Opcodes des Befehl unmittelbar nach dieser JSR-Befehl wird auf den Operandenstapel als ein Wert des Typs return geschoben.

Dies kann auf der JVM book 2nd edition gefunden werden.