private Map<String, VirtualArrayMethod> buildMethodsMap() { Map<String, VirtualArrayMethod> methods = new HashMap<>(2); String methodDescriptor = "clone()Ljava/lang/Object;"; String methodSignature = getName() + "->" + methodDescriptor; TypeReference reference = classManager.getFrameworkDexBuilder().internTypeReference(methodSignature); VirtualArrayMethod method = new VirtualArrayMethod(reference, this); methods.put(methodDescriptor, method); return methods; }
public VirtualType getVirtualType(String typeSignature) { TypeReference typeReference = getFrameworkDexBuilder().internTypeReference(typeSignature); return getVirtualType(typeReference); }
private List<BuilderInstruction> getArrayAccessorInstructions(int arrayRegister, List<Integer> registers, List<String> parameterTypes) { List<BuilderInstruction> instructions = new LinkedList<>(); for (int index = 0; index < parameterTypes.size(); index++) { int register = registers.get(index); BuilderInstruction constInstruction = ConstantBuilder.buildConstant(index, register); BuilderInstruction arrayGet = new BuilderInstruction23x(Opcode.AGET_OBJECT, register, arrayRegister, register); String typeName = parameterTypes.get(index); if (ClassNameUtils.isPrimitive(typeName)) { // check-cast expects a non-primitive type (afaik) typeName = ClassNameUtils.binaryToInternal(ClassNameUtils.getWrapper(typeName)); } BuilderTypeReference typeRef = manipulator.getDexBuilder().internTypeReference(typeName); BuilderInstruction checkCast = new BuilderInstruction21c(Opcode.CHECK_CAST, register, typeRef); instructions.add(constInstruction); instructions.add(arrayGet); instructions.add(checkCast); } return instructions; }
BuilderInstruction buildClassForNameReplacement(int address) { InvokeOp op = (InvokeOp) manipulator.getOp(address); int[] parameterRegisters = op.getParameterRegisters(); int register = parameterRegisters[0]; String javaClassName = (String) manipulator.getRegisterConsensusValue(address, register); String smaliClassName = ClassNameUtils.binaryToInternal(javaClassName); HeapItem klazz = manipulator.getRegisterConsensus(address, MethodState.ResultRegister); if (klazz == null) { log.warn("Optimizing Class.forName of potentially non-existent class: {}", smaliClassName); } BuilderTypeReference classRef = manipulator.getDexBuilder().internTypeReference(smaliClassName); BuilderInstruction constClassInstruction = new BuilderInstruction21c(Opcode.CONST_CLASS, register, classRef); return constClassInstruction; }
@Test public void withClass() { Class<?> value = String.class; String className = ClassNameUtils.toInternal(value); TypeReference typeRef = dexBuilder.internTypeReference(className); Instruction expected = new BuilderInstruction21c(Opcode.CONST_CLASS, REGISTER, typeRef); Instruction actual = ConstantBuilder.buildConstant(value, "Ljava/lang/Class;", REGISTER, dexBuilder); testEquals(expected, actual); }
BuilderInstruction buildUninitializedInstanceReferenceResultReplacement(int address) { InvokeOp invokeOp = (InvokeOp) manipulator.getOp(address); int instanceRegister = invokeOp.getParameterRegisters()[0]; HeapItem item = manipulator.getRegisterConsensus(address, instanceRegister); BuilderInstruction original = manipulator.getInstruction(address); int nextAddress = address + original.getCodeUnits(); MoveOp moveOp = (MoveOp) manipulator.getOp(nextAddress); int destRegsiter = moveOp.getToRegister(); ReferenceInstruction instr = (ReferenceInstruction) original; String methodDescriptor = ReferenceUtil.getReferenceString(instr.getReference()); BuilderInstruction replacementInstruction = null; if (methodDescriptor.equals(OBJECT_GET_CLASS_SIGNATURE)) { String smaliClassName = item.getType(); BuilderTypeReference classRef = manipulator.getDexBuilder().internTypeReference(smaliClassName); replacementInstruction = new BuilderInstruction21c(Opcode.CONST_CLASS, destRegsiter, classRef); } return replacementInstruction; }
dexBuilder.internTypeReference((nonvoid_type_descriptor139!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor139).type:null))));
registers[2], registers[3], registers[4], dexBuilder.internTypeReference((nonvoid_type_descriptor183!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor183).type:null))));
dexBuilder.internTypeReference((nonvoid_type_descriptor192!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor192).type:null))));
method_stack.peek().methodBuilder.addCatch(dexBuilder.internTypeReference((nonvoid_type_descriptor94!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor94).type:null)), from, to, using);
dexBuilder.internTypeReference((nonvoid_type_descriptor156!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor156).type:null))));
Class<?> klazz = (Class<?>) value; String className = ClassNameUtils.toInternal(klazz); BuilderTypeReference typeRef = dexBuilder.internTypeReference(className); constant = new BuilderInstruction21c(Opcode.CONST_CLASS, register, typeRef); break;
@Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) { if (type != null) { return internTypeReference(type); } return null; }
@Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) { if (type != null) { return internTypeReference(type); } return null; }
@Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) { if (type != null) { return internTypeReference(type); } return null; }
@Nonnull public BuilderReference internReference(@Nonnull Reference reference) { if (reference instanceof StringReference) { return internStringReference(((StringReference)reference).getString()); } if (reference instanceof TypeReference) { return internTypeReference(((TypeReference)reference).getType()); } if (reference instanceof MethodReference) { return internMethodReference((MethodReference)reference); } if (reference instanceof FieldReference) { return internFieldReference((FieldReference)reference); } throw new IllegalArgumentException("Could not determine type of reference"); }
@Nonnull public BuilderReference internReference(@Nonnull Reference reference) { if (reference instanceof StringReference) { return internStringReference(((StringReference)reference).getString()); } if (reference instanceof TypeReference) { return internTypeReference(((TypeReference)reference).getType()); } if (reference instanceof MethodReference) { return internMethodReference((MethodReference)reference); } if (reference instanceof FieldReference) { return internFieldReference((FieldReference)reference); } if (reference instanceof MethodProtoReference) { return internMethodProtoReference((MethodProtoReference) reference); } if (reference instanceof CallSiteReference) { return internCallSite((CallSiteReference) reference); } if (reference instanceof MethodHandleReference) { return internMethodHandle((MethodHandleReference) reference); } throw new IllegalArgumentException("Could not determine type of reference"); }
@Nonnull public BuilderReference internReference(@Nonnull Reference reference) { if (reference instanceof StringReference) { return internStringReference(((StringReference)reference).getString()); } if (reference instanceof TypeReference) { return internTypeReference(((TypeReference)reference).getType()); } if (reference instanceof MethodReference) { return internMethodReference((MethodReference)reference); } if (reference instanceof FieldReference) { return internFieldReference((FieldReference)reference); } if (reference instanceof MethodProtoReference) { return internMethodProtoReference((MethodProtoReference) reference); } if (reference instanceof CallSiteReference) { return internCallSite((CallSiteReference) reference); } if (reference instanceof MethodHandleReference) { return internMethodHandle((MethodHandleReference) reference); } throw new IllegalArgumentException("Could not determine type of reference"); }
registers[2], registers[3], registers[4], dexBuilder.internTypeReference((nonvoid_type_descriptor166!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor166).type:null))));
dexBuilder.internTypeReference((nonvoid_type_descriptor192!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor192).type:null))));