DEX 可视化查阅

参考: http://bbs.pediy.com/thread-208828.htm

010 Editor 下载地址: http://www.sweetscape.com/download/

  1 //--------------------------------------
  2 //--- 010 Editor v3.1.3 Binary Template
  3 //
  4 // File:
  5 // Author:
  6 // Revision:
  7 // Purpose:
  8 //--------------------------------------
  9 //configure
 10 local byte bShow_DexTypeList = 0;
 11  
 12 //enum
 13 enum { kSHA1DigestLen = 20,
 14        kSHA1DigestOutputLen = kSHA1DigestLen*2 +1 };
 15 /*
 16  * access flags and masks; the "standard" ones are all <= 0x4000
 17  *
 18  * Note: There are related declarations in vm/oo/Object.h in the ClassFlags
 19  * enum.
 20  */
 21 enum <uint> AccessFlags{
 22     ACC_PUBLIC       = 0x00000001,       // class, field, method, ic
 23     ACC_PRIVATE      = 0x00000002,       // field, method, ic
 24     ACC_PROTECTED    = 0x00000004,       // field, method, ic
 25     ACC_STATIC       = 0x00000008,       // field, method, ic
 26     ACC_FINAL        = 0x00000010,       // class, field, method, ic
 27     ACC_SYNCHRONIZED = 0x00000020,       // method (only allowed on natives)
 28     ACC_SUPER        = 0x00000020,       // class (not used in Dalvik)
 29     ACC_VOLATILE     = 0x00000040,       // field
 30     ACC_BRIDGE       = 0x00000040,       // method (1.5)
 31     ACC_TRANSIENT    = 0x00000080,       // field
 32     ACC_VARARGS      = 0x00000080,       // method (1.5)
 33     ACC_NATIVE       = 0x00000100,       // method
 34     ACC_INTERFACE    = 0x00000200,       // class, ic
 35     ACC_ABSTRACT     = 0x00000400,       // class, method, ic
 36     ACC_STRICT       = 0x00000800,       // method
 37     ACC_SYNTHETIC    = 0x00001000,       // field, method, ic
 38     ACC_ANNOTATION   = 0x00002000,       // class, ic (1.5)
 39     ACC_ENUM         = 0x00004000,       // class, field, ic (1.5)
 40     ACC_CONSTRUCTOR  = 0x00010000,       // method (Dalvik only)
 41     ACC_DECLARED_SYNCHRONIZED =
 42                        0x00020000,       // method (Dalvik only)
 43     ACC_CLASS_MASK =
 44         (ACC_PUBLIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT
 45                 | ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM),
 46     ACC_INNER_CLASS_MASK =
 47         (ACC_CLASS_MASK | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC),
 48     ACC_FIELD_MASK =
 49         (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL
 50                 | ACC_VOLATILE | ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM),
 51     ACC_METHOD_MASK =
 52         (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL
 53                 | ACC_SYNCHRONIZED | ACC_BRIDGE | ACC_VARARGS | ACC_NATIVE
 54                 | ACC_ABSTRACT | ACC_STRICT | ACC_SYNTHETIC | ACC_CONSTRUCTOR
 55                 | ACC_DECLARED_SYNCHRONIZED),
 56 };
 57  
 58 //Dex Header
 59 struct DexHeader {
 60     unsigned char  magic[8];           /* includes version number */
 61     unsigned int   checksum;           /* adler32 checksum */
 62     unsigned char  signature[kSHA1DigestLen]; /* SHA-1 hash */
 63     unsigned int   fileSize;           /* length of entire file */
 64     unsigned int   headerSize;         /* offset to start of next section */
 65     unsigned int   endianTag;
 66     unsigned int   linkSize;
 67     unsigned int   linkOff;
 68     unsigned int   mapOff;
 69     unsigned int   stringIdsSize;
 70     unsigned int   stringIdsOff;
 71     unsigned int   typeIdsSize;
 72     unsigned int   typeIdsOff;
 73     unsigned int   protoIdsSize;
 74     unsigned int   protoIdsOff;
 75     unsigned int   fieldIdsSize;
 76     unsigned int   fieldIdsOff;
 77     unsigned int   methodIdsSize;
 78     unsigned int   methodIdsOff;
 79     unsigned int   classDefsSize;
 80     unsigned int   classDefsOff;
 81     unsigned int   dataSize;
 82     unsigned int   dataOff;
 83 };
 84  
 85 //******************** map list*******************
 86  
 87 /* map item type codes, DexMapItem.type used*/
 88 //DexHeader.mapOff  ---> pointer to data struct
 89 enum <ushort> kDexType{
 90     kDexTypeHeaderItem               = 0x0000,
 91     kDexTypeStringIdItem             = 0x0001,
 92     kDexTypeTypeIdItem               = 0x0002,
 93     kDexTypeProtoIdItem              = 0x0003,
 94     kDexTypeFieldIdItem              = 0x0004,
 95     kDexTypeMethodIdItem             = 0x0005,
 96     kDexTypeClassDefItem             = 0x0006,
 97     kDexTypeMapList                  = 0x1000,
 98     kDexTypeTypeList                 = 0x1001,
 99     kDexTypeAnnotationSetRefList     = 0x1002,
100     kDexTypeAnnotationSetItem        = 0x1003,
101     kDexTypeClassDataItem            = 0x2000,
102     kDexTypeCodeItem                 = 0x2001,
103     kDexTypeStringDataItem           = 0x2002,
104     kDexTypeDebugInfoItem            = 0x2003,
105     kDexTypeAnnotationItem           = 0x2004,
106     kDexTypeEncodedArrayItem         = 0x2005,
107     kDexTypeAnnotationsDirectoryItem = 0x2006,
108 };
109  
110 struct DexMapItem {
111     kDexType type;              /* type code (see kDexType* above) */
112     ushort  unused;
113     uint    size<format=decimal>;              /* count of items of the indicated type */
114     uint    offset;            /* file offset to the start of data */
115 };
116  
117 struct DexMapList
118 {
119     uint size<format=decimal>;               /* #of entries in list */   
120     //ref field DexMapList.size
121     DexMapItem list[size];   /* entries */
122 };
123  
124 //********************strings index table********************
125 /*
126  * Direct-mapped "string_id_item".
127  */
128 typedef struct
129 {
130     uint stringDataOff;      /* file offset to string_data_item */
131 }DexStringId<read=TemplateRead_StringId>;
132  
133 //********************types index table********************
134 /*
135  * Direct-mapped "type_id_item".
136  */
137 typedef struct
138 {
139     uint  descriptorIdx;      /* index into stringIds list for type descriptor */
140 }DexTypeId<read=TemplateRead_TypeId>;
141  
142 //********************protos index table********************
143  
144 /*
145  * Direct-mapped "type_item".
146  */
147 struct DexTypeItem {
148     ushort  typeIdx;            /* index into typeIds */
149 };
150  
151 /*
152  * Direct-mapped "type_list".
153  */
154 typedef struct  {
155     uint  size;               /* #of entries in list */
156     DexTypeItem list[size];    /* entries */
157 }DexTypeList<read=TemplateRead_TypeList>;
158  
159 /*
160  * Direct-mapped "proto_id_item".
161  */
162 typedef struct 
163 {
164     uint  shortyIdx;          /* index into stringIds for shorty descriptor */
165     uint  returnTypeIdx;      /* index into typeIds list for return type */
166     uint  parametersOff;      /* file offset to type_list for parameter types */ 
167     if(parametersOff > 0x70)
168     {
169         local int64 oldOffset = FTell(); 
170         FSeek(parametersOff);   
171         DexTypeList typeList_Params;
172         FSeek(oldOffset); 
173     }        
174 }DexProtoId<read=TemplateRead_ProtoId>;
175  
176  
177 //********************field index table********************
178 /*
179  * Direct-mapped "field_id_item".
180  */
181 typedef struct  {
182     ushort  classIdx;           /* index into typeIds list for defining class */
183     ushort  typeIdx;            /* index into typeIds for field type */
184     uint  nameIdx;            /* index into stringIds for field name */
185 }DexFieldId<read=TemplateRead_FieldId>;
186  
187 //********************method index table********************
188 /*
189  * Direct-mapped "method_id_item".
190  */
191 typedef struct  {
192     ushort  classIdx;           /* index into typeIds list for defining class */
193     ushort  protoIdx;           /* index into protoIds for method prototype */
194     uint  nameIdx;            /* index into stringIds for method name */
195 }DexMethodId<read=TemplateRead_MethodId>;
196  
197 //********************Class Define table********************
198  
199 /* expanded form of a class_data_item header */
200 struct DexClassDataHeader {
201     local int64 oldOffset = FTell();
202     local int64 currOffset = oldOffset; 
203     //Printf("oldOffset=%x,",oldOffset);
204     //Printf("currOffset=%x
",currOffset);  
205     local int len = readUnsignedLeb128(currOffset);
206     //Printf("oldOffset=%x,",oldOffset);
207     //Printf("currOffset=%x,",currOffset);
208     //Printf("field size:%x,",currOffset - oldOffset);
209     //Printf("size:%x
",len);
210     switch(currOffset - oldOffset)
211     {
212         case 1: ubyte staticFieldsSize<comment="uleb128 staticFieldsSize">; break;
213         case 2: ushort staticFieldsSize<comment="uleb128 staticFieldsSize">; break;
214         case 3: ubyte staticFieldsSize[3]<comment="uleb128 staticFieldsSize">; break;
215         case 4: uint staticFieldsSize<comment="uleb128 staticFieldsSize">; break;
216         case 5: ubyte staticFieldsSize[5]<comment="uleb128 staticFieldsSize">; break;
217     }   
218      
219     oldOffset = FTell();
220     currOffset = oldOffset;
221     //Printf("*******************************
");
222     //Printf("oldOffset=%x,",oldOffset);
223     //Printf("currOffset=%x
",currOffset);  
224     len = readUnsignedLeb128(currOffset);
225     //Printf("oldOffset=%x,",oldOffset);
226     //Printf("currOffset=%x,",currOffset);
227     //Printf("field size:%x,",currOffset - oldOffset);
228     //Printf("size:%x
",len);
229     switch(currOffset - oldOffset)
230     {
231         case 1: ubyte instanceFieldsSize<comment="uleb128 instanceFieldsSize">; break;
232         case 2: ushort instanceFieldsSize<comment="uleb128 instanceFieldsSize">; break;
233         case 3: ubyte instanceFieldsSize[3]<comment="uleb128 instanceFieldsSize">; break;
234         case 4: uint instanceFieldsSize<comment="uleb128 instanceFieldsSize">; break;
235         case 5: ubyte instanceFieldsSize[5]<comment="uleb128 instanceFieldsSize">; break;
236     }       
237  
238  
239     oldOffset = FTell();
240     currOffset = oldOffset;
241     //Printf("*******************************
");
242     //Printf("oldOffset=%x,",oldOffset);
243     //Printf("currOffset=%x
",currOffset);  
244     len = readUnsignedLeb128(currOffset);
245     //Printf("oldOffset=%x,",oldOffset);
246     //Printf("currOffset=%x,",currOffset);
247     //Printf("field size:%x,",currOffset - oldOffset);
248     //Printf("size:%x
",len);
249     switch(currOffset - oldOffset)
250     {
251         case 1: ubyte directMethodsSize<comment="uleb128 directMethodsSize">; break;
252         case 2: ushort directMethodsSize<comment="uleb128 directMethodsSize">; break;
253         case 3: ubyte directMethodsSize[3]<comment="uleb128 directMethodsSize">; break;
254         case 4: uint directMethodsSize<comment="uleb128 directMethodsSize">; break;
255         case 5: ubyte directMethodsSize[5]<comment="uleb128 directMethodsSize">; break;
256     }       
257      
258     oldOffset = FTell();
259     currOffset = oldOffset;
260     //Printf("*******************************
");
261     //Printf("oldOffset=%x,",oldOffset);
262     //Printf("currOffset=%x
",currOffset);  
263     len = readUnsignedLeb128(currOffset);
264     //Printf("oldOffset=%x,",oldOffset);
265     //Printf("currOffset=%x,",currOffset);
266     //Printf("field size:%x,",currOffset - oldOffset);
267     //Printf("size:%x
",len);
268     switch(currOffset - oldOffset)
269     {
270         case 1: ubyte virtualMethodsSize<comment="uleb128 virtualMethodsSize">; break;
271         case 2: ushort virtualMethodsSize<comment="uleb128 virtualMethodsSize">; break;
272         case 3: ubyte virtualMethodsSize[3]<comment="uleb128 virtualMethodsSize">; break;
273         case 4: uint virtualMethodsSize<comment="uleb128 virtualMethodsSize">; break;
274         case 5: ubyte virtualMethodsSize[5]<comment="uleb128 virtualMethodsSize">; break;
275     }           
276 };
277  
278 /* expanded form of encoded_field */
279 struct DexField {
280     uint fieldIdx;    /* index to a field_id_item */
281     uint accessFlags;
282 };
283  
284 /* expanded form of encoded_method */
285 struct DexMethod {
286     uint methodIdx;    /* index to a method_id_item */
287     uint accessFlags;
288     uint codeOff;      /* file offset to a code_item */
289 };
290  
291 /* expanded form of class_data_item. Note: If a particular item is
292  * absent (e.g., no static fields), then the corresponding pointer
293  * is set to NULL. */
294 struct DexClassData {
295     DexClassDataHeader header;
296  
297     local int64 oldOffset = FTell();
298     local int64 currOffset = oldOffset; 
299     //Printf("oldOffset=%x,",oldOffset);
300     //Printf("currOffset=%x
",currOffset);  
301     local int len = readUnsignedLeb128(currOffset);
302     //Printf("oldOffset=%x,",oldOffset);
303     //Printf("currOffset=%x,",currOffset);
304     //Printf("field size:%x,",currOffset - oldOffset);
305     //Printf("size:%x
",len);
306     switch(currOffset - oldOffset)
307     {
308         case 1: ubyte staticFields<comment="uleb128 staticFields">; break;
309         case 2: ushort staticFields<comment="uleb128 staticFields">; break;
310         case 3: ubyte staticFields[3]<comment="uleb128 staticFields">; break;
311         case 4: uint staticFields<comment="uleb128 staticFields">; break;
312         case 5: ubyte staticFields[5]<comment="uleb128 staticFields">; break;
313     }
314  
315     oldOffset = FTell();
316     currOffset = oldOffset; 
317     //Printf("oldOffset=%x,",oldOffset);
318     //Printf("currOffset=%x
",currOffset);  
319     len = readUnsignedLeb128(currOffset);
320     //Printf("oldOffset=%x,",oldOffset);
321     //Printf("currOffset=%x,",currOffset);
322     //Printf("field size:%x,",currOffset - oldOffset);
323     //Printf("size:%x
",len);
324     switch(currOffset - oldOffset)
325     {
326         case 1: ubyte instanceFields<comment="uleb128 instanceFields">; break;
327         case 2: ushort instanceFields<comment="uleb128 instanceFields">; break;
328         case 3: ubyte instanceFields[3]<comment="uleb128 instanceFields">; break;
329         case 4: uint instanceFields<comment="uleb128 instanceFields">; break;
330         case 5: ubyte instanceFields[5]<comment="uleb128 instanceFields">; break;
331     }
332  
333     oldOffset = FTell();
334     currOffset = oldOffset; 
335     //Printf("oldOffset=%x,",oldOffset);
336     //Printf("currOffset=%x
",currOffset);  
337     len = readUnsignedLeb128(currOffset);
338     //Printf("oldOffset=%x,",oldOffset);
339     //Printf("currOffset=%x,",currOffset);
340     //Printf("field size:%x,",currOffset - oldOffset);
341     //Printf("size:%x
",len);
342     switch(currOffset - oldOffset)
343     {
344         case 1: ubyte directMethods<comment="uleb128 directMethods">; break;
345         case 2: ushort directMethods<comment="uleb128 directMethods">; break;
346         case 3: ubyte directMethods[3]<comment="uleb128 directMethods">; break;
347         case 4: uint directMethods<comment="uleb128 directMethods">; break;
348         case 5: ubyte directMethods[5]<comment="uleb128 directMethods">; break;
349     }
350      
351     oldOffset = FTell();
352     currOffset = oldOffset; 
353     //Printf("oldOffset=%x,",oldOffset);
354     //Printf("currOffset=%x
",currOffset);  
355     len = readUnsignedLeb128(currOffset);
356     //Printf("oldOffset=%x,",oldOffset);
357     //Printf("currOffset=%x,",currOffset);
358     //Printf("field size:%x,",currOffset - oldOffset);
359     //Printf("size:%x
",len);
360     switch(currOffset - oldOffset)
361     {
362         case 1: ubyte virtualMethods<comment="uleb128 virtualMethods">; break;
363         case 2: ushort virtualMethods<comment="uleb128 virtualMethods">; break;
364         case 3: ubyte virtualMethods[3]<comment="uleb128 virtualMethods">; break;
365         case 4: uint virtualMethods<comment="uleb128 virtualMethods">; break;
366         case 5: ubyte virtualMethods[5]<comment="uleb128 virtualMethods">; break;
367     }   
368     //DexField*          staticFields;  
369     //DexField*          instanceFields;
370     //DexMethod*         directMethods;
371     //DexMethod*         virtualMethods;
372 };
373  
374 /*
375  * Direct-mapped "class_def_item".
376  */
377 typedef struct  {
378     uint  classIdx;           /* index into typeIds for this class */
379     AccessFlags  accessFlags;
380     uint  superclassIdx;      /* index into typeIds for superclass */
381     uint  interfacesOff;      /* file offset to DexTypeList */
382     if(interfacesOff > 0 && interfacesOff != 0xFFFFFFFF)
383     {
384         local int64 oldOffset = FTell(); 
385         FSeek(interfacesOff);   
386         DexTypeList typeList_Interfaces;
387         FSeek(oldOffset); 
388     }
389     uint  sourceFileIdx;      /* index into stringIds for source file name */
390     uint  annotationsOff;     /* file offset to annotations_directory_item */
391     uint  classDataOff;       /* file offset to class_data_item */
392     if(classDataOff > 0 && classDataOff != 0xFFFFFFFF)
393     {
394         local int64 oldOff = FTell(); 
395         FSeek(classDataOff);   
396         DexClassData dexClassData;
397         FSeek(oldOff);
398     }
399     uint  staticValuesOff;    /* file offset to DexEncodedArray */
400     if(staticValuesOff > 0)
401     {
402         local int64 offset = FTell(); 
403         FSeek(staticValuesOff);   
404         //
405         FSeek(offset);
406     }
407 }DexClassDef<read=TemplateRead_ClassDefs>;
408  
409 /*
410  * Direct-mapped "annotations_directory_item".
411  */
412 struct DexAnnotationsDirectoryItem {
413     uint  classAnnotationsOff;  /* offset to DexAnnotationSetItem */
414     uint  fieldsSize;           /* count of DexFieldAnnotationsItem */
415     uint  methodsSize;          /* count of DexMethodAnnotationsItem */
416     uint  parametersSize;       /* count of DexParameterAnnotationsItem */
417     /* followed by DexFieldAnnotationsItem[fieldsSize] */
418     /* followed by DexMethodAnnotationsItem[methodsSize] */
419     /* followed by DexParameterAnnotationsItem[parametersSize] */
420 };
421  
422 void Dump_DexHeader(int64 startOffset)
423 {   
424     local int64 oldOffset = FTell();
425     FSeek(startOffset);
426     DexHeader dexHdr;
427     FSeek(oldOffset);
428  
429     Printf("file size: 0x%x
", dexHdr.fileSize);
430     Printf("file header size: 0x%x
", dexHdr.headerSize);
431     Printf("strings count: %d
", dexHdr.stringIdsSize);
432     Printf("types count: %d
", dexHdr.typeIdsSize);
433     Printf("proto count: %d
", dexHdr.protoIdsSize);
434     Printf("fields count: %d
", dexHdr.fieldIdsSize);
435     Printf("methods count: %d
", dexHdr.methodIdsSize);
436     Printf("classDefs count: %d
", dexHdr.classDefsSize);
437     Printf("data size count: %d
", dexHdr.dataSize);
438     Printf("mapOff: 0x%x
", dexHdr.mapOff);
439 }
440  
441 void Dump_MapList(int64 startOffset)
442 {
443     local int64 oldOffset = FTell();
444     FSeek(startOffset);
445     DexMapList mapList;
446     FSeek(oldOffset);  
447 }
448  
449  
450 void Dump_StringItems(int64 startOffset)
451 {
452     local int64 oldOffset = FTell();
453     FSeek(startOffset);
454     DexStringId dexStringId[dexHdr.stringIdsSize];
455     FSeek(oldOffset);  
456 }
457  
458 void Dump_TypeItems(int64 startOffset)
459 {
460     local int64 oldOffset = FTell();
461     FSeek(startOffset);
462     DexTypeId dexTypeId[dexHdr.typeIdsSize];
463     FSeek(oldOffset);  
464 }
465  
466 void Dump_ProtoItems(int64 startOffset)
467 {
468     local int64 oldOffset = FTell();
469     FSeek(startOffset);
470     DexProtoId dexProtoId[dexHdr.protoIdsSize]<optimize=true>;   
471  
472     FSeek(oldOffset);
473 }
474  
475 void Dump_FieldItems(int64 startOffset)
476 {
477     local int64 oldOffset = FTell();
478     FSeek(startOffset);  
479     DexFieldId dexFieldId[dexHdr.fieldIdsSize];
480     FSeek(oldOffset);
481 }
482  
483 void Dump_MethodItems(int64 startOffset)
484 {
485     local int64 oldOffset = FTell();
486     FSeek(startOffset);  
487     DexMethodId dexMethodId[dexHdr.methodIdsSize];
488     FSeek(oldOffset);
489 }
490  
491 void Dump_ClassDef(int64 startOffset)
492 {
493     local int64 oldOffset = FTell();
494     FSeek(startOffset);  
495     DexClassDef dexClassDef[dexHdr.classDefsSize]<optimize=false>;
496     FSeek(oldOffset);
497 }
498  
499 int readUnsignedLeb128(int64 &streamPos)
500 {   
501     local int result = ReadUByte(streamPos);// read first byte
502   streamPos++;
503    
504     if (result > 0x7f)
505   {
506         local int cur = ReadUByte(streamPos);   //read second byte
507     streamPos++;
508         result = (result & 0x7f) | ((cur & 0x7f) << 7);
509         if (cur > 0x7f)
510     {
511             cur = ReadUByte(streamPos);     //read third byte
512       streamPos++;
513             result |= (cur & 0x7f) << 14;
514             if (cur > 0x7f)
515       {
516                 cur = ReadUByte(streamPos); //read fourth byte
517         streamPos++;
518                 result |= (cur & 0x7f) << 21;
519                 if (cur > 0x7f)
520         {
521                     /*
522                      * Note: We don't check to see if cur is out of
523                      * range here, meaning we tolerate garbage in the
524                      * high four-order bits.
525                      */
526                     cur = ReadUByte(streamPos); //read fifth byte
527           streamPos++;
528                     result |= cur << 28;
529                 }
530             }
531         }
532     }
533      
534     return result;
535 }
536  
537 //display checker value
538 string TemplateRead_StringId(DexStringId &stringId)
539 {   
540     local string str = "";
541     local int64 offset = stringId.stringDataOff;
542     local int strLen = readUnsignedLeb128(offset); //--->>>Warning,only pause one string
543     str = ReadString(offset); 
544      
545     return str;
546 }
547  
548 string TemplateRead_TypeId(DexTypeId &typeId )
549 {   
550     local string str = "";
551     local int64 offset = dexStringId[typeId.descriptorIdx].stringDataOff;
552     local int strLen = readUnsignedLeb128(offset);
553     str = ReadString(offset);
554     str = TemplateRead_StringId(dexStringId[typeId.descriptorIdx]);
555     return str;
556 }
557  
558 string TemplateRead_ProtoId(DexProtoId &protoId )
559 {   
560     local int64 oldOffset = FTell();  
561     local string str = "";
562     local int i = 0, count = 0;
563     local short typeIdx = -1;
564      
565     if(protoId.parametersOff > 0)
566     {
567         local string method = TemplateRead_StringId(dexStringId[protoId.shortyIdx]);
568         local string retType = TemplateRead_TypeId(dexTypeId[protoId.returnTypeIdx]);
569         local string params = "";
570  
571         count = ReadInt(protoId.parametersOff);
572         while(i < count)
573         {
574             typeIdx = ReadShort(protoId.parametersOff + sizeof(int) +
575                             i * sizeof(short));
576             params += TemplateRead_TypeId(dexTypeId[typeIdx]);
577             i++;
578              
579             //function args delimiter
580             //if(i < count)
581                 //params += " , ";
582         }      
583          
584         //join: return + method + args
585         SPrintf(str, "<%s%s(%s)>",retType, method, params);
586     }   
587      
588     FSeek(oldOffset);
589     return str;
590 }
591  
592 string TemplateRead_FieldId(DexFieldId &fieldId)
593 {
594     local string classTypeName = "";
595     local string fieldTypeName = "";
596     local string fieldName = "";
597     local string result = "";
598  
599     classTypeName = TemplateRead_TypeId(dexTypeId[fieldId.classIdx]);
600     fieldTypeName = TemplateRead_TypeId(dexTypeId[fieldId.typeIdx]);
601     fieldName = TemplateRead_StringId(dexStringId[fieldId.nameIdx]);
602     result = classTypeName + "@" + fieldTypeName + "@" + fieldName;
603  
604     return result;
605 }
606  
607 string TemplateRead_MethodId(DexMethodId &methodId)
608 {
609     local string result = "";
610     local string classTypeName = "";
611     local string protoTypeName = "";
612     local string methodName = "";
613      
614     classTypeName = TemplateRead_TypeId(dexTypeId[methodId.classIdx]);
615     protoTypeName = TemplateRead_ProtoId(dexProtoId[methodId.protoIdx]);
616     methodName = TemplateRead_StringId(dexStringId[methodId.nameIdx]);
617     result = classTypeName + "@" + protoTypeName + "@" + methodName;
618  
619     return result;
620 }
621  
622 string TemplateRead_ClassDefs(DexClassDef &classDef)
623 {
624     local string result = "";
625     local string classTypeName = "";
626     local string superClassTypeName = "";
627     local string protoTypeName = "";
628     local string methodName = "";
629      
630      
631  
632     return result;
633 }
634  
635 string TemplateRead_TypeList(DexTypeList &typeList)
636 {
637     local string result = "", temp = "";
638     //local int i = 0;
639     //local int len = typeList.size;
640     //while(i < len)
641     //{
642         //SPrintf(temp, "%d,", typeList.list[i].typeIdx);
643         //typeList.list[i].typeIdx;
644         //dexTypeId[typeList.list[i].typeIdx];
645         //result += TemplateRead_TypeId(dexTypeId[typeList.list[i].typeIdx]);
646          
647         //SPrintf(temp, "index=%d,", i);
648         //result += temp;
649        // i++;
650     //}
651     //SPrintf(result, "size=%d", typeList.size);
652     return result;
653 }
654 //-------------------------->>>   start running   <<<--------------------------
655 Dump_DexHeader(0);
656 Dump_MapList(dexHdr.mapOff);
657 Dump_StringItems(dexHdr.stringIdsOff);
658 Dump_TypeItems(dexHdr.typeIdsOff);
659 Dump_ProtoItems(dexHdr.protoIdsOff);
660 Dump_FieldItems(dexHdr.fieldIdsOff);
661 Dump_MethodItems(dexHdr.methodIdsOff);
662 Dump_ClassDef(dexHdr.classDefsOff);
原文地址:https://www.cnblogs.com/udld/p/6780568.html