public DexBackedClassDef(@Nonnull DexBackedDexFile dexFile, int classDefOffset) { this.dexFile = dexFile; this.classDefOffset = classDefOffset; int classDataOffset = dexFile.readSmallUint(classDefOffset + ClassDefItem.CLASS_DATA_OFFSET); if (classDataOffset == 0) { staticFieldsOffset = -1; staticFieldCount = 0; instanceFieldCount = 0; directMethodCount = 0; virtualMethodCount = 0; } else { DexReader reader = dexFile.readerAt(classDataOffset); staticFieldCount = reader.readSmallUleb128(); instanceFieldCount = reader.readSmallUleb128(); directMethodCount = reader.readSmallUleb128(); virtualMethodCount = reader.readSmallUleb128(); staticFieldsOffset = reader.getOffset(); } }
public DexBackedMethod(@Nonnull DexReader reader, @Nonnull DexBackedClassDef classDef, int previousMethodIndex) { this.dexFile = reader.dexBuf; this.classDef = classDef; startOffset = reader.getOffset(); // large values may be used for the index delta, which cause the cumulative index to overflow upon // addition, effectively allowing out of order entries. int methodIndexDiff = reader.readLargeUleb128(); this.methodIndex = methodIndexDiff + previousMethodIndex; this.accessFlags = reader.readSmallUleb128(); this.codeOffset = reader.readSmallUleb128(); this.methodAnnotationSetOffset = 0; this.parameterAnnotationSetListOffset = 0; }
public DexBackedMethod(@Nonnull DexReader reader, @Nonnull DexBackedClassDef classDef, int previousMethodIndex, @Nonnull AnnotationsDirectory.AnnotationIterator methodAnnotationIterator, @Nonnull AnnotationsDirectory.AnnotationIterator paramaterAnnotationIterator) { this.dexFile = reader.dexBuf; this.classDef = classDef; startOffset = reader.getOffset(); // large values may be used for the index delta, which cause the cumulative index to overflow upon // addition, effectively allowing out of order entries. int methodIndexDiff = reader.readLargeUleb128(); this.methodIndex = methodIndexDiff + previousMethodIndex; this.accessFlags = reader.readSmallUleb128(); this.codeOffset = reader.readSmallUleb128(); this.methodAnnotationSetOffset = methodAnnotationIterator.seekTo(methodIndex); this.parameterAnnotationSetListOffset = paramaterAnnotationIterator.seekTo(methodIndex); }
@Nonnull public String getString(int stringIndex) { int stringOffset = getStringIdItemOffset(stringIndex); int stringDataOffset = readSmallUint(stringOffset); DexReader reader = readerAt(stringDataOffset); int utf16Length = reader.readSmallUleb128(); return reader.readString(utf16Length); }
/** * Calculate and return the private size of a method definition. * * Calculated as: method_idx_diff + access_flags + code_off + * implementation size + reference size * * @return size in bytes */ public int getSize() { int size = 0; DexReader reader = dexFile.readerAt(startOffset); reader.readLargeUleb128(); //method_idx_diff reader.readSmallUleb128(); //access_flags reader.readSmallUleb128(); //code_off size += reader.getOffset() - startOffset; DexBackedMethodImplementation impl = getImplementation(); if (impl != null) { size += impl.getSize(); } DexBackedMethodReference methodRef = new DexBackedMethodReference(dexFile, methodIndex); size += methodRef.getSize(); return size; } }
if (classDataOffset > 0) { DexReader reader = dexFile.readerAt(classDataOffset); reader.readSmallUleb128(); //staticFieldCount reader.readSmallUleb128(); //instanceFieldCount reader.readSmallUleb128(); //directMethodCount reader.readSmallUleb128(); //virtualMethodCount size += reader.getOffset() - classDataOffset;
/** * Calculate and return the private size of a string reference. * * Calculated as: string_data_off + string_data_item size * * @return size in bytes */ public int getSize() { int size = StringIdItem.ITEM_SIZE; //uint for string_data_off //add the string data length: int stringOffset = dexFile.getStringIdItemOffset(stringIndex); int stringDataOffset = dexFile.readSmallUint(stringOffset); DexReader reader = dexFile.readerAt(stringDataOffset); size += reader.peekSmallUleb128Size(); int utf16Length = reader.readSmallUleb128(); //and string data itself: size += reader.peekStringLength(utf16Length); return size; } }
public DexBackedTypedExceptionHandler(@Nonnull DexReader reader) { this.dexFile = reader.dexBuf; this.typeId = reader.readSmallUleb128(); this.handlerCodeAddress = reader.readSmallUleb128(); }
public DexBackedAnnotationElement(@Nonnull DexReader reader) { this.dexFile = reader.dexBuf; this.nameIndex = reader.readSmallUleb128(); this.value = DexBackedEncodedValue.readFrom(reader); }
public EncodedArrayItemIteratorImpl(@Nonnull DexBackedDexFile dexFile, int offset) { this.reader = dexFile.readerAt(offset); this.size = reader.readSmallUleb128(); }
public DexBackedAnnotationEncodedValue(@Nonnull DexReader reader) { this.dexFile = reader.dexBuf; this.type = dexFile.getType(reader.readSmallUleb128()); this.elementCount = reader.readSmallUleb128(); this.elementsOffset = reader.getOffset(); skipElements(reader, elementCount); }
public DexBackedArrayEncodedValue(@Nonnull DexReader reader) { this.dexFile = reader.dexBuf; this.elementCount = reader.readSmallUleb128(); this.encodedArrayOffset = reader.getOffset(); skipElementsFrom(reader, elementCount); }
public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationItemOffset) { try { DexReader reader = dexFile.readerAt(annotationItemOffset); reader.readUbyte(); int typeIndex = reader.readSmallUleb128(); String annotationType = dexFile.getType(typeIndex); return String.format("annotation_item[0x%x]: %s", annotationItemOffset, annotationType); } catch (Exception ex) { ex.printStackTrace(System.err); } return String.format("annotation_item[0x%x]", annotationItemOffset); } }
public static void skipFrom(@Nonnull DexReader reader) { reader.skipUleb128(); // type int elementCount = reader.readSmallUleb128(); skipElements(reader, elementCount); }
public static void skipFrom(@Nonnull DexReader reader) { reader.skipUleb128(); // type int elementCount = reader.readSmallUleb128(); skipElements(reader, elementCount); }
public DexBackedAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationOffset) { this.dexFile = dexFile; DexReader reader = dexFile.readerAt(annotationOffset); this.visibility = reader.readUbyte(); this.typeIndex = reader.readSmallUleb128(); this.elementsOffset = reader.getOffset(); }
@Override protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) { DexReader reader = dexFile.readerAt(out.getCursor()); int utf16Length = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "utf16_size = %d", utf16Length); String value = reader.readString(utf16Length); out.annotateTo(reader.getOffset() + 1, "data = \"%s\"", StringUtils.escapeString(value)); } };
public static void annotateEncodedArray(@Nonnull AnnotatedBytes out, @Nonnull DexReader reader) { assert out.getCursor() == reader.getOffset(); int size = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "size: %d", size); for (int i=0; i<size; i++) { out.annotate(0, "element[%d]", i); out.indent(); annotateEncodedValue(out, reader); out.deindent(); } }
@Override protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) { DexReader reader = dexFile.readerAt(out.getCursor()); int utf16Length = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "utf16_size = %d", utf16Length); String value = reader.readString(utf16Length); out.annotateTo(reader.getOffset() + 1, "data = \"%s\"", StringUtils.escapeString(value)); } };
@Override protected void annotateItem(@Nonnull AnnotatedBytes out, int itemIndex, @Nullable String itemIdentity) { DexReader reader = dexFile.readerAt(out.getCursor()); int utf16Length = reader.readSmallUleb128(); out.annotateTo(reader.getOffset(), "utf16_size = %d", utf16Length); String value = reader.readString(utf16Length); out.annotateTo(reader.getOffset() + 1, "data = \"%s\"", StringUtils.escapeString(value)); } };