Search in sources :

Example 16 with Value

use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.

the class Dex2IrAdapter method visitStmt3R.

@Override
public void visitStmt3R(Op op, int a, int b, int c) {
    Value va = locals[a];
    Value vb = locals[b];
    Value vc = locals[c];
    switch(op) {
        case APUT:
            x(nAssign(nArray(vb, vc, TypeClass.IF.name), va));
            break;
        case APUT_BOOLEAN:
            x(nAssign(nArray(vb, vc, "Z"), va));
            break;
        case APUT_BYTE:
            x(nAssign(nArray(vb, vc, "B"), va));
            break;
        case APUT_CHAR:
            x(nAssign(nArray(vb, vc, "C"), va));
            break;
        case APUT_OBJECT:
            x(nAssign(nArray(vb, vc, "L"), va));
            break;
        case APUT_SHORT:
            x(nAssign(nArray(vb, vc, "S"), va));
            break;
        case APUT_WIDE:
            x(nAssign(nArray(vb, vc, TypeClass.JD.name), va));
            break;
        case AGET:
            x(nAssign(va, nArray(vb, vc, TypeClass.IF.name)));
            break;
        case AGET_BOOLEAN:
            x(nAssign(va, nArray(vb, vc, "Z")));
            break;
        case AGET_BYTE:
            x(nAssign(va, nArray(vb, vc, "B")));
            break;
        case AGET_CHAR:
            x(nAssign(va, nArray(vb, vc, "C")));
            break;
        case AGET_OBJECT:
            x(nAssign(va, nArray(vb, vc, "L")));
            break;
        case AGET_SHORT:
            x(nAssign(va, nArray(vb, vc, "S")));
            break;
        case AGET_WIDE:
            x(nAssign(va, nArray(vb, vc, TypeClass.JD.name)));
            break;
        case CMP_LONG:
            x(nAssign(va, nLCmp(vb, vc)));
            break;
        case CMPG_DOUBLE:
            x(nAssign(va, nDCmpg(vb, vc)));
            break;
        case CMPG_FLOAT:
            x(nAssign(va, nFCmpg(vb, vc)));
            break;
        case CMPL_DOUBLE:
            x(nAssign(va, nDCmpl(vb, vc)));
            break;
        case CMPL_FLOAT:
            x(nAssign(va, nFCmpl(vb, vc)));
            break;
        case ADD_DOUBLE:
            x(nAssign(va, nAdd(vb, vc, "D")));
            break;
        case ADD_FLOAT:
            x(nAssign(va, nAdd(vb, vc, "F")));
            break;
        case ADD_INT:
            x(nAssign(va, nAdd(vb, vc, "I")));
            break;
        case ADD_LONG:
            x(nAssign(va, nAdd(vb, vc, "J")));
            break;
        case SUB_DOUBLE:
            x(nAssign(va, nSub(vb, vc, "D")));
            break;
        case SUB_FLOAT:
            x(nAssign(va, nSub(vb, vc, "F")));
            break;
        // break;
        case SUB_INT:
            x(nAssign(va, nSub(vb, vc, "I")));
            break;
        case SUB_LONG:
            x(nAssign(va, nSub(vb, vc, "J")));
            break;
        case MUL_DOUBLE:
            x(nAssign(va, nMul(vb, vc, "D")));
            break;
        case MUL_FLOAT:
            x(nAssign(va, nMul(vb, vc, "F")));
            break;
        case MUL_INT:
            x(nAssign(va, nMul(vb, vc, "I")));
            break;
        case MUL_LONG:
            x(nAssign(va, nMul(vb, vc, "J")));
            break;
        case DIV_DOUBLE:
            x(nAssign(va, nDiv(vb, vc, "D")));
            break;
        case DIV_FLOAT:
            x(nAssign(va, nDiv(vb, vc, "F")));
            break;
        case DIV_INT:
            x(nAssign(va, nDiv(vb, vc, "I")));
            break;
        case DIV_LONG:
            x(nAssign(va, nDiv(vb, vc, "J")));
            break;
        case REM_DOUBLE:
            x(nAssign(va, nRem(vb, vc, "D")));
            break;
        case REM_FLOAT:
            x(nAssign(va, nRem(vb, vc, "F")));
            break;
        case REM_INT:
            x(nAssign(va, nRem(vb, vc, "I")));
            break;
        case REM_LONG:
            x(nAssign(va, nRem(vb, vc, "J")));
            break;
        case AND_INT:
            x(nAssign(va, nAnd(vb, vc, TypeClass.ZI.name)));
            break;
        case AND_LONG:
            x(nAssign(va, nAnd(vb, vc, "J")));
            break;
        case OR_INT:
            x(nAssign(va, nOr(vb, vc, TypeClass.ZI.name)));
            break;
        case OR_LONG:
            x(nAssign(va, nOr(vb, vc, "J")));
            break;
        case XOR_INT:
            x(nAssign(va, nXor(vb, vc, TypeClass.ZI.name)));
            break;
        case XOR_LONG:
            x(nAssign(va, nXor(vb, vc, "J")));
            break;
        case SHL_INT:
            x(nAssign(va, nShl(vb, vc, "I")));
            break;
        case SHL_LONG:
            x(nAssign(va, nShl(vb, vc, "J")));
            break;
        case SHR_INT:
            x(nAssign(va, nShr(vb, vc, "I")));
            break;
        case SHR_LONG:
            x(nAssign(va, nShr(vb, vc, "J")));
            break;
        case USHR_INT:
            x(nAssign(va, nUshr(vb, vc, "I")));
            break;
        case USHR_LONG:
            x(nAssign(va, nUshr(vb, vc, "J")));
            break;
        default:
            throw new RuntimeException();
    }
}
Also used : Exprs.nArrayValue(com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue) Value(com.googlecode.dex2jar.ir.expr.Value)

