Semantic-based Code Obfuscation by Abstract Interpretation