How does reverse engineering of software work?