Example 17 with Value

use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.

the class Dex2IrAdapter method visitMethodStmt.

@Override
public void visitMethodStmt(Op op, int[] args, Method method) {
    Value[] vs;
    if (args.length > 0) {
        int i = 0;
        List<Local> ps = new ArrayList<Local>(args.length);
        if (op == Op.INVOKE_STATIC || op == Op.INVOKE_STATIC_RANGE) {
            ;
        } else {
            ps.add(locals[args[i]]);
            i++;
        }
        for (String t : method.getParameterTypes()) {
            ps.add(locals[args[i]]);
            if (t.equals("J") || t.equals("D")) {
                i += 2;
            } else {
                i++;
            }
        }
        vs = ps.toArray(new Value[ps.size()]);
    } else {
        vs = new Value[0];
    }
    Value invoke = null;
    switch(op) {
        case INVOKE_VIRTUAL_RANGE:
        case INVOKE_VIRTUAL:
            invoke = nInvokeVirtual(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
            break;
        case INVOKE_SUPER_RANGE:
        case INVOKE_DIRECT_RANGE:
        case INVOKE_SUPER:
        case INVOKE_DIRECT:
            invoke = nInvokeSpecial(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
            break;
        case INVOKE_STATIC_RANGE:
        case INVOKE_STATIC:
            invoke = nInvokeStatic(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
            break;
        case INVOKE_INTERFACE_RANGE:
        case INVOKE_INTERFACE:
            invoke = nInvokeInterface(vs, method.getOwner(), method.getName(), method.getParameterTypes(), method.getReturnType());
            break;
        default:
            throw new RuntimeException();
    }
    if ("V".equals(method.getReturnType())) {
        x(nVoidInvoke(invoke));
    } else {
        x(nAssign(tmpLocal, invoke));
    }
}
Also used : Exprs.nArrayValue(com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue) Value(com.googlecode.dex2jar.ir.expr.Value) Local(com.googlecode.dex2jar.ir.expr.Local) Exprs.nString(com.googlecode.dex2jar.ir.expr.Exprs.nString)

Example 18 with Value

use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.

the class JimpleTransformer method convertExpr.

private Value convertExpr(Value x, boolean keep, N tmp) {
    switch(x.et) {
        case E0:
            if (!keep) {
                switch(x.vt) {
                    case CONSTANT:
                        Constant cst = (Constant) x;
                        if (cst.value instanceof String || cst.value instanceof Constant.Type || cst.value.getClass().isArray()) {
                            return tmp.newAssign(x);
                        }
                        break;
                    case NEW:
                    case STATIC_FIELD:
                        return tmp.newAssign(x);
                    default:
                }
            }
            break;
        case E1:
            x.setOp(convertExpr(x.getOp(), false, tmp));
            if (!keep) {
                return tmp.newAssign(x);
            }
            break;
        case E2:
            x.setOp1(convertExpr(x.getOp1(), false, tmp));
            x.setOp2(convertExpr(x.getOp2(), false, tmp));
            if (!keep) {
                return tmp.newAssign(x);
            }
            break;
        case En:
            Value[] ops = x.getOps();
            for (int i = 0; i < ops.length; i++) {
                ops[i] = convertExpr(ops[i], false, tmp);
            }
            if (!keep) {
                return tmp.newAssign(x);
            }
            break;
    }
    return x;
}
Also used : Constant(com.googlecode.dex2jar.ir.expr.Constant) Value(com.googlecode.dex2jar.ir.expr.Value)

Example 19 with Value

use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.

the class NpeTransformer method replace.

private void replace(final IrMethod m, final Stmt p) {
    StmtTraveler traveler = new StmtTraveler() {

        @Override
        public Value travel(Value op) {
            switch(op.vt) {
                case INVOKE_VIRTUAL:
                case INVOKE_SPECIAL:
                case INVOKE_INTERFACE:
                    {
                        Value[] ops = op.getOps();
                        if (isNull(ops[0])) {
                            for (int i = 1; i < ops.length; i++) {
                                travel(ops[i]);
                            }
                            throw NPE;
                        }
                    }
                    break;
                case ARRAY:
                    {
                        if (isNull(op.getOp1())) {
                            travel(op.getOp2());
                            throw NPE;
                        }
                    }
                    break;
                case FIELD:
                    {
                        if (isNull(op.getOp())) {
                            throw NPE;
                        }
                    }
                    break;
                case IDIV:
                    if (op.getOp2().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp2();
                        if (((Number) constant.value).intValue() == 0) {
                            travel(op.getOp1());
                            throw DIVE;
                        }
                    }
                    break;
                case LDIV:
                    if (op.getOp2().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp2();
                        if (((Number) constant.value).longValue() == 0) {
                            travel(op.getOp1());
                            throw DIVE;
                        }
                    }
                    break;
                case NEW_ARRAY:
                    if (op.getOp().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp();
                        if (((Number) constant.value).intValue() < 0) {
                            throw NEGATIVE_ARRAY_SIZE;
                        }
                    }
                    break;
                case NEW_MUTI_ARRAY:
                    for (Value size : op.getOps()) {
                        if (size.vt == Value.VT.CONSTANT) {
                            Constant constant = (Constant) size;
                            if (((Number) constant.value).intValue() < 0) {
                                throw NEGATIVE_ARRAY_SIZE;
                            } else {
                                travel(size);
                            }
                        }
                    }
                    break;
                default:
            }
            Value sop = super.travel(op);
            if (sop.vt == Value.VT.LOCAL || sop.vt == Value.VT.CONSTANT) {
                return sop;
            } else {
                Local local = new Local();
                m.locals.add(local);
                m.stmts.insertBefore(p, Stmts.nAssign(local, sop));
                return local;
            }
        }
    };
    try {
        switch(p.et) {
            case E0:
                // impossible
                break;
            case E1:
                traveler.travel(p.getOp());
                break;
            case E2:
                if (p.st == Stmt.ST.ASSIGN) {
                    switch(p.getOp1().vt) {
                        case ARRAY:
                            traveler.travel(p.getOp1().getOp1());
                            traveler.travel(p.getOp1().getOp2());
                            traveler.travel(p.getOp2());
                            break;
                        case FIELD:
                            traveler.travel(p.getOp1().getOp());
                            traveler.travel(p.getOp2());
                            break;
                        case STATIC_FIELD:
                        case LOCAL:
                            traveler.travel(p.getOp2());
                            break;
                        default:
                    }
                } else if (p.st == Stmt.ST.FILL_ARRAY_DATA) {
                    if (isNull(p.getOp1())) {
                        throw NPE;
                    } else {
                        traveler.travel(p.getOp1());
                    }
                }
                break;
            case En:
        }
    } catch (MustThrowException e) {
        if (e == NPE) {
            m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[0], new String[0], "Ljava/lang/NullPointerException;")));
        } else if (e == DIVE) {
            m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[] { Exprs.nString("divide by zero") }, new String[] { "Ljava/lang/String;" }, "Ljava/lang/ArithmeticException;")));
        } else if (e == NEGATIVE_ARRAY_SIZE) {
            m.stmts.insertBefore(p, Stmts.nThrow(Exprs.nInvokeNew(new Value[0], new String[0], "Ljava/lang/NegativeArraySizeException;")));
        }
    }
}
Also used : StmtTraveler(com.googlecode.dex2jar.ir.StmtTraveler) Constant(com.googlecode.dex2jar.ir.expr.Constant) Value(com.googlecode.dex2jar.ir.expr.Value) Local(com.googlecode.dex2jar.ir.expr.Local)

