Semantic-based code obfuscation by abstract interpretation