Beispiel #1
0
        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());
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public DexReader(Dex dex)
 {
     Dex    = dex;
     Map    = new Map();
     Header = new DexHeader();
 }