2013-04-01 15 views
7

Widzę, że niektóre dekompilatory java mogą dekompilować kod bajtowy do czytelnych źródeł java. Zastanawiam się, czy cały kod bajtowy pochodzący z języka Java (a nie z innego języka JVM) może zostać ponownie zarchiwizowany do źródeł java?Czy cały kod bajtowy skompilowany ze źródeł java może zostać zdekompilowany do źródeł java?


Aktualizacja

Niestety, pozwól mi pytanie bardziej jasne.

Po prostu mów o normalnym kodzie Java na JVM (bez Androida, bez ulepszania kodu bajtowego, bez AOP, bez zaciemniania) i mam nadzieję, że kod bajtowy może zostać zdekompilowany. Ale nie wiem, czy istnieją formy kodu java, które zostały skompilowane do kodu bajtowego, nigdy nie będą w stanie zostać zdekompilowane do czytelnych źródeł java.

+0

Większość kodu java jest napisana w języku ojczystym ... więc możesz "c" deklarację metody, ale nie jej ciało ... Również android na przykład zaciemni źródła ... utrudniając tobie czytać, nawet jeśli ją zdekompilujesz. – chuthan20

+1

Teoretycznie każda niezakodowana klasa może być dobrze zdekompilowana. W praktyce wszystkie istniejące dekompilatory zawiodą w przypadku szczególnie dziwnych i skomplikowanych klas. Wiele z nich również nie radzi sobie z typowym rzucaniem wąskich prymatów. – Antimony

Odpowiedz

6

Zastanawiam się, czy cały kod bajtowy, który pochodzi z Java (JVM nie innego języka) można ponownie dekompilowana źródeł Java?

odpowiedź jest nr

decompilers nie są gwarantowane do pracy dla wszystkich Kod bajtowy Javy:

  • Typowym obfuscator będzie celowo zmienić kolejność bytecodes w taki sposób, że wspólne decompilers nie wygeneruje czytelnego kodu źródłowego ... i prawdopodobnie nie będzie produkować prawidłowego kodu źródłowego.

  • Wiele dekompilatorów ma problemy z nowszymi konstrukcjami Java.

  • Wiele dekompilatorów ma problemy z bajtodami skompilowanymi ze "skomplikowanego" kodu źródłowego.

  • Nawet jeśli generują kod kompilowany, nie ma gwarancji, że kod będzie prawidłowy.

Najważniejsze jest to, że dekompilator jest tak dobry, jak inteligencja i staranność jego autora. Nigdy nie słyszałem o idealnej.

+0

Mam na myśli tylko kod bajtowy skompilowany z normalnego kodu java. Piszemy kod java, kompilujemy go, a następnie dekompilujemy. Czy zawsze możemy uzyskać czytelne źródła java? – Freewind

+0

Odkładam na bok, pracuję teraz nad dekompilatorem Java i interesuje mnie zbieranie fragmentów kodu, które okazały się kłopotliwe dla istniejących dekompilatorów. Byłbym wdzięczny za wszelkie konkretne przykłady, które każdy może dostarczyć. Zauważ, że szukam kodu emitowanego przez kompilatory o dobrych zamiarach (to jest nie zaciemniane). Będzie to dekompilator o otwartym kodzie źródłowym, jeśli to robi jakąkolwiek różnicę. –

+0

@Freewind - hipotetycznie możliwe jest napisanie "doskonałego" dekompilatora, ale w praktyce nie istnieje taki "doskonały" dekompilator, AFAIK. –

4

Kod byctode Java można dekompilować z powrotem do kodu źródłowego java. Dekompilowane źródło zazwyczaj nie będzie wyglądało dokładnie tak samo, ale będzie miało tę samą funkcjonalność. Jeśli obawiasz się, że ktoś może dekompilować twoje źródło, możesz użyć obfuscatorów (takich jak ProGuard), aby pomóc.

+0

ProGuard nie jest dużo obfuscatora, choć jest lepszy niż nic, a co najważniejsze darmowy. Ale AFAIK, ProGuard nie robi żadnego zaciemniania przepływu. Zmienia tylko nazwę i usuwa atrybuty, co sprawia, że ​​dekompilowane źródło jest trudniejsze do zrozumienia, ale w rzeczywistości nie powstrzymuje dekompilatorów. – Antimony

0

miałem okazję dekompilować java wiele kodów, i zawsze udawało z dostępnych narzędzi, aby myśleć, że kodu bajtowego jest generowany przez kompilator, ten proces musi zostać odwrócony, aby uzyskać oryginalny kod. Znam sposób, aby tego uniknąć.

Użyłem tego narzędzia.

java.decompiler.free.fr

Powiązane problemy