public void parse() { // read magic string magic = Encoding.UTF8.GetString(Buffers.readBytes(buffer, 8)); //new string(Buffers.readBytes(buffer, 8)); if (!magic.StartsWith("dex\n")) { return; } int version = int.Parse(magic.Substring(4, 7)); // now the version is 035 if (version < 35) { // version 009 was used for the M3 releases of the Android platform (November–December 2007), // and version 013 was used for the M5 releases of the Android platform (February–March 2008) throw new Exception("Dex file version: " + version + " is not supported"); } // read header DexHeader header = readDexHeader(); header.setVersion(version); // read string pool long[] stringOffsets = readStringPool(header.getStringIdsOff(), header.getStringIdsSize()); // read types int[] typeIds = readTypes(header.getTypeIdsOff(), header.getTypeIdsSize()); // read classes DexClassStruct[] dexClassStructs = readClass(header.getClassDefsOff(), header.getClassDefsSize()); StringPool stringpool = readStrings(stringOffsets); string[] types = new string[typeIds.Length]; for (int i = 0; i < typeIds.Length; i++) { types[i] = stringpool.get(typeIds[i]); } dexClasses = new DexClass[dexClassStructs.Length]; for (int i = 0; i < dexClasses.Length; i++) { dexClasses[i] = new DexClass(); } for (int i = 0; i < dexClassStructs.Length; i++) { DexClassStruct dexClassStruct = dexClassStructs[i]; DexClass dexClass = dexClasses[i]; dexClass.setClassType(types[dexClassStruct.getClassIdx()]); if (dexClassStruct.getSuperclassIdx() != NO_INDEX) { dexClass.setSuperClass(types[dexClassStruct.getSuperclassIdx()]); } dexClass.setAccessFlags(dexClassStruct.getAccessFlags()); } }
private DexHeader readDexHeader() { // check sum. skip buffer.getInt(); // signature skip Buffers.readBytes(buffer, DexHeader.kSHA1DigestLen); DexHeader header = new DexHeader(); header.setFileSize(Buffers.readUInt(buffer)); header.setHeaderSize(Buffers.readUInt(buffer)); // skip? Buffers.readUInt(buffer); // static link data header.setLinkSize(Buffers.readUInt(buffer)); header.setLinkOff(Buffers.readUInt(buffer)); // the map data is just the same as dex header. header.setMapOff(Buffers.readUInt(buffer)); header.setStringIdsSize(buffer.getInt()); header.setStringIdsOff(Buffers.readUInt(buffer)); header.setTypeIdsSize(buffer.getInt()); header.setTypeIdsOff(Buffers.readUInt(buffer)); header.setProtoIdsSize(buffer.getInt()); header.setProtoIdsOff(Buffers.readUInt(buffer)); header.setFieldIdsSize(buffer.getInt()); header.setFieldIdsOff(Buffers.readUInt(buffer)); header.setMethodIdsSize(buffer.getInt()); header.setMethodIdsOff(Buffers.readUInt(buffer)); header.setClassDefsSize(buffer.getInt()); header.setClassDefsOff(Buffers.readUInt(buffer)); header.setDataSize(buffer.getInt()); header.setDataOff(Buffers.readUInt(buffer)); buffer.position((int)header.getHeaderSize()); return(header); }
public DexReader(Dex dex) { Dex = dex; Map = new Map(); Header = new DexHeader(); }