Example 20 with Value

use of com.googlecode.dex2jar.ir.expr.Value in project dex2jar by pxb1988.

the class NpeTransformer method transformReportChanged.

@Override
public boolean transformReportChanged(IrMethod method) {
    boolean changed = false;
    if (method.locals.size() == 0) {
        return false;
    }
    StmtSearcher st = new StmtSearcher() {

        @Override
        public void travel(Stmt stmt) {
            if (stmt.st == Stmt.ST.FILL_ARRAY_DATA) {
                if (isNull(stmt.getOp1())) {
                    throw NPE;
                }
            }
            super.travel(stmt);
        }

        @Override
        public void travel(Value op) {
            switch(op.vt) {
                case INVOKE_VIRTUAL:
                case INVOKE_SPECIAL:
                case INVOKE_INTERFACE:
                    {
                        if (isNull(op.getOps()[0])) {
                            throw NPE;
                        }
                    }
                    break;
                case ARRAY:
                    {
                        if (isNull(op.getOp1())) {
                            throw NPE;
                        }
                    }
                    break;
                case FIELD:
                    {
                        if (isNull(op.getOp())) {
                            throw NPE;
                        }
                    }
                    break;
                case IDIV:
                    if (op.getOp2().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp2();
                        if (((Number) constant.value).intValue() == 0) {
                            throw DIVE;
                        }
                    }
                    break;
                case LDIV:
                    if (op.getOp2().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp2();
                        if (((Number) constant.value).longValue() == 0) {
                            throw DIVE;
                        }
                    }
                    break;
                case NEW_ARRAY:
                    if (op.getOp().vt == Value.VT.CONSTANT) {
                        Constant constant = (Constant) op.getOp();
                        if (((Number) constant.value).intValue() < 0) {
                            throw NEGATIVE_ARRAY_SIZE;
                        }
                    }
                    break;
                case NEW_MUTI_ARRAY:
                    for (Value size : op.getOps()) {
                        if (size.vt == Value.VT.CONSTANT) {
                            Constant constant = (Constant) size;
                            if (((Number) constant.value).intValue() < 0) {
                                throw NEGATIVE_ARRAY_SIZE;
                            }
                        }
                    }
                    break;
                default:
            }
        }
    };
    for (Stmt p = method.stmts.getFirst(); p != null; ) {
        try {
            st.travel(p);
            p = p.getNext();
        } catch (MustThrowException e) {
            replace(method, p);
            Stmt q = p.getNext();
            method.stmts.remove(p);
            changed = true;
            p = q;
        }
    }
    return changed;
}
Also used : Constant(com.googlecode.dex2jar.ir.expr.Constant) Value(com.googlecode.dex2jar.ir.expr.Value) StmtSearcher(com.googlecode.dex2jar.ir.StmtSearcher) Stmt(com.googlecode.dex2jar.ir.stmt.Stmt)

