Structures that traditionally thwart disassemblers such as jump tables can be detected by active disassembly, with unexplored code paths traversed through these barriers. Embedded data can also be analysed and grouped into logical elements based on how and where it is used, and offsets to code and data can be detected and correctly formatted, so that changes can be made to the disassembled code without breaking offset references.