Search in sources :

Example 61 with Method

use of org.jf.dexlib2.iface.Method in project soot by Sable.

the class ExprVisitor method caseSpecialInvokeExpr.

@Override
public void caseSpecialInvokeExpr(SpecialInvokeExpr sie) {
    MethodReference method = DexPrinter.toMethodReference(sie.getMethodRef());
    List<Register> arguments = getInstanceInvokeArgumentRegs(sie);
    lastInvokeInstructionPosition = stmtV.getInstructionCount();
    if (isCallToConstructor(sie) || isCallToPrivate(sie)) {
        stmtV.addInsn(buildInvokeInsn("INVOKE_DIRECT", method, arguments), origStmt);
    } else if (isCallToSuper(sie)) {
        stmtV.addInsn(buildInvokeInsn("INVOKE_SUPER", method, arguments), origStmt);
    } else {
        // This should normally never happen, but if we have such a
        // broken call (happens in malware for instance), we fix it.
        stmtV.addInsn(buildInvokeInsn("INVOKE_VIRTUAL", method, arguments), origStmt);
    }
}
Also used : MethodReference(org.jf.dexlib2.iface.reference.MethodReference)

Example 62 with Method

use of org.jf.dexlib2.iface.Method in project soot by Sable.

the class ExprVisitor method buildInvokeInsn.

private Insn buildInvokeInsn(String invokeOpcode, MethodReference method, List<Register> argumentRegs) {
    Insn invokeInsn;
    int regCountForArguments = SootToDexUtils.getRealRegCount(argumentRegs);
    if (regCountForArguments <= 5) {
        Register[] paddedArray = pad35cRegs(argumentRegs);
        Opcode opc = Opcode.valueOf(invokeOpcode);
        invokeInsn = new Insn35c(opc, regCountForArguments, paddedArray[0], paddedArray[1], paddedArray[2], paddedArray[3], paddedArray[4], method);
    } else if (regCountForArguments <= 255) {
        Opcode opc = Opcode.valueOf(invokeOpcode + "_RANGE");
        invokeInsn = new Insn3rc(opc, argumentRegs, (short) regCountForArguments, method);
    } else {
        throw new Error("too many parameter registers for invoke-* (> 255): " + regCountForArguments + " or registers too big (> 4 bits)");
    }
    // save the return type for the move-result insn
    stmtV.setLastReturnTypeDescriptor(method.getReturnType());
    return invokeInsn;
}
Also used : Insn(soot.toDex.instructions.Insn) Insn35c(soot.toDex.instructions.Insn35c) Insn3rc(soot.toDex.instructions.Insn3rc) Opcode(org.jf.dexlib2.Opcode)

Example 63 with Method

use of org.jf.dexlib2.iface.Method in project soot by Sable.

the class ExprVisitor method caseVirtualInvokeExpr.

@Override
public void caseVirtualInvokeExpr(VirtualInvokeExpr vie) {
    /*
		 * for final methods we build an invoke-virtual opcode, too, although
		 * the dex spec says that a virtual method is not final. An alternative
		 * would be the invoke-direct opcode, but this is inconsistent with dx's
		 * output...
		 */
    MethodReference method = DexPrinter.toMethodReference(vie.getMethodRef());
    List<Register> argumentRegs = getInstanceInvokeArgumentRegs(vie);
    lastInvokeInstructionPosition = stmtV.getInstructionCount();
    stmtV.addInsn(buildInvokeInsn("INVOKE_VIRTUAL", method, argumentRegs), origStmt);
}
Also used : MethodReference(org.jf.dexlib2.iface.reference.MethodReference)

Example 64 with Method

use of org.jf.dexlib2.iface.Method in project soot by Sable.

the class DexPrinter method buildClassAnnotations.

