예제 #1
0
  public BinaryXMLParser(RootNode root) {
    try {
      try {
        Class<?> rStyleCls = Class.forName(ANDROID_R_STYLE_CLS);
        for (Field f : rStyleCls.getFields()) {
          styleMap.put(f.getInt(f.getType()), f.getName());
        }
      } catch (Throwable th) {
        LOG.error("R class loading failed", th);
      }
      // add application constants
      for (DexNode dexNode : root.getDexNodes()) {
        for (Map.Entry<Object, FieldNode> entry : dexNode.getConstFields().entrySet()) {
          Object key = entry.getKey();
          FieldNode field = entry.getValue();
          if (field.getType().equals(ArgType.INT) && key instanceof Integer) {
            localStyleMap.put((Integer) key, field);
          }
        }
      }

      resNames = root.getResourcesNames();

      attributes = new ManifestAttributes();
      attributes.parse();
    } catch (Exception e) {
      throw new JadxRuntimeException("BinaryXMLParser init error", e);
    }
  }
예제 #2
0
  public DebugInfoParser(MethodNode mth, int debugOffset, InsnNode[] insnByOffset) {
    this.mth = mth;
    this.dex = mth.dex();
    this.section = dex.openSection(debugOffset);

    int regsCount = mth.getRegsCount();
    this.locals = new LocalVar[regsCount];
    this.activeRegisters = new InsnArg[regsCount];
    this.insnByOffset = insnByOffset;
  }
예제 #3
0
  public void process() throws DecodeException {
    int addr = 0;
    int line = section.readUleb128();

    int paramsCount = section.readUleb128();
    List<RegisterArg> mthArgs = mth.getArguments(false);
    assert paramsCount == mthArgs.size();

    for (int i = 0; i < paramsCount; i++) {
      int id = section.readUleb128() - 1;
      if (id != DexNode.NO_INDEX) {
        String name = dex.getString(id);
        mthArgs.get(i).setName(name);
      }
    }

    for (RegisterArg arg : mthArgs) {
      int rn = arg.getRegNum();
      locals[rn] = new LocalVar(arg);
      activeRegisters[rn] = arg;
    }

    // process '0' instruction
    addrChange(-1, 1, line);
    setLine(addr, line);

    int c = section.readByte() & 0xFF;
    while (c != DBG_END_SEQUENCE) {
      switch (c) {
        case DBG_ADVANCE_PC:
          {
            int addrInc = section.readUleb128();
            addr = addrChange(addr, addrInc, line);
            setLine(addr, line);
            break;
          }
        case DBG_ADVANCE_LINE:
          {
            line += section.readSleb128();
            break;
          }

        case DBG_START_LOCAL:
          {
            int regNum = section.readUleb128();
            int nameId = section.readUleb128() - 1;
            int type = section.readUleb128() - 1;
            LocalVar var = new LocalVar(dex, regNum, nameId, type, DexNode.NO_INDEX);
            startVar(var, addr, line);
            break;
          }
        case DBG_START_LOCAL_EXTENDED:
          {
            int regNum = section.readUleb128();
            int nameId = section.readUleb128() - 1;
            int type = section.readUleb128() - 1;
            int sign = section.readUleb128() - 1;
            LocalVar var = new LocalVar(dex, regNum, nameId, type, sign);
            startVar(var, addr, line);
            break;
          }
        case DBG_RESTART_LOCAL:
          {
            int regNum = section.readUleb128();
            LocalVar var = locals[regNum];
            if (var != null) {
              var.end(addr, line);
              setVar(var);
              var.start(addr, line);
            }
            break;
          }
        case DBG_END_LOCAL:
          {
            int regNum = section.readUleb128();
            LocalVar var = locals[regNum];
            if (var != null) {
              var.end(addr, line);
              setVar(var);
            }
            break;
          }

        case DBG_SET_PROLOGUE_END:
        case DBG_SET_EPILOGUE_BEGIN:
          // do nothing
          break;

        case DBG_SET_FILE:
          {
            int idx = section.readUleb128() - 1;
            if (idx != DexNode.NO_INDEX) {
              String sourceFile = dex.getString(idx);
              mth.addAttr(new SourceFileAttr(sourceFile));
            }
            break;
          }

        default:
          {
            if (c >= DBG_FIRST_SPECIAL) {
              int adjustedOpcode = c - DBG_FIRST_SPECIAL;
              int addrInc = adjustedOpcode / DBG_LINE_RANGE;
              addr = addrChange(addr, addrInc, line);
              line += DBG_LINE_BASE + (adjustedOpcode % DBG_LINE_RANGE);
              setLine(addr, line);
            } else {
              throw new DecodeException("Unknown debug insn code: " + c);
            }
            break;
          }
      }
      c = section.readByte() & 0xFF;
    }

    for (LocalVar var : locals) {
      if (var != null && !var.isEnd()) {
        var.end(addr, line);
        setVar(var);
      }
    }
    setSourceLines(addr, insnByOffset.length, line);
  }