Eliminating go to's while preserving program structure
Journal of the ACM (JACM)
A Control-Flow Normalization Algorithm and its Complexity
IEEE Transactions on Software Engineering
An Algorithm for Structuring Flowgraphs
Journal of the ACM (JACM)
Type elaboration and subtype completion for Java bytecode
Proceedings of the 27th ACM SIGPLAN-SIGACT symposium on Principles of programming languages
Efficient Inference of Static Types for Java Bytecode
SAS '00 Proceedings of the 7th International Symposium on Static Analysis
Optimizing Java Bytecode Using the Soot Framework: Is It Feasible?
CC '00 Proceedings of the 9th International Conference on Compiler Construction
Decompiling Java using staged encapsulation
WCRE '01 Proceedings of the Eighth Working Conference on Reverse Engineering (WCRE'01)
Krakatoa: decompilation in java (dose bytecode reveal source?)
COOTS'97 Proceedings of the 3rd conference on USENIX Conference on Object-Oriented Technologies (COOTS) - Volume 3
Measuring the dynamic behaviour of AspectJ programs
OOPSLA '04 Proceedings of the 19th annual ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications
Overcoming the obfuscation of Java programs by identifier renaming
Journal of Systems and Software
An Efficient, Parametric Fixpoint Algorithm for Analysis of Java Bytecode
Electronic Notes in Theoretical Computer Science (ENTCS)
Efficient local type inference
Proceedings of the 23rd ACM SIGPLAN conference on Object-oriented programming systems languages and applications
Control and data dependencies in business processes based on semantic business activities
Proceedings of the 10th International Conference on Information Integration and Web-based Applications & Services
Queryll: Java database queries through bytecode rewriting
Proceedings of the ACM/IFIP/USENIX 2006 International Conference on Middleware
Byte code level cross-compilation for developing web applications
Science of Computer Programming
Genetic programming in the wild: evolving unrestricted bytecode
Proceedings of the 11th Annual conference on Genetic and evolutionary computation
Decompilation of Java bytecode to Prolog by partial evaluation
Information and Software Technology
JVM Bytecode Verification Without Dataflow Analysis
Electronic Notes in Theoretical Computer Science (ENTCS)
BAT2XML: XML-based Java Bytecode Representation
Electronic Notes in Theoretical Computer Science (ENTCS)
Subroutine Inlining and Bytecode Abstraction to Simplify Static and Dynamic Analysis
Electronic Notes in Theoretical Computer Science (ENTCS)
Obfuscating Java: the most pain for the least gain
CC'07 Proceedings of the 16th international conference on Compiler construction
Formalisation and implementation of an algorithm for bytecode verification of @NonNull types
Science of Computer Programming
A study of android application security
SEC'11 Proceedings of the 20th USENIX conference on Security
Queryll: Java database queries through bytecode rewriting
Middleware'06 Proceedings of the 7th ACM/IFIP/USENIX international conference on Middleware
Translating flowcharts to non-deterministic languages
PEPM '12 Proceedings of the ACM SIGPLAN 2012 workshop on Partial evaluation and program manipulation
abc: an extensible AspectJ compiler
Transactions on Aspect-Oriented Software Development I
Retargeting Android applications to Java bytecode
Proceedings of the ACM SIGSOFT 20th International Symposium on the Foundations of Software Engineering
A heuristiclab evolutionary algorithm for FINCH
Proceedings of the 15th annual conference companion on Genetic and evolutionary computation
Obfuscation resilient binary code reuse through trace-oriented programming
Proceedings of the 2013 ACM SIGSAC conference on Computer & communications security
SEC'13 Proceedings of the 22nd USENIX conference on Security
Repackaging Attack on Android Banking Applications and Its Countermeasures
Wireless Personal Communications: An International Journal
Hi-index | 0.00 |
Java virtual machines execute Java bytecode instructions. Since this bytecode is a higher level representation than traditional object code, it is possible to decompile it back to Java source. Many such decompilers have been developed and the conventional wisdom is that decompiling Java bytecode is relatively simple. This may be true when decompiling bytecode produced directly from a specific compiler, most often Sun's javac compiler. In this case it is really a matter of inverting a known compilation strategy. However, there are many problems, traps and pitfalls when decompiling arbitrary verifiable Java bytecode. Such bytecode could be produced by other Java compilers, Java byte-code optimizers or Java bytecode obfuscators. Java bytecode can also be produced by compilers for other languages, including Haskell, Eiffel, ML, Ada and Fortran. These compilers often use very different code generation strategies from javac.This paper outlines the problems and solutions we have found in our development of Dava, a decompiler for arbitrary Java bytecode. We first outline the problems in assigning types to variables and literals, and the problems due to expression evaluation on the Java stack. Then, we look at finding structured control flow with a particular emphasis on issues related to Java exceptions and synchronized blocks. Throughout the paper we provide small examples which are not properly decompiled by commonly used decompilers.