private Set<Annotation> buildClassAnnotations(SootClass c) {
    Set<String> skipList = new HashSet<String>();
    Set<Annotation> annotations = buildCommonAnnotations(c, skipList);
    // so we test for enclosing methods first.
    if (c.hasTag("EnclosingMethodTag")) {
        EnclosingMethodTag eMethTag = (EnclosingMethodTag) c.getTag("EnclosingMethodTag");
        Annotation enclosingMethodItem = buildEnclosingMethodTag(eMethTag, skipList);
        if (enclosingMethodItem != null)
            annotations.add(enclosingMethodItem);
    } else if (c.hasOuterClass()) {
        if (skipList.add("Ldalvik/annotation/EnclosingClass;")) {
            // EnclosingClass annotation
            ImmutableAnnotationElement enclosingElement = new ImmutableAnnotationElement("value", new ImmutableTypeEncodedValue(SootToDexUtils.getDexClassName(c.getOuterClass().getName())));
            annotations.add(new ImmutableAnnotation(AnnotationVisibility.SYSTEM, "Ldalvik/annotation/EnclosingClass;", Collections.singleton(enclosingElement)));
        }
    }
    // respective inner classes.
    if (c.hasOuterClass()) {
        InnerClassAttribute icTag = (InnerClassAttribute) c.getOuterClass().getTag("InnerClassAttribute");
        if (icTag != null) {
            List<Annotation> innerClassItem = buildInnerClassAttribute(c, icTag, skipList);
            if (innerClassItem != null)
                annotations.addAll(innerClassItem);
        }
    }
    // Write the MemberClasses tag
    InnerClassAttribute icTag = (InnerClassAttribute) c.getTag("InnerClassAttribute");
    if (icTag != null) {
        List<Annotation> memberClassesItem = buildMemberClassesAttribute(c, icTag, skipList);
        if (memberClassesItem != null)
            annotations.addAll(memberClassesItem);
    }
    for (Tag t : c.getTags()) {
        if (t.getName().equals("VisibilityAnnotationTag")) {
            List<ImmutableAnnotation> visibilityItems = buildVisibilityAnnotationTag((VisibilityAnnotationTag) t, skipList);
            annotations.addAll(visibilityItems);
        }
    }
    // Write default-annotation tags
    List<AnnotationElem> defaults = new ArrayList<AnnotationElem>();
    for (SootMethod method : c.getMethods()) {
        AnnotationDefaultTag tag = (AnnotationDefaultTag) method.getTag("AnnotationDefaultTag");
        if (tag != null) {
            tag.getDefaultVal().setName(method.getName());
            defaults.add(tag.getDefaultVal());
        }
    }
    if (defaults.size() > 0) {
        VisibilityAnnotationTag defaultAnnotationTag = new VisibilityAnnotationTag(AnnotationConstants.RUNTIME_INVISIBLE);
        AnnotationTag a = new AnnotationTag("Ldalvik/annotation/AnnotationDefault;");
        defaultAnnotationTag.addAnnotation(a);
        AnnotationTag at = new AnnotationTag(SootToDexUtils.getDexClassName(c.getName()));
        AnnotationAnnotationElem ae = new AnnotationAnnotationElem(at, '@', "value");
        a.addElem(ae);
        for (AnnotationElem aelem : defaults) at.addElem(aelem);
        List<ImmutableAnnotation> visibilityItems = buildVisibilityAnnotationTag(defaultAnnotationTag, skipList);
        annotations.addAll(visibilityItems);
    }
    return annotations;
}
Also used : InnerClassAttribute(soot.tagkit.InnerClassAttribute) AnnotationAnnotationElem(soot.tagkit.AnnotationAnnotationElem) ImmutableAnnotationElement(org.jf.dexlib2.immutable.ImmutableAnnotationElement) AnnotationDefaultTag(soot.tagkit.AnnotationDefaultTag) ArrayList(java.util.ArrayList) ImmutableTypeEncodedValue(org.jf.dexlib2.immutable.value.ImmutableTypeEncodedValue) ImmutableAnnotation(org.jf.dexlib2.immutable.ImmutableAnnotation) Annotation(org.jf.dexlib2.iface.Annotation) ImmutableAnnotation(org.jf.dexlib2.immutable.ImmutableAnnotation) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) AnnotationTag(soot.tagkit.AnnotationTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) EnclosingMethodTag(soot.tagkit.EnclosingMethodTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) SootMethod(soot.SootMethod) ConstantValueTag(soot.tagkit.ConstantValueTag) SourceFileTag(soot.tagkit.SourceFileTag) AnnotationDefaultTag(soot.tagkit.AnnotationDefaultTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) InnerClassTag(soot.tagkit.InnerClassTag) FloatConstantValueTag(soot.tagkit.FloatConstantValueTag) AnnotationTag(soot.tagkit.AnnotationTag) IntegerConstantValueTag(soot.tagkit.IntegerConstantValueTag) EnclosingMethodTag(soot.tagkit.EnclosingMethodTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) Tag(soot.tagkit.Tag) LineNumberTag(soot.tagkit.LineNumberTag) ParamNamesTag(soot.tagkit.ParamNamesTag) DoubleConstantValueTag(soot.tagkit.DoubleConstantValueTag) LongConstantValueTag(soot.tagkit.LongConstantValueTag) SignatureTag(soot.tagkit.SignatureTag) StringConstantValueTag(soot.tagkit.StringConstantValueTag) AnnotationElem(soot.tagkit.AnnotationElem) AnnotationAnnotationElem(soot.tagkit.AnnotationAnnotationElem) HashSet(java.util.HashSet)

