Author(s): Ira D Baxter, Michael Mehlich
Reverse Engineering is focused on the challenging task of understanding legacy pro- gram code without having suitable documentation. Using a transformational forward engineering perspective, we gain the insight that much of this difficulty is caused by design decisions made during system development. Such decisions “hide” the pro- gram functionality and performance requirements in the final system by applying re- peated refinements through layers of abstraction, and information-spreading optimi- zations, both of which change representations and force single program entities to serve multiple purposes. To be able to reverse engineer, we essentially have to re- verse these design decisions. Following the transformational approach we can use the transformations of a forward engineering methodology and apply them “backwards” to reverse engineer code to a more abstract specification. Since most existing code was not generated by transformational synthesis, this produces a plausible formal transformational design rather than the original authors’ actual design. A byproduct of the transformational reverse engineering process is a design database for the pro- gram that then can be maintained to minimize the need for further reverse engineer- ing during the remaining lifetime of the system. A consequence of this perspective is the belief that plan recognition methods are not sufficient for reverse engineering. As an example, a small fragment of a real-time operating system is reverse-engineered using this approach.