1 19 20 package jode.obfuscator; 21 import jode.jvm.Interpreter; 22 import jode.jvm.SimpleRuntimeEnvironment; 23 import jode.jvm.InterpreterException; 24 import jode.bytecode.Reference; 25 import jode.bytecode.BytecodeInfo; 26 import jode.bytecode.TypeSignature; 27 import java.lang.reflect.Array ; 28 import java.lang.reflect.InvocationTargetException ; 29 30 import java.util.Set ; 31 import java.util.HashSet ; 32 33 public class ConstantRuntimeEnvironment extends SimpleRuntimeEnvironment { 34 35 38 static Set whiteList = new HashSet (); 39 40 static void addWhite(Reference ref) { 41 whiteList.add(ref); 42 } 43 44 public static boolean isWhite(Reference ref) { 45 return whiteList.contains(ref); 46 } 47 48 public static boolean isWhite(String retTypeSig) { 49 return retTypeSig.length() == 1 || whiteList.contains(retTypeSig); 51 } 52 53 static { 54 addWhite(Reference.getReference 55 ("Ljava/lang/String;", "toCharArray", "()[C")); 56 addWhite(Reference.getReference 57 ("Ljava/lang/StringBuffer;", "<init>", 58 "(Ljava/lang/String;)V")); 59 addWhite(Reference.getReference 60 ("Ljava/lang/StringBuffer;", "<init>", "()V")); 61 addWhite(Reference.getReference 62 ("Ljava/lang/StringBuffer;", "append", 63 "(Ljava/lang/String;)Ljava/lang/StringBuffer;")); 64 addWhite(Reference.getReference 65 ("Ljava/lang/StringBuffer;", "append", 66 "(C)Ljava/lang/StringBuffer;")); 67 addWhite(Reference.getReference 68 ("Ljava/lang/StringBuffer;", "append", 69 "(B)Ljava/lang/StringBuffer;")); 70 addWhite(Reference.getReference 71 ("Ljava/lang/StringBuffer;", "append", 72 "(S)Ljava/lang/StringBuffer;")); 73 addWhite(Reference.getReference 74 ("Ljava/lang/StringBuffer;", "append", 75 "(Z)Ljava/lang/StringBuffer;")); 76 addWhite(Reference.getReference 77 ("Ljava/lang/StringBuffer;", "append", 78 "(F)Ljava/lang/StringBuffer;")); 79 addWhite(Reference.getReference 80 ("Ljava/lang/StringBuffer;", "append", 81 "(I)Ljava/lang/StringBuffer;")); 82 addWhite(Reference.getReference 83 ("Ljava/lang/StringBuffer;", "append", 84 "(J)Ljava/lang/StringBuffer;")); 85 addWhite(Reference.getReference 86 ("Ljava/lang/StringBuffer;", "append", 87 "(D)Ljava/lang/StringBuffer;")); 88 addWhite(Reference.getReference 89 ("Ljava/lang/StringBuffer;", "toString", 90 "()Ljava/lang/String;")); 91 addWhite(Reference.getReference 92 ("Ljava/lang/String;", "<init>", "()V")); 93 addWhite(Reference.getReference 94 ("Ljava/lang/String;", "<init>", "([C)V")); 95 addWhite(Reference.getReference 96 ("Ljava/lang/String;", "<init>", "([CII)V")); 97 addWhite(Reference.getReference 98 ("Ljava/lang/String;", "<init>", 99 "(Ljava/lang/String;)V")); 100 addWhite(Reference.getReference 101 ("Ljava/lang/String;", "<init>", 102 "(Ljava/lang/StringBuffer;)V")); 103 addWhite(Reference.getReference 104 ("Ljava/lang/String;", "length", "()I")); 105 addWhite(Reference.getReference 106 ("Ljava/lang/String;", "replace", 107 "(CC)Ljava/lang/String;")); 108 addWhite(Reference.getReference 109 ("Ljava/lang/String;", "valueOf", 110 "(Z)Ljava/lang/String;")); 111 addWhite(Reference.getReference 112 ("Ljava/lang/String;", "valueOf", 113 "(B)Ljava/lang/String;")); 114 addWhite(Reference.getReference 115 ("Ljava/lang/String;", "valueOf", 116 "(S)Ljava/lang/String;")); 117 addWhite(Reference.getReference 118 ("Ljava/lang/String;", "valueOf", 119 "(C)Ljava/lang/String;")); 120 addWhite(Reference.getReference 121 ("Ljava/lang/String;", "valueOf", 122 "(D)Ljava/lang/String;")); 123 addWhite(Reference.getReference 124 ("Ljava/lang/String;", "valueOf", 125 "(F)Ljava/lang/String;")); 126 addWhite(Reference.getReference 127 ("Ljava/lang/String;", "valueOf", 128 "(I)Ljava/lang/String;")); 129 addWhite(Reference.getReference 130 ("Ljava/lang/String;", "valueOf", 131 "(J)Ljava/lang/String;")); 132 addWhite(Reference.getReference 133 ("Ljava/lang/String;", "valueOf", 134 "(Ljava/lang/Object;)Ljava/lang/String;")); 135 addWhite(Reference.getReference 136 ("Ljava/lang/String;", "substring", 137 "(I)Ljava/lang/String;")); 138 addWhite(Reference.getReference 139 ("Ljava/lang/String;", "substring", 140 "(II)Ljava/lang/String;")); 141 addWhite(Reference.getReference 142 ("Ljava.lang/reflect/Modifier;", "toString", 143 "(I)Ljava/lang/String;")); 144 addWhite(Reference.getReference 145 ("Ljava/lang/Math;", "abs", "(D)D")); 146 addWhite(Reference.getReference 147 ("Ljava/lang/Math;", "abs", "(F)F")); 148 addWhite(Reference.getReference 149 ("Ljava/lang/Math;", "abs", "(I)I")); 150 addWhite(Reference.getReference 151 ("Ljava/lang/Math;", "abs", "(J)J")); 152 addWhite(Reference.getReference 153 ("Ljava/lang/Math;", "acos", "(D)D")); 154 addWhite(Reference.getReference 155 ("Ljava/lang/Math;", "asin", "(D)D")); 156 addWhite(Reference.getReference 157 ("Ljava/lang/Math;", "atan", "(D)D")); 158 addWhite(Reference.getReference 159 ("Ljava/lang/Math;", "atan2", "(D)D")); 160 addWhite(Reference.getReference 161 ("Ljava/lang/Math;", "ceil", "(D)D")); 162 addWhite(Reference.getReference 163 ("Ljava/lang/Math;", "cos", "(D)D")); 164 addWhite(Reference.getReference 165 ("Ljava/lang/Math;", "exp", "(D)D")); 166 addWhite(Reference.getReference 167 ("Ljava/lang/Math;", "floor", "(D)D")); 168 addWhite(Reference.getReference 169 ("Ljava/lang/Math;", "IEEEremainder", "(DD)D")); 170 addWhite(Reference.getReference 171 ("Ljava/lang/Math;", "log", "(D)D")); 172 addWhite(Reference.getReference 173 ("Ljava/lang/Math;", "max", "(DD)D")); 174 addWhite(Reference.getReference 175 ("Ljava/lang/Math;", "max", "(FF)F")); 176 addWhite(Reference.getReference 177 ("Ljava/lang/Math;", "max", "(II)I")); 178 addWhite(Reference.getReference 179 ("Ljava/lang/Math;", "max", "(JJ)J")); 180 addWhite(Reference.getReference 181 ("Ljava/lang/Math;", "min", "(DD)D")); 182 addWhite(Reference.getReference 183 ("Ljava/lang/Math;", "min", "(FF)F")); 184 addWhite(Reference.getReference 185 ("Ljava/lang/Math;", "min", "(II)I")); 186 addWhite(Reference.getReference 187 ("Ljava/lang/Math;", "min", "(JJ)J")); 188 addWhite(Reference.getReference 189 ("Ljava/lang/Math;", "pow", "(DD)D")); 190 addWhite(Reference.getReference 191 ("Ljava/lang/Math;", "rint", "(D)D")); 192 addWhite(Reference.getReference 193 ("Ljava/lang/Math;", "round", "(D)J")); 194 addWhite(Reference.getReference 195 ("Ljava/lang/Math;", "round", "(F)I")); 196 addWhite(Reference.getReference 197 ("Ljava/lang/Math;", "sin", "(D)D")); 198 addWhite(Reference.getReference 199 ("Ljava/lang/Math;", "sqrt", "(D)D")); 200 addWhite(Reference.getReference 201 ("Ljava/lang/Math;", "tan", "(D)D")); 202 addWhite(Reference.getReference 203 ("Ljava/lang/Math;", "toDegrees", "(D)D")); 204 addWhite(Reference.getReference 205 ("Ljava/lang/Math;", "toRadians", "(D)D")); 206 addWhite(Reference.getReference 207 ("Ljava/lang/Math;", "E", "D")); 208 addWhite(Reference.getReference 209 ("Ljava/lang/Math;", "PI", "D")); 210 211 whiteList.add("Ljava/lang/String;"); 212 } 216 217 private Interpreter interpreter; 218 private Identifier currentFieldListener; 219 220 public ConstantRuntimeEnvironment() { 221 interpreter = new Interpreter(this); 222 } 223 224 public void setFieldListener(Identifier fl) { 225 currentFieldListener = fl; 226 } 227 228 public static Object getDefaultValue(String typeSig) { 229 switch(typeSig.charAt(0)) { 230 case 'Z': 231 case 'B': 232 case 'S': 233 case 'C': 234 case 'I': 235 return new Integer (0); 236 case 'J': 237 return new Long (0L); 238 case 'D': 239 return new Double (0.0); 240 case 'F': 241 return new Float (0.0F); 242 default: 243 return null; 244 } 245 } 246 247 public Object getField(Reference ref, Object obj) 248 throws InterpreterException { 249 if (isWhite(ref)) 250 return super.getField(ref, obj); 251 FieldIdentifier fi 252 = (FieldIdentifier) Main.getClassBundle().getIdentifier(ref); 253 if (fi != null && !fi.isNotConstant()) { 254 Object result = fi.getConstant(); 255 if (currentFieldListener != null) 256 fi.addFieldListener(currentFieldListener); 257 if (result == null) 258 result = getDefaultValue(ref.getType()); 259 return result; 260 } 261 throw new InterpreterException("Field " + ref + " not constant"); 262 } 263 264 public void putField(Reference ref, Object obj, Object value) 265 throws InterpreterException { 266 throw new InterpreterException("Modifying Field " + ref + "."); 267 } 268 269 public Object invokeConstructor(Reference ref, Object [] params) 270 throws InterpreterException, InvocationTargetException { 271 if (isWhite(ref)) 272 return super.invokeConstructor(ref, params); 273 throw new InterpreterException("Creating new Object " + ref + "."); 274 } 275 276 public Object invokeMethod(Reference ref, boolean isVirtual, 277 Object cls, Object [] params) 278 throws InterpreterException, InvocationTargetException { 279 if (isWhite(ref)) 280 return super.invokeMethod(ref, isVirtual, cls, params); 281 MethodIdentifier mi 282 = (MethodIdentifier) Main.getClassBundle().getIdentifier(ref); 283 if (mi != null) { 284 BytecodeInfo code = mi.info.getBytecode(); 285 if (code != null) 286 return interpreter.interpretMethod(code, cls, params); 287 } 288 throw new InterpreterException("Invoking library method " + ref + "."); 289 } 290 291 public boolean instanceOf(Object obj, String className) 292 throws InterpreterException { 293 Class clazz; 294 try { 295 clazz = Class.forName(className); 296 } catch (ClassNotFoundException ex) { 297 throw new InterpreterException 298 ("Class "+ex.getMessage()+" not found"); 299 } 300 return obj != null && clazz.isInstance(obj); 301 } 302 303 public Object newArray(String type, int[] dimensions) 304 throws InterpreterException, NegativeArraySizeException { 305 if (type.length() == dimensions.length + 1) { 306 Class clazz; 307 try { 308 clazz = TypeSignature 309 .getClass(type.substring(dimensions.length)); 310 } catch (ClassNotFoundException ex) { 311 throw new InterpreterException 312 ("Class "+ex.getMessage()+" not found"); 313 } 314 return Array.newInstance(clazz, dimensions); 315 } 316 throw new InterpreterException("Creating object array."); 317 } 318 } 319 | Popular Tags |