Example 65 with Method

use of org.jf.dexlib2.iface.Method in project soot by Sable.

the class DexPrinter method addAsClassDefItem.

private void addAsClassDefItem(SootClass c) {
    // add source file tag if any
    String sourceFile = null;
    if (c.hasTag("SourceFileTag")) {
        SourceFileTag sft = (SourceFileTag) c.getTag("SourceFileTag");
        sourceFile = sft.getSourceFile();
    }
    String classType = SootToDexUtils.getDexTypeDescriptor(c.getType());
    int accessFlags = c.getModifiers();
    String superClass = c.hasSuperclass() ? SootToDexUtils.getDexTypeDescriptor(c.getSuperclass().getType()) : null;
    List<String> interfaces = null;
    if (!c.getInterfaces().isEmpty()) {
        interfaces = new ArrayList<String>();
        for (SootClass ifc : c.getInterfaces()) interfaces.add(SootToDexUtils.getDexTypeDescriptor(ifc.getType()));
    }
    List<Field> fields = null;
    if (!c.getFields().isEmpty()) {
        fields = new ArrayList<Field>();
        for (SootField f : c.getFields()) {
            // We do not want to write out phantom fields
            if (f.isPhantom())
                continue;
            // Look for a static initializer
            EncodedValue staticInit = null;
            for (Tag t : f.getTags()) {
                if (t instanceof ConstantValueTag) {
                    if (staticInit != null) {
                        LOGGER.warn("More than one constant tag for field \"{}\": \"{}\"", f, t);
                    } else {
                        staticInit = makeConstantItem(f, t);
                    }
                }
            }
            if (staticInit == null)
                staticInit = BuilderEncodedValues.defaultValueForType(SootToDexUtils.getDexTypeDescriptor(f.getType()));
            // Build field annotations
            Set<Annotation> fieldAnnotations = buildFieldAnnotations(f);
            ImmutableField field = new ImmutableField(classType, f.getName(), SootToDexUtils.getDexTypeDescriptor(f.getType()), f.getModifiers(), staticInit, fieldAnnotations);
            fields.add(field);
        }
    }
    Collection<Method> methods = toMethods(c);
    ClassDef classDef = new ImmutableClassDef(classType, accessFlags, superClass, interfaces, sourceFile, buildClassAnnotations(c), fields, methods);
    dexBuilder.internClass(classDef);
}
Also used : ImmutableClassDef(org.jf.dexlib2.immutable.ImmutableClassDef) SourceFileTag(soot.tagkit.SourceFileTag) Method(org.jf.dexlib2.iface.Method) ImmutableMethod(org.jf.dexlib2.immutable.ImmutableMethod) SootMethod(soot.SootMethod) SootClass(soot.SootClass) Annotation(org.jf.dexlib2.iface.Annotation) ImmutableAnnotation(org.jf.dexlib2.immutable.ImmutableAnnotation) ConstantValueTag(soot.tagkit.ConstantValueTag) FloatConstantValueTag(soot.tagkit.FloatConstantValueTag) IntegerConstantValueTag(soot.tagkit.IntegerConstantValueTag) DoubleConstantValueTag(soot.tagkit.DoubleConstantValueTag) LongConstantValueTag(soot.tagkit.LongConstantValueTag) StringConstantValueTag(soot.tagkit.StringConstantValueTag) Field(org.jf.dexlib2.iface.Field) ImmutableField(org.jf.dexlib2.immutable.ImmutableField) SootField(soot.SootField) ImmutableNullEncodedValue(org.jf.dexlib2.immutable.value.ImmutableNullEncodedValue) ImmutableFieldEncodedValue(org.jf.dexlib2.immutable.value.ImmutableFieldEncodedValue) ImmutableByteEncodedValue(org.jf.dexlib2.immutable.value.ImmutableByteEncodedValue) ImmutableStringEncodedValue(org.jf.dexlib2.immutable.value.ImmutableStringEncodedValue) ImmutableEncodedValue(org.jf.dexlib2.immutable.value.ImmutableEncodedValue) ImmutableAnnotationEncodedValue(org.jf.dexlib2.immutable.value.ImmutableAnnotationEncodedValue) ImmutableCharEncodedValue(org.jf.dexlib2.immutable.value.ImmutableCharEncodedValue) EncodedValue(org.jf.dexlib2.iface.value.EncodedValue) ImmutableFloatEncodedValue(org.jf.dexlib2.immutable.value.ImmutableFloatEncodedValue) ImmutableLongEncodedValue(org.jf.dexlib2.immutable.value.ImmutableLongEncodedValue) ImmutableShortEncodedValue(org.jf.dexlib2.immutable.value.ImmutableShortEncodedValue) ImmutableTypeEncodedValue(org.jf.dexlib2.immutable.value.ImmutableTypeEncodedValue) ImmutableDoubleEncodedValue(org.jf.dexlib2.immutable.value.ImmutableDoubleEncodedValue) ImmutableMethodEncodedValue(org.jf.dexlib2.immutable.value.ImmutableMethodEncodedValue) ImmutableArrayEncodedValue(org.jf.dexlib2.immutable.value.ImmutableArrayEncodedValue) ImmutableEnumEncodedValue(org.jf.dexlib2.immutable.value.ImmutableEnumEncodedValue) ImmutableIntEncodedValue(org.jf.dexlib2.immutable.value.ImmutableIntEncodedValue) ImmutableBooleanEncodedValue(org.jf.dexlib2.immutable.value.ImmutableBooleanEncodedValue) ImmutableClassDef(org.jf.dexlib2.immutable.ImmutableClassDef) ClassDef(org.jf.dexlib2.iface.ClassDef) ImmutableField(org.jf.dexlib2.immutable.ImmutableField) SootField(soot.SootField) ConstantValueTag(soot.tagkit.ConstantValueTag) SourceFileTag(soot.tagkit.SourceFileTag) AnnotationDefaultTag(soot.tagkit.AnnotationDefaultTag) VisibilityAnnotationTag(soot.tagkit.VisibilityAnnotationTag) InnerClassTag(soot.tagkit.InnerClassTag) FloatConstantValueTag(soot.tagkit.FloatConstantValueTag) AnnotationTag(soot.tagkit.AnnotationTag) IntegerConstantValueTag(soot.tagkit.IntegerConstantValueTag) EnclosingMethodTag(soot.tagkit.EnclosingMethodTag) VisibilityParameterAnnotationTag(soot.tagkit.VisibilityParameterAnnotationTag) Tag(soot.tagkit.Tag) LineNumberTag(soot.tagkit.LineNumberTag) ParamNamesTag(soot.tagkit.ParamNamesTag) DoubleConstantValueTag(soot.tagkit.DoubleConstantValueTag) LongConstantValueTag(soot.tagkit.LongConstantValueTag) SignatureTag(soot.tagkit.SignatureTag) StringConstantValueTag(soot.tagkit.StringConstantValueTag)