Aggregations

Value (com.googlecode.dex2jar.ir.expr.Value)32 Local (com.googlecode.dex2jar.ir.expr.Local)19 AssignStmt (com.googlecode.dex2jar.ir.stmt.AssignStmt)11 LabelStmt (com.googlecode.dex2jar.ir.stmt.LabelStmt)9 Stmt (com.googlecode.dex2jar.ir.stmt.Stmt)8 Constant (com.googlecode.dex2jar.ir.expr.Constant)5 Exprs.nArrayValue (com.googlecode.dex2jar.ir.expr.Exprs.nArrayValue)4 ArrayList (java.util.ArrayList)4 AnalyzeValue (com.googlecode.dex2jar.ir.ts.an.AnalyzeValue)3 PhiExpr (com.googlecode.dex2jar.ir.expr.PhiExpr)2 TravelCallBack (com.googlecode.dex2jar.ir.ts.Cfg.TravelCallBack)2 DexLabel (com.googlecode.d2j.DexLabel)1 DexType (com.googlecode.d2j.DexType)1 Field (com.googlecode.d2j.Field)1 Method (com.googlecode.d2j.Method)1 DvmInterpreter (com.googlecode.d2j.node.analysis.DvmInterpreter)1 Op (com.googlecode.d2j.reader.Op)1 IrMethod (com.googlecode.dex2jar.ir.IrMethod)1 LocalVar (com.googlecode.dex2jar.ir.LocalVar)1 StmtSearcher (com.googlecode.dex2jar.ir.StmtSearcher)1