{'fraction_non_alphanumeric': 0.011764705882352941, 'fraction_numerical': 0.0, 'mean_word_length': 5.544871794871795, 'pattern_counts': {'":': 0, '<': 0, '<?xml version=': 0, '>': 0, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
Approaches to Make the Decompiled Java Programs Uncompilable

There are several available obfuscation tools for protecting compiled Java programs—bytecode files. Most of the tools just scramble the identifier information stored in a bytecode file. This job can easily be done by textually substituting the identifiers with sequentially or randomly generated meaningless names. However, these new unique identifiers cannot deter an experienced reverse engineer too long. In this paper, we proposed several techniques that make the decompiled program difficult to understand and to recompile. Several techniques are proposed to introduce syntax and semantic errors into the decompiled program while keeping the original behaviors of the bytecode. The reverse engineer has to debug the decompiled program manually. Although most of the methods we proposed are only scrambling the identifiers in a Java bytecode file, the bytecode file become much harder to be reverse engineered than other identifier scrambling techniques.