Aggregations

Method (org.jf.dexlib2.iface.Method)30 ClassDef (org.jf.dexlib2.iface.ClassDef)27 MethodImplementation (org.jf.dexlib2.iface.MethodImplementation)23 Test (org.junit.Test)21 Instruction (org.jf.dexlib2.iface.instruction.Instruction)19 MethodReference (org.jf.dexlib2.iface.reference.MethodReference)18 DexFile (org.jf.dexlib2.iface.DexFile)16 ImmutableMethod (org.jf.dexlib2.immutable.ImmutableMethod)15 DexBackedClassDef (org.jf.dexlib2.dexbacked.DexBackedClassDef)13 ArrayList (java.util.ArrayList)12 ImmutableClassDef (org.jf.dexlib2.immutable.ImmutableClassDef)12 MutableMethodImplementation (org.jf.dexlib2.builder.MutableMethodImplementation)10 ImmutableDexFile (org.jf.dexlib2.immutable.ImmutableDexFile)10 HashSet (java.util.HashSet)9 Nonnull (javax.annotation.Nonnull)9 BuilderInstruction10x (org.jf.dexlib2.builder.instruction.BuilderInstruction10x)8 ReferenceInstruction (org.jf.dexlib2.iface.instruction.ReferenceInstruction)8 ImmutableMethodParameter (org.jf.dexlib2.immutable.ImmutableMethodParameter)8 ImmutableMethodReference (org.jf.dexlib2.immutable.reference.ImmutableMethodReference)8 File (java.io.File)7