mirror of https://github.com/x64dbg/btparser
1292 lines
35 KiB
Plaintext
1292 lines
35 KiB
Plaintext
1:
|
|
2:
|
|
3:
|
|
4:
|
|
5:
|
|
6:
|
|
7:
|
|
8:
|
|
9:
|
|
10:
|
|
11:
|
|
12: local ushort method_offsets [ 256 ] ;
|
|
13: local ushort method_codesize [ 256 ] ;
|
|
14: local uint64 tail_index = 0 ;
|
|
15: local uint64 head_index = 0 ;
|
|
16:
|
|
17: void queue_push_method ( ushort offset , ushort codesize ) {
|
|
18: method_offsets [ tail_index ] = offset ;
|
|
19: method_codesize [ tail_index ] = codesize ;
|
|
20: tail_index ++ ;
|
|
21: }
|
|
22:
|
|
23: uint queue_pop_method ( ) {
|
|
24: if ( head_index != tail_index ) {
|
|
25: head_index ++ ;
|
|
26: return 1 ;
|
|
27: } else {
|
|
28: return 0 ;
|
|
29: }
|
|
30: }
|
|
31:
|
|
32: uint queue_peek_method ( ) {
|
|
33: if ( head_index != tail_index ) {
|
|
34: return 1 ;
|
|
35: } else {
|
|
36: return 0 ;
|
|
37: }
|
|
38: }
|
|
39:
|
|
40: typedef enum < short > {
|
|
41: COMP_STORED = 0 ,
|
|
42: COMP_SHRUNK = 1 ,
|
|
43: COMP_REDUCED1 = 2 ,
|
|
44: COMP_REDUCED2 = 3 ,
|
|
45: COMP_REDUCED3 = 4 ,
|
|
46: COMP_REDUCED4 = 5 ,
|
|
47: COMP_IMPLODED = 6 ,
|
|
48: COMP_TOKEN = 7 ,
|
|
49: COMP_DEFLATE = 8 ,
|
|
50: COMP_DEFLATE64 = 9
|
|
51: } COMPTYPE ;
|
|
52:
|
|
53: typedef enum < uchar > {
|
|
54: aaload = 0x24 ,
|
|
55: aastore = 0x37 ,
|
|
56: aconst_null = 0x1 ,
|
|
57: aload = 0x15 ,
|
|
58: aload_0 = 0x18 ,
|
|
59: aload_1 = 0x19 ,
|
|
60: aload_2 = 0x1A ,
|
|
61: aload_3 = 0x1B ,
|
|
62: anewarray = 0x91 ,
|
|
63: areturn = 0x77 ,
|
|
64: arraylength = 0x92 ,
|
|
65: astore = 0x28 ,
|
|
66: astore_0 = 0x2B ,
|
|
67: astore_1 = 0x2C ,
|
|
68: astore_2 = 0x2D ,
|
|
69: astore_3 = 0x2E ,
|
|
70: athrow = 0x93 ,
|
|
71: baload = 0x25 ,
|
|
72: bastore = 0x38 ,
|
|
73: bipush = 0x12 ,
|
|
74: bspush = 0x10 ,
|
|
75: checkcast = 0x94 ,
|
|
76: dup = 0x3D ,
|
|
77: dup_x = 0x3F ,
|
|
78: dup2 = 0x3E ,
|
|
79: getfield_a = 0x83 ,
|
|
80: getfield_b = 0x84 ,
|
|
81: getfield_s = 0x85 ,
|
|
82: getfield_i = 0x86 ,
|
|
83: getfield_a_this = 0xAD ,
|
|
84: getfield_b_this = 0xAE ,
|
|
85: getfield_s_this = 0xAF ,
|
|
86: getfield_i_this = 0xB0 ,
|
|
87: getfield_a_w = 0xA9 ,
|
|
88: getfield_b_w = 0xAA ,
|
|
89: getfield_s_w = 0xAB ,
|
|
90: getfield_i_w = 0xAC ,
|
|
91: getstatic_a = 0x7B ,
|
|
92: getstatic_b = 0x7C ,
|
|
93: getstatic_s = 0x7D ,
|
|
94: getstatic_i = 0x7E ,
|
|
95: goto = 0x70 ,
|
|
96: goto_w = 0xA8 ,
|
|
97: i2b = 0x5D ,
|
|
98: i2s = 0x5E ,
|
|
99: iadd = 0x42 ,
|
|
100: iaload = 0x27 ,
|
|
101: iand = 0x54 ,
|
|
102: iastore = 0x3A ,
|
|
103: icmp = 0x5F ,
|
|
104: iconst_m1 = 0x9 ,
|
|
105: iconst_0 = 0xA ,
|
|
106: iconst_1 = 0xB ,
|
|
107: iconst_2 = 0xC ,
|
|
108: iconst_3 = 0xD ,
|
|
109: iconst_4 = 0xE ,
|
|
110: iconst_5 = 0xF ,
|
|
111: idiv = 0x48 ,
|
|
112: if_acmpeq = 0x68 ,
|
|
113: if_acmpne = 0x69 ,
|
|
114: if_acmpeq_w = 0xA0 ,
|
|
115: if_acmpne_w = 0xA1 ,
|
|
116: if_scmpeq = 0x6A ,
|
|
117: if_scmpne = 0x6B ,
|
|
118: if_scmplt = 0x6C ,
|
|
119: if_scmpge = 0x6D ,
|
|
120: if_scmpgt = 0x6E ,
|
|
121: if_scmple = 0x6F ,
|
|
122: if_scmpeq_w = 0xA2 ,
|
|
123: if_scmpne_w = 0xA3 ,
|
|
124: if_scmplt_w = 0xA4 ,
|
|
125: if_scmpge_w = 0xA5 ,
|
|
126: if_scmpgt_w = 0xA6 ,
|
|
127: if_scmple_w = 0xA7 ,
|
|
128: ifeq = 0x60 ,
|
|
129: ifne = 0x61 ,
|
|
130: iflt = 0x62 ,
|
|
131: ifge = 0x63 ,
|
|
132: ifgt = 0x64 ,
|
|
133: ifle = 0x65 ,
|
|
134: ifeq_w = 0x98 ,
|
|
135: ifne_w = 0x99 ,
|
|
136: iflt_w = 0x9A ,
|
|
137: ifge_w = 0x9B ,
|
|
138: ifgt_w = 0x9C ,
|
|
139: ifle_w = 0x9D ,
|
|
140: ifnonnull = 0x67 ,
|
|
141: ifnonnull_w = 0x9F ,
|
|
142: ifnull = 0x66 ,
|
|
143: ifnull_w = 0x9E ,
|
|
144: iinc = 0x5A ,
|
|
145: iinc_w = 0x97 ,
|
|
146: iipush = 0x14 ,
|
|
147: iload = 0x17 ,
|
|
148: iload_0 = 0x20 ,
|
|
149: iload_1 = 0x21 ,
|
|
150: iload_2 = 0x22 ,
|
|
151: iload_3 = 0x23 ,
|
|
152: ilookupswitch = 0x76 ,
|
|
153: imul = 0x46 ,
|
|
154: ineg = 0x4C ,
|
|
155: instanceof = 0x95 ,
|
|
156: invokeinterface = 0x8E ,
|
|
157: invokespecial = 0x8C ,
|
|
158: invokestatic = 0x8D ,
|
|
159: invokevirtual = 0x8B ,
|
|
160: ior = 0x56 ,
|
|
161: irem = 0x4A ,
|
|
162: ireturn = 0x79 ,
|
|
163: ishl = 0x4E ,
|
|
164: ishr = 0x50 ,
|
|
165: istore = 0x2A ,
|
|
166: istore_0 = 0x33 ,
|
|
167: istore_1 = 0x34 ,
|
|
168: istore_2 = 0x35 ,
|
|
169: istore_3 = 0x36 ,
|
|
170: isub = 0x44 ,
|
|
171: itableswitch = 0x74 ,
|
|
172: iushr = 0x52 ,
|
|
173: ixor = 0x58 ,
|
|
174: jsr = 0x71 ,
|
|
175: new = 0x8F ,
|
|
176: newarray = 0x90 ,
|
|
177: nop = 0 ,
|
|
178: pop = 0x3B ,
|
|
179: pop2 = 0x3C ,
|
|
180: putfield_a = 0x87 ,
|
|
181: putfield_b = 0x88 ,
|
|
182: putfield_s = 0x89 ,
|
|
183: putfield_i = 0x8A ,
|
|
184: putfield_a_this = 0xB5 ,
|
|
185: putfield_b_this = 0xB6 ,
|
|
186: putfield_s_this = 0xB7 ,
|
|
187: putfield_i_this = 0xB8 ,
|
|
188: putfield_a_w = 0xB1 ,
|
|
189: putfield_b_w = 0xB2 ,
|
|
190: putfield_s_w = 0xB3 ,
|
|
191: putfield_i_w = 0xB4 ,
|
|
192: putstatic_a = 0x7F ,
|
|
193: putstatic_b = 0x80 ,
|
|
194: putstatic_s = 0x81 ,
|
|
195: putstatic_i = 0x82 ,
|
|
196: ret = 0x72 ,
|
|
197: Return = 0x7A ,
|
|
198: s2b = 0x5B ,
|
|
199: s2i = 0x5C ,
|
|
200: sadd = 0x41 ,
|
|
201: saload = 0x46 ,
|
|
202: sand = 0x53 ,
|
|
203: sastore = 0x39 ,
|
|
204: sconst_m1 = 0x2 ,
|
|
205: sconst_0 = 0x3 ,
|
|
206: sconst_1 = 0x4 ,
|
|
207: sconst_2 = 0x5 ,
|
|
208: sconst_3 = 0x6 ,
|
|
209: sconst_4 = 0x7 ,
|
|
210: sconst_5 = 0x8 ,
|
|
211: sdiv = 0x47 ,
|
|
212: sinc = 0x59 ,
|
|
213: sinc_w = 0x96 ,
|
|
214: sipush = 0x13 ,
|
|
215: sload = 0x16 ,
|
|
216: sload_0 = 0x1C ,
|
|
217: sload_1 = 0x1D ,
|
|
218: sload_2 = 0x1E ,
|
|
219: sload_3 = 0x1F ,
|
|
220: slookupswitch = 0x75 ,
|
|
221: smul = 0x45 ,
|
|
222: sneg = 0x4B ,
|
|
223: sor = 0x55 ,
|
|
224: srem = 0x49 ,
|
|
225: sreturn = 0x78 ,
|
|
226: sshl = 0x4D ,
|
|
227: sshr = 0x4F ,
|
|
228: sspush = 0x11 ,
|
|
229: sstore = 0x29 ,
|
|
230: sstore_0 = 0x2F ,
|
|
231: sstore_1 = 0x30 ,
|
|
232: sstore_2 = 0x31 ,
|
|
233: sstore_3 = 0x32 ,
|
|
234: ssub = 0x43 ,
|
|
235: stableswitch = 0x73 ,
|
|
236: sushr = 0x51 ,
|
|
237: swap_x = 0x40 ,
|
|
238: sxor = 0x57
|
|
239: } JVCODE ;
|
|
240:
|
|
241: typedef struct {
|
|
242: char minor_version ;
|
|
243: char major_version ;
|
|
244: char AID_length ;
|
|
245: if ( AID_length > 0 )
|
|
246: char AID [ AID_length ] ;
|
|
247: } PACKAGE_INFO ;
|
|
248:
|
|
249: typedef struct {
|
|
250: char name_length ;
|
|
251: if ( name_length > 0 )
|
|
252: char name [ name_length ] ;
|
|
253: } PACKAGE_NAME_INFO ;
|
|
254:
|
|
255: typedef struct {
|
|
256: ushort image_size ;
|
|
257: ushort array_init_count ;
|
|
258: ushort array_init_size ;
|
|
259: } STATIC_FIELD_SIZE_INFO ;
|
|
260:
|
|
261: typedef struct {
|
|
262: uchar component_tag ;
|
|
263: ushort size ;
|
|
264: uchar AID_length ;
|
|
265: if ( AID_length > 0 )
|
|
266: char AID [ AID_length ] ;
|
|
267: } CUSTOM_COMPONENT_INFO ;
|
|
268:
|
|
269: typedef struct {
|
|
270: char tag ;
|
|
271: ushort size ;
|
|
272: uint magic ;
|
|
273: uchar minor_version ;
|
|
274: uchar major_version ;
|
|
275: uchar flags ;
|
|
276: PACKAGE_INFO package ;
|
|
277: PACKAGE_NAME_INFO package_name ;
|
|
278: } HEADER_COMPONENT ;
|
|
279:
|
|
280: typedef struct {
|
|
281: uchar tag ;
|
|
282: ushort size ;
|
|
283: ushort component_sizes [ 12 ] ;
|
|
284: STATIC_FIELD_SIZE_INFO static_field_size ;
|
|
285: uchar import_count ;
|
|
286: uchar applet_count ;
|
|
287: uchar custom_count ;
|
|
288: if ( custom_count > 0 )
|
|
289: CUSTOM_COMPONENT_INFO custom_components [ custom_count ] ;
|
|
290: } DIRECTORY_COMPONENT ;
|
|
291:
|
|
292: typedef struct {
|
|
293: uchar AID_length ;
|
|
294: if ( AID_length > 0 )
|
|
295: char AID [ AID_length ] ;
|
|
296: ushort install_method_offset ;
|
|
297: } APPLET_INFO ;
|
|
298:
|
|
299: typedef struct {
|
|
300: uchar tag ;
|
|
301: ushort size ;
|
|
302: uchar count ;
|
|
303: if ( count > 0 )
|
|
304: APPLET_INFO applets [ count ] < optimize = false > ;
|
|
305: } APPLET_COMPONENT ;
|
|
306:
|
|
307: typedef struct {
|
|
308: uchar tag ;
|
|
309: ushort size ;
|
|
310: uchar count ;
|
|
311: if ( count > 0 )
|
|
312: PACKAGE_INFO packages [ count ] < optimize = false > ;
|
|
313: } IMPORT_COMPONENT ;
|
|
314:
|
|
315: typedef struct {
|
|
316: uchar nibble_count ;
|
|
317: if ( nibble_count > 0 )
|
|
318: uchar type [ ( nibble_count + 1 ) / 2 ] ;
|
|
319: } TYPE_DESCRIPTOR ;
|
|
320:
|
|
321: typedef struct {
|
|
322: if ( ReadByte ( FTell ( ) ) & 0x80 ) {
|
|
323: ushort internal_class_ref ;
|
|
324: } else {
|
|
325: uchar package_token ;
|
|
326: uchar class_token ;
|
|
327: }
|
|
328: } CLASS_REF ;
|
|
329:
|
|
330: typedef struct {
|
|
331: uchar interface_name_length ;
|
|
332: if ( interface_name_length > 0 )
|
|
333: uchar interface_name [ interface_name_length ] ;
|
|
334: } INTERFACE_NAME_INFO ;
|
|
335:
|
|
336: typedef struct {
|
|
337: CLASS_REF interface ;
|
|
338: uchar count ;
|
|
339: if ( count > 0 )
|
|
340: uchar index [ count ] ;
|
|
341: } IMPLEMENTED_INTERFACE_INFO ;
|
|
342:
|
|
343: typedef struct {
|
|
344: ushort remote_method_hash ;
|
|
345: ushort signature_offset ;
|
|
346: uchar virtual_method_token ;
|
|
347: } REMOTE_METHOD_INFO ;
|
|
348:
|
|
349: typedef struct {
|
|
350: uchar tag ;
|
|
351: CLASS_REF class_ref ;
|
|
352: uchar padding ;
|
|
353: } CONST_CLASSREF_INFO ;
|
|
354:
|
|
355: typedef struct {
|
|
356: uchar tag ;
|
|
357: CLASS_REF class ;
|
|
358: uchar token ;
|
|
359: } CONST_INSTANCEFIELDREF_INFO ;
|
|
360:
|
|
361: typedef struct {
|
|
362: uchar tag ;
|
|
363: CLASS_REF class ;
|
|
364: uchar token ;
|
|
365: } CONST_VIRTUALMETHODREF_INFO ;
|
|
366:
|
|
367: typedef struct {
|
|
368: uchar tag ;
|
|
369: CLASS_REF class ;
|
|
370: uchar token ;
|
|
371: } CONST_SUPERMETHODREF_INFO ;
|
|
372:
|
|
373: typedef struct {
|
|
374: if ( ReadByte ( FTell ( ) ) == 0 ) {
|
|
375: uchar padding ;
|
|
376: ushort offset ;
|
|
377: } else {
|
|
378: uchar package_token ;
|
|
379: uchar class_token ;
|
|
380: uchar token ;
|
|
381: }
|
|
382: } STATIC_FIELD_REF ;
|
|
383:
|
|
384: typedef struct {
|
|
385: CLASS_REF class ;
|
|
386: uchar token ;
|
|
387: } INSTANCE_FIELD_REF ;
|
|
388:
|
|
389: typedef struct {
|
|
390: if ( ReadByte ( FTell ( ) ) == 0 ) {
|
|
391: uchar padding ;
|
|
392: ushort offset ;
|
|
393: } else {
|
|
394: uchar package_token ;
|
|
395: uchar class_token ;
|
|
396: uchar token ;
|
|
397: }
|
|
398: } STATIC_METHOD_REF ;
|
|
399:
|
|
400: typedef struct {
|
|
401: uchar tag ;
|
|
402: STATIC_FIELD_REF static_field_ref ;
|
|
403: } CONST_STATICFIELDREF_INFO ;
|
|
404:
|
|
405: typedef struct {
|
|
406: uchar tag ;
|
|
407: STATIC_METHOD_REF static_method_ref ;
|
|
408: } CONST_STATICMETHODREF_INFO ;
|
|
409:
|
|
410: typedef struct {
|
|
411: uchar remote_methods_count ;
|
|
412: if ( remote_methods_count > 0 )
|
|
413: REMOTE_METHOD_INFO remote_methods [ remote_methods_count ] < optimize = false > ;
|
|
414: uchar hash_modifier_length ;
|
|
415: if ( hash_modifier_length > 0 )
|
|
416: uchar hash_modifier [ hash_modifier_length ] < optimize = false > ;
|
|
417: uchar class_name_length ;
|
|
418: if ( class_name_length > 0 )
|
|
419: uchar class_name [ class_name_length ] < optimize = false > ;
|
|
420: uchar remote_interface_count ;
|
|
421: if ( remote_interface_count > 0 )
|
|
422: CLASS_REF remote_interfaces [ remote_interface_count ] < optimize = false > ;
|
|
423: } REMOTE_INTERFACE_INFO ;
|
|
424:
|
|
425: typedef struct {
|
|
426:
|
|
427: uchar flags : 4 ;
|
|
428: uchar interface_count : 4 ;
|
|
429: CLASS_REF super_class_ref ;
|
|
430: uchar declared_instance_size ;
|
|
431: uchar first_reference_token ;
|
|
432: uchar reference_count ;
|
|
433: uchar public_method_table_base ;
|
|
434: uchar public_method_table_count ;
|
|
435: uchar package_method_table_base ;
|
|
436: uchar package_method_table_count ;
|
|
437: if ( public_method_table_count > 0 )
|
|
438: ushort public_virtual_method_table [ public_method_table_count ] < optimize = false > ;
|
|
439: if ( package_method_table_count > 0 )
|
|
440: ushort package_virtual_method_table [ package_method_table_count ] < optimize = false > ;
|
|
441: if ( interface_count > 0 )
|
|
442: IMPLEMENTED_INTERFACE_INFO interfaces [ interface_count ] < optimize = false > ;
|
|
443: if ( flags & 0x2 )
|
|
444: REMOTE_INTERFACE_INFO remote_interfaces ;
|
|
445: } CLASS_INFO ;
|
|
446:
|
|
447: typedef struct {
|
|
448:
|
|
449: uchar flags : 4 ;
|
|
450: uchar interface_count : 4 ;
|
|
451: if ( interface_count > 0 )
|
|
452: CLASS_REF super_interfaces [ interface_count ] < optimize = false > ;
|
|
453: if ( flags & 0x2 )
|
|
454: INTERFACE_NAME_INFO interface_name ;
|
|
455: } INTERFACE_INFO ;
|
|
456:
|
|
457: typedef struct {
|
|
458: uchar tag ;
|
|
459: ushort size ;
|
|
460: local uint64 start_index = FTell ( ) ;
|
|
461: ushort signature_pool_length ;
|
|
462: local uint64 sign_index = FTell ( ) ;
|
|
463: if ( signature_pool_length > 0 ) {
|
|
464:
|
|
465: while ( FTell ( ) < ( sign_index + signature_pool_length ) ) {
|
|
466: TYPE_DESCRIPTOR descriptor ;
|
|
467: }
|
|
468: }
|
|
469:
|
|
470:
|
|
471: while ( FTell ( ) < ( start_index + size ) ) {
|
|
472: if ( ( ReadByte ( FTell ( ) ) & 0x80 ) ) {
|
|
473:
|
|
474: INTERFACE_INFO interface ;
|
|
475: } else {
|
|
476:
|
|
477: CLASS_INFO class ;
|
|
478: }
|
|
479: }
|
|
480: } CLASS_COMPONENT ;
|
|
481:
|
|
482: typedef struct {
|
|
483: uchar type ;
|
|
484: ushort count ;
|
|
485: uchar values [ count ] ;
|
|
486: } ARRAY_INIT_INFO ;
|
|
487:
|
|
488: typedef struct {
|
|
489: uchar tag ;
|
|
490: ushort size ;
|
|
491: ushort image_size ;
|
|
492: ushort reference_count ;
|
|
493: ushort array_init_count ;
|
|
494: if ( array_init_count > 0 )
|
|
495: ARRAY_INIT_INFO array_init [ array_init_count ] < optimize = false > ;
|
|
496: ushort default_value_count ;
|
|
497: ushort non_default_value_count ;
|
|
498: if ( non_default_value_count > 0 )
|
|
499: uchar non_default_values [ non_default_value_count ] < optimize = false > ;
|
|
500: } STATICFIELD_COMPONENT ;
|
|
501:
|
|
502: typedef struct {
|
|
503: uchar tag ;
|
|
504: ushort size ;
|
|
505: ushort byte_index_count ;
|
|
506: uchar offsets_to_byte_indices [ byte_index_count ] ;
|
|
507: ushort byte2_index_count ;
|
|
508: uchar offsets_to_byte2_indices [ byte2_index_count ] ;
|
|
509: } REFERENCELOC_COMPONENT ;
|
|
510:
|
|
511: typedef struct {
|
|
512: uchar tag ;
|
|
513: ushort size ;
|
|
514: uchar class_count ;
|
|
515: struct {
|
|
516: ushort class_offset ;
|
|
517: uchar static_field_count ;
|
|
518: uchar static_method_count ;
|
|
519: ushort static_field_offsets [ static_field_count ] ;
|
|
520: ushort static_method_offsets [ static_method_count ] ;
|
|
521: } class_exports [ class_count ] < optimize = false > ;
|
|
522: } EXPORT_COMPONENT ;
|
|
523:
|
|
524: typedef struct {
|
|
525: ushort start_offset ;
|
|
526:
|
|
527: ushort stop_bit : 1 ;
|
|
528: ushort active_length : 15 ;
|
|
529: ushort handler_offset ;
|
|
530: ushort catch_type_index ;
|
|
531: } EXCEPTION_HANDLER_INFO ;
|
|
532:
|
|
533: typedef struct {
|
|
534: uchar flags : 4 ;
|
|
535: uchar max_stack : 4 ;
|
|
536: uchar nargs : 4 ;
|
|
537: uchar max_locals : 4 ;
|
|
538: } METHOD_HEADER_INFO ;
|
|
539:
|
|
540: typedef struct {
|
|
541: uchar flags : 4 ;
|
|
542: uchar padding : 4 ;
|
|
543: uchar max_stack ;
|
|
544: uchar nargs ;
|
|
545: uchar max_locals ;
|
|
546: } EXTENDED_METHOD_HEADER_INFO ;
|
|
547:
|
|
548: typedef struct {
|
|
549: JVCODE opcode ;
|
|
550:
|
|
551: switch ( opcode ) {
|
|
552: case aaload :
|
|
553: case aastore :
|
|
554: case aconst_null :
|
|
555: case aload_0 :
|
|
556: case aload_1 :
|
|
557: case aload_2 :
|
|
558: case aload_3 :
|
|
559: case areturn :
|
|
560: case arraylength :
|
|
561: case astore_0 :
|
|
562: case astore_1 :
|
|
563: case astore_2 :
|
|
564: case astore_3 :
|
|
565: case athrow :
|
|
566: case baload :
|
|
567: case bastore :
|
|
568: case dup :
|
|
569: case dup2 :
|
|
570: case i2b :
|
|
571: case i2s :
|
|
572: case iadd :
|
|
573: case iaload :
|
|
574: case iand :
|
|
575: case iastore :
|
|
576: case icmp :
|
|
577: case iconst_m1 :
|
|
578: case iconst_0 :
|
|
579: case iconst_1 :
|
|
580: case iconst_2 :
|
|
581: case iconst_3 :
|
|
582: case iconst_4 :
|
|
583: case iconst_5 :
|
|
584: case idiv :
|
|
585: case iload_0 :
|
|
586: case iload_1 :
|
|
587: case iload_2 :
|
|
588: case iload_3 :
|
|
589: case imul :
|
|
590: case ineg :
|
|
591: case ior :
|
|
592: case irem :
|
|
593: case ireturn :
|
|
594: case ishl :
|
|
595: case ishr :
|
|
596: case istore_0 :
|
|
597: case istore_1 :
|
|
598: case istore_2 :
|
|
599: case istore_3 :
|
|
600: case isub :
|
|
601: case iushr :
|
|
602: case ixor :
|
|
603: case nop :
|
|
604: case pop :
|
|
605: case pop2 :
|
|
606: case Return :
|
|
607: case s2b :
|
|
608: case s2i :
|
|
609: case sadd :
|
|
610: case saload :
|
|
611: case sand :
|
|
612: case sastore :
|
|
613: case sconst_m1 :
|
|
614: case sconst_0 :
|
|
615: case sconst_1 :
|
|
616: case sconst_2 :
|
|
617: case sconst_3 :
|
|
618: case sconst_4 :
|
|
619: case sconst_5 :
|
|
620: case sdiv :
|
|
621: case sload_0 :
|
|
622: case sload_1 :
|
|
623: case sload_2 :
|
|
624: case sload_3 :
|
|
625: case smul :
|
|
626: case sneg :
|
|
627: case sor :
|
|
628: case srem :
|
|
629: case sreturn :
|
|
630: case sshl :
|
|
631: case sshr :
|
|
632: case sstore_0 :
|
|
633: case sstore_1 :
|
|
634: case sstore_2 :
|
|
635: case sstore_3 :
|
|
636: case ssub :
|
|
637: case sushr :
|
|
638: case sxor :
|
|
639:
|
|
640: break ;
|
|
641: case aload :
|
|
642: case astore :
|
|
643: case bipush :
|
|
644: case bspush :
|
|
645: case dup_x :
|
|
646: case getfield_a :
|
|
647: case getfield_b :
|
|
648: case getfield_s :
|
|
649: case getfield_i :
|
|
650: case getfield_a_this :
|
|
651: case getfield_b_this :
|
|
652: case getfield_s_this :
|
|
653: case getfield_i_this :
|
|
654: case goto :
|
|
655: case if_acmpeq :
|
|
656: case if_acmpne :
|
|
657: case if_scmpeq :
|
|
658: case if_scmpne :
|
|
659: case if_scmplt :
|
|
660: case if_scmpge :
|
|
661: case if_scmpgt :
|
|
662: case if_scmple :
|
|
663: case ifeq :
|
|
664: case ifne :
|
|
665: case iflt :
|
|
666: case ifge :
|
|
667: case ifgt :
|
|
668: case ifle :
|
|
669: case ifnonnull :
|
|
670: case ifnull :
|
|
671: case iload :
|
|
672: case istore :
|
|
673: case newarray :
|
|
674: case putfield_a :
|
|
675: case putfield_b :
|
|
676: case putfield_s :
|
|
677: case putfield_i :
|
|
678: case putfield_a_this :
|
|
679: case putfield_b_this :
|
|
680: case putfield_s_this :
|
|
681: case putfield_i_this :
|
|
682: case ret :
|
|
683: case sload :
|
|
684: case sstore :
|
|
685: case swap_x :
|
|
686: uchar operand1 ;
|
|
687: break ;
|
|
688: case anewarray :
|
|
689: case getfield_a_w :
|
|
690: case getfield_b_w :
|
|
691: case getfield_s_w :
|
|
692: case getfield_i_w :
|
|
693: case getstatic_a :
|
|
694: case getstatic_b :
|
|
695: case getstatic_s :
|
|
696: case getstatic_i :
|
|
697: case goto_w :
|
|
698: case if_acmpeq_w :
|
|
699: case if_acmpne_w :
|
|
700: case if_scmpeq_w :
|
|
701: case if_scmpne_w :
|
|
702: case if_scmplt_w :
|
|
703: case if_scmpge_w :
|
|
704: case if_scmpgt_w :
|
|
705: case if_scmple_w :
|
|
706: case ifeq_w :
|
|
707: case ifne_w :
|
|
708: case iflt_w :
|
|
709: case ifge_w :
|
|
710: case ifgt_w :
|
|
711: case ifle_w :
|
|
712: case ifnonnull_w :
|
|
713: case ifnull_w :
|
|
714: case invokespecial :
|
|
715: case invokestatic :
|
|
716: case invokevirtual :
|
|
717: case jsr :
|
|
718: case new :
|
|
719: case putfield_a_w :
|
|
720: case putfield_b_w :
|
|
721: case putfield_s_w :
|
|
722: case putfield_i_w :
|
|
723: case putstatic_a :
|
|
724: case putstatic_b :
|
|
725: case putstatic_s :
|
|
726: case putstatic_i :
|
|
727: case sipush :
|
|
728: case sspush :
|
|
729: ushort operand1 ;
|
|
730: break ;
|
|
731: case checkcast :
|
|
732: case iinc_w :
|
|
733: case instanceof :
|
|
734: case sinc_w :
|
|
735: uchar operand1 ;
|
|
736: ushort operand2 ;
|
|
737: break ;
|
|
738: case iinc :
|
|
739: case sinc :
|
|
740: uchar operand1 ;
|
|
741: uchar operand2 ;
|
|
742: break ;
|
|
743: case iipush :
|
|
744: uint operand1 ;
|
|
745: break ;
|
|
746: case invokeinterface :
|
|
747: uchar args ;
|
|
748: ushort index ;
|
|
749: uchar method ;
|
|
750: break ;
|
|
751: case ilookupswitch :
|
|
752: ushort default_offset ;
|
|
753: ushort pairs ;
|
|
754: local ushort index = 0 ;
|
|
755: if ( pairs > 0 ) {
|
|
756: while ( index < pairs ) {
|
|
757: struct {
|
|
758: uint match ;
|
|
759: ushort offset ;
|
|
760: } imo_pairs ;
|
|
761: index ++ ;
|
|
762: }
|
|
763: }
|
|
764: break ;
|
|
765: case itableswitch :
|
|
766: ushort default_offset ;
|
|
767: uint low ;
|
|
768: uint high ;
|
|
769: if ( ( high - low ) > 0 )
|
|
770: ushort offsets [ high - low ] ;
|
|
771: break ;
|
|
772: case slookupswitch :
|
|
773: ushort default_offset ;
|
|
774: ushort pairs ;
|
|
775: local ushort index = 0 ;
|
|
776: if ( pairs > 0 ) {
|
|
777: while ( index < pairs ) {
|
|
778: struct {
|
|
779: ushort match ;
|
|
780: ushort offset ;
|
|
781: } imo_pairs ;
|
|
782: index ++ ;
|
|
783: }
|
|
784: }
|
|
785: break ;
|
|
786: case stableswitch :
|
|
787: ushort default_offset ;
|
|
788: ushort low ;
|
|
789: ushort high ;
|
|
790: if ( ( high - low ) > 0 )
|
|
791: ushort offsets [ high - low ] ;
|
|
792: break ;
|
|
793: default : break ;
|
|
794: }
|
|
795: } JAVA_OPCODE < read = ReadJavaOpcode , optimize = false > ;
|
|
796:
|
|
797: local uint64 start_bytecode = 0 ;
|
|
798: string ReadJavaOpcode ( JAVA_OPCODE & code ) {
|
|
799:
|
|
800: return EnumToString ( code . opcode ) ;
|
|
801: }
|
|
802:
|
|
803: typedef struct {
|
|
804: uchar tag ;
|
|
805: ushort size ;
|
|
806: local uint64 start_index = FTell ( ) ;
|
|
807: local uint64 handler_size = FTell ( ) - start_index ;
|
|
808:
|
|
809: local uint64 start_method = FTell ( ) ;
|
|
810: start_bytecode = start_method ;
|
|
811: uchar handler_count ;
|
|
812: if ( handler_count > 0 )
|
|
813: EXCEPTION_HANDLER_INFO exception_handlers [ handler_count ] < optimize = false > ;
|
|
814:
|
|
815:
|
|
816:
|
|
817:
|
|
818: while ( head_index != tail_index ) {
|
|
819: FSeek ( start_method + method_offsets [ head_index ] ) ;
|
|
820: struct {
|
|
821: if ( ( ReadByte ( FTell ( ) ) & 0x80 ) ) {
|
|
822: EXTENDED_METHOD_HEADER_INFO method_header ;
|
|
823: } else {
|
|
824: METHOD_HEADER_INFO method_header ;
|
|
825: }
|
|
826: start_index = FTell ( ) ;
|
|
827: local uint16 codesize = method_codesize [ head_index ] ;
|
|
828:
|
|
829: if ( codesize != 0 ) {
|
|
830: struct {
|
|
831: while ( FTell ( ) < ( start_index + codesize ) ) {
|
|
832: JAVA_OPCODE code ;
|
|
833: }
|
|
834: } bytecodes ;
|
|
835: }
|
|
836: } methods ;
|
|
837: head_index ++ ;
|
|
838:
|
|
839: }
|
|
840: FSeek ( start_index + size ) ;
|
|
841: } METHOD_COMPONENT ;
|
|
842:
|
|
843: typedef struct {
|
|
844: uchar tag ;
|
|
845: uchar info [ 3 ] ;
|
|
846: } CP_INFO ;
|
|
847:
|
|
848: typedef struct {
|
|
849: uchar tag ;
|
|
850: ushort size ;
|
|
851: ushort count ;
|
|
852: CP_INFO constant_pool [ count ] ;
|
|
853: } CONSTANT_POOL_COMPONENT ;
|
|
854:
|
|
855: typedef struct {
|
|
856: uchar token ;
|
|
857: uchar access_flags ;
|
|
858: if ( access_flags & 0x8 ) {
|
|
859: STATIC_FIELD_REF field_ref ;
|
|
860: } else {
|
|
861: INSTANCE_FIELD_REF field_ref ;
|
|
862: }
|
|
863: union {
|
|
864: ushort primitive_type ;
|
|
865: ushort reference_type ;
|
|
866: } type ;
|
|
867: } FIELD_DESCRIPTOR_INFO ;
|
|
868:
|
|
869: typedef struct {
|
|
870: uchar token ;
|
|
871: uchar access_flags ;
|
|
872: ushort method_offset ;
|
|
873: ushort type_offset ;
|
|
874: ushort bytecode_count ;
|
|
875: ushort exception_handler_count ;
|
|
876: ushort exception_handler_index ;
|
|
877:
|
|
878: if ( bytecode_count > 0 ) {
|
|
879: method_offsets [ tail_index ] = method_offset ;
|
|
880: method_codesize [ tail_index ] = bytecode_count ;
|
|
881: tail_index ++ ;
|
|
882: }
|
|
883: } METHOD_DESCRIPTOR_INFO ;
|
|
884:
|
|
885: typedef struct {
|
|
886: uchar token ;
|
|
887: uchar access_flags ;
|
|
888: CLASS_REF this_class_ref ;
|
|
889: uchar interface_count ;
|
|
890: ushort field_count ;
|
|
891: ushort method_count ;
|
|
892: if ( interface_count > 0 )
|
|
893: CLASS_REF interfaces [ interface_count ] < optimize = false > ;
|
|
894: if ( field_count > 0 )
|
|
895: FIELD_DESCRIPTOR_INFO fields [ field_count ] < optimize = false > ;
|
|
896: if ( method_count > 0 ) {
|
|
897: METHOD_DESCRIPTOR_INFO methods [ method_count ] < optimize = false > ;
|
|
898: }
|
|
899: } CLASS_DESCRIPTOR_INFO ;
|
|
900:
|
|
901: typedef struct {
|
|
902: uchar tag ;
|
|
903: ushort size ;
|
|
904: local uint64 start_index = FTell ( ) ;
|
|
905: uchar class_count ;
|
|
906: if ( class_count > 0 )
|
|
907: CLASS_DESCRIPTOR_INFO classes [ class_count ] < optimize = false > ;
|
|
908:
|
|
909: local uint64 desc_start_index = FTell ( ) ;
|
|
910: struct {
|
|
911: ushort constant_pool_count ;
|
|
912: if ( constant_pool_count > 0 )
|
|
913: ushort constant_pool_types [ constant_pool_count ] ;
|
|
914: while ( FTell ( ) < ( start_index + size ) ) {
|
|
915: TYPE_DESCRIPTOR type_desc ;
|
|
916:
|
|
917: }
|
|
918: } types ;
|
|
919:
|
|
920: } DESCRIPTOR_COMPONENT ;
|
|
921:
|
|
922: typedef struct {
|
|
923: ushort length ;
|
|
924: if ( length > 0 )
|
|
925: uchar bytes [ length ] ;
|
|
926: } UTF8_INFO ;
|
|
927:
|
|
928: typedef struct {
|
|
929: ushort name_index ;
|
|
930: ushort descriptor_index ;
|
|
931: ushort access_flags ;
|
|
932: uint contents ;
|
|
933: } FIELD_DEBUG_INFO ;
|
|
934:
|
|
935: typedef struct {
|
|
936: uchar index ;
|
|
937: ushort name_index ;
|
|
938: ushort descriptor_index ;
|
|
939: ushort start_pc ;
|
|
940: ushort length ;
|
|
941: } VARIABLE_INFO ;
|
|
942:
|
|
943: typedef struct {
|
|
944: ushort start_pc ;
|
|
945: ushort end_pc ;
|
|
946: ushort source_line ;
|
|
947: } LINE_INFO ;
|
|
948:
|
|
949: typedef struct {
|
|
950: ushort name_index ;
|
|
951: ushort descriptor_index ;
|
|
952: ushort access_flags ;
|
|
953: ushort location ;
|
|
954: uchar header_size ;
|
|
955: ushort body_size ;
|
|
956: ushort variable_count ;
|
|
957: ushort line_count ;
|
|
958: if ( variable_count > 0 )
|
|
959: VARIABLE_INFO variable_table [ variable_count ] < optimize = false > ;
|
|
960: if ( line_count > 0 )
|
|
961: LINE_INFO line_table [ line_count ] < optimize = false > ;
|
|
962: } METHOD_DEBUG_INFO ;
|
|
963:
|
|
964: typedef struct {
|
|
965: ushort name_index ;
|
|
966: ushort access_flags ;
|
|
967: ushort location ;
|
|
968: ushort superclass_name_index ;
|
|
969: ushort source_file_index ;
|
|
970: uchar interface_count ;
|
|
971: ushort field_count ;
|
|
972: ushort method_count ;
|
|
973: if ( interface_count > 0 )
|
|
974: ushort interface_names_indexes [ interface_count ] < optimize = false > ;
|
|
975: if ( field_count > 0 )
|
|
976: FIELD_DEBUG_INFO fields [ field_count ] < optimize = false > ;
|
|
977: if ( method_count > 0 )
|
|
978: METHOD_DEBUG_INFO methods [ method_count ] < optimize = false > ;
|
|
979: } CLASS_DEBUG_INFO ;
|
|
980:
|
|
981: typedef struct {
|
|
982: uchar tag ;
|
|
983: ushort size ;
|
|
984: ushort string_count ;
|
|
985: UTF8_INFO strings_table [ string_count ] < optimize = false > ;
|
|
986: ushort package_name_index ;
|
|
987: ushort class_count ;
|
|
988: CLASS_DEBUG_INFO classes [ class_count ] < optimize = false > ;
|
|
989: } DEBUG_COMPONENT ;
|
|
990:
|
|
991:
|
|
992: local uint64 method_comp_offset = 0 ;
|
|
993: local uchar descriptor_comp_decoded = false ;
|
|
994: local uchar method_comp_decoded = false ;
|
|
995: local uint64 current_file_rec_offset = 0 ;
|
|
996: local uint64 next_file_rec_offset = 0 ;
|
|
997: typedef struct {
|
|
998: char signature [ 4 ] ;
|
|
999: ushort version ;
|
|
1000: ushort flags ;
|
|
1001: COMPTYPE mode ;
|
|
1002: if ( mode != COMP_STORED ) return "Not a valid CAP file" ;
|
|
1003: DOSTIME filetime ;
|
|
1004: DOSDATE filedate ;
|
|
1005: uint crc < format = hex > ;
|
|
1006: uint comp_size ;
|
|
1007: uint uncomp_size ;
|
|
1008: ushort filename_length ;
|
|
1009: ushort extrafield_length ;
|
|
1010: if ( filename_length > 0 )
|
|
1011: char filename [ filename_length ] ;
|
|
1012: if ( extrafield_length > 0 )
|
|
1013: uchar extrafield [ extrafield_length ] ;
|
|
1014: } CAPFILEHEADER ;
|
|
1015:
|
|
1016: typedef struct {
|
|
1017:
|
|
1018: CAPFILEHEADER header ;
|
|
1019:
|
|
1020:
|
|
1021: SetBackColor ( cNone ) ;
|
|
1022:
|
|
1023:
|
|
1024: BigEndian ( ) ;
|
|
1025: if ( Stricmp ( FileNameGetBase ( header . filename ) , "header.cap" ) == 0 ) {
|
|
1026: HEADER_COMPONENT header_component ;
|
|
1027: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "directory.cap" ) == 0 ) {
|
|
1028: DIRECTORY_COMPONENT directory_component ;
|
|
1029: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "applet.cap" ) == 0 ) {
|
|
1030: APPLET_COMPONENT applet_component ;
|
|
1031: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "class.cap" ) == 0 ) {
|
|
1032: CLASS_COMPONENT class_component ;
|
|
1033: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "import.cap" ) == 0 ) {
|
|
1034: IMPORT_COMPONENT import_component ;
|
|
1035: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "constantpool.cap" ) == 0 ) {
|
|
1036: CONSTANT_POOL_COMPONENT constantpool_component ;
|
|
1037: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "method.cap" ) == 0 ) {
|
|
1038: METHOD_COMPONENT method_component ;
|
|
1039: method_comp_decoded = true ;
|
|
1040: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "staticfield.cap" ) == 0 ) {
|
|
1041: STATICFIELD_COMPONENT staticfield_component ;
|
|
1042: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "reflocation.cap" ) == 0 ) {
|
|
1043: REFERENCELOC_COMPONENT refloc_component ;
|
|
1044: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "export.cap" ) == 0 ) {
|
|
1045: EXPORT_COMPONENT export_component ;
|
|
1046: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "descriptor.cap" ) == 0 ) {
|
|
1047:
|
|
1048: DESCRIPTOR_COMPONENT descriptor_component ;
|
|
1049: descriptor_comp_decoded = true ;
|
|
1050:
|
|
1051:
|
|
1052: } else if ( Stricmp ( FileNameGetBase ( header . filename ) , "debug.cap" ) == 0 ) {
|
|
1053: DEBUG_COMPONENT debug_component ;
|
|
1054: }
|
|
1055: LittleEndian ( ) ;
|
|
1056: } CAPFILERECORD < read = ReadCAPFILERECORD , write = WriteCAPFILERECORD , size = SizeCAPFILERECORD > ;
|
|
1057:
|
|
1058: int SizeCAPFILERECORD ( CAPFILERECORD & r )
|
|
1059: {
|
|
1060: return 30 +
|
|
1061: ReadUInt ( startof ( r ) + 18 ) +
|
|
1062: ReadUShort ( startof ( r ) + 26 ) +
|
|
1063: ReadUShort ( startof ( r ) + 28 ) ;
|
|
1064: } ;
|
|
1065:
|
|
1066:
|
|
1067: typedef struct {
|
|
1068: char signature [ 4 ] ;
|
|
1069: ushort version_src ;
|
|
1070: ushort version_trgt ;
|
|
1071: ushort flags ;
|
|
1072: COMPTYPE mode ;
|
|
1073: DOSTIME filetime ;
|
|
1074: DOSDATE filedate ;
|
|
1075: uint crc < format = hex > ;
|
|
1076: uint comp_size ;
|
|
1077: uint uncomp_size ;
|
|
1078: ushort filename_length ;
|
|
1079: ushort extrafield_length ;
|
|
1080: ushort comment_length ;
|
|
1081: ushort disknum_start ;
|
|
1082: ushort internal_attr ;
|
|
1083: uint external_attr ;
|
|
1084: uint offset_hdr ;
|
|
1085: if ( filename_length > 0 )
|
|
1086: char filename [ filename_length ] ;
|
|
1087: if ( extrafield_length > 0 )
|
|
1088: uchar extrafield [ extrafield_length ] ;
|
|
1089: if ( comment_length > 0 )
|
|
1090: uchar comment [ comment_length ] ;
|
|
1091: } CAPDIRENTRY < read = ReadCAPDIRENTRY > ;
|
|
1092:
|
|
1093:
|
|
1094: typedef struct {
|
|
1095: char signature [ 4 ] ;
|
|
1096: ushort data_length ;
|
|
1097: if ( data_length > 0 )
|
|
1098: uchar data [ data_length ] ;
|
|
1099: } CAPDIGITALSIG ;
|
|
1100:
|
|
1101:
|
|
1102: typedef struct {
|
|
1103: char signature [ 4 ] ;
|
|
1104: uint crc < format = hex > ;
|
|
1105: uint comp_size ;
|
|
1106: uint uncomp_size ;
|
|
1107: } CAPDATADESCR ;
|
|
1108:
|
|
1109:
|
|
1110: typedef struct {
|
|
1111: char signature [ 4 ] ;
|
|
1112: ushort disknum ;
|
|
1113: ushort disknum_start ;
|
|
1114: ushort disk_entries ;
|
|
1115: ushort directory_entries ;
|
|
1116: uint directory_size ;
|
|
1117: uint directory_offset ;
|
|
1118: ushort comment_length ;
|
|
1119: if ( comment_length > 0 )
|
|
1120: char comment [ comment_length ] ;
|
|
1121: } CAPENDLOCATOR ;
|
|
1122:
|
|
1123:
|
|
1124:
|
|
1125: string ReadCAPFILERECORD ( CAPFILERECORD & file )
|
|
1126: {
|
|
1127: if ( exists ( file . header . filename ) )
|
|
1128: {
|
|
1129: if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "header.cap" ) == 0 ) {
|
|
1130: return "Header" ;
|
|
1131: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "directory.cap" ) == 0 ) {
|
|
1132: return "Directory" ;
|
|
1133: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "applet.cap" ) == 0 ) {
|
|
1134: return "Applet" ;
|
|
1135: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "class.cap" ) == 0 ) {
|
|
1136: return "Class" ;
|
|
1137: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "import.cap" ) == 0 ) {
|
|
1138: return "Import" ;
|
|
1139: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "constantpool.cap" ) == 0 ) {
|
|
1140: return "ConstantPool" ;
|
|
1141: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "method.cap" ) == 0 ) {
|
|
1142: return "Method" ;
|
|
1143: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "staticfield.cap" ) == 0 ) {
|
|
1144: return "StaticField" ;
|
|
1145: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "reflocation.cap" ) == 0 ) {
|
|
1146: return "ReferenceLocation" ;
|
|
1147: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "export.cap" ) == 0 ) {
|
|
1148: return "Export" ;
|
|
1149: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "descriptor.cap" ) == 0 ) {
|
|
1150: return "Descriptor" ;
|
|
1151: } else if ( Stricmp ( FileNameGetBase ( file . header . filename ) , "debug.cap" ) == 0 ) {
|
|
1152: return "Debug" ;
|
|
1153: }
|
|
1154: }
|
|
1155: return "" ;
|
|
1156: }
|
|
1157:
|
|
1158: string ReadCAPDIRENTRY ( CAPDIRENTRY & entry )
|
|
1159: {
|
|
1160: if ( exists ( entry . filename ) )
|
|
1161: {
|
|
1162: if ( Stricmp ( FileNameGetBase ( entry . filename ) , "header.cap" ) == 0 ) {
|
|
1163: return "Header Entry" ;
|
|
1164: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "directory.cap" ) == 0 ) {
|
|
1165: return "Directory Entry" ;
|
|
1166: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "applet.cap" ) == 0 ) {
|
|
1167: return "Applet Entry" ;
|
|
1168: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "class.cap" ) == 0 ) {
|
|
1169: return "Class Entry" ;
|
|
1170: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "import.cap" ) == 0 ) {
|
|
1171: return "Import Entry" ;
|
|
1172: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "constantpool.cap" ) == 0 ) {
|
|
1173: return "ConstantPool Entry" ;
|
|
1174: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "method.cap" ) == 0 ) {
|
|
1175: return "Method Entry" ;
|
|
1176: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "staticfield.cap" ) == 0 ) {
|
|
1177: return "StaticField Entry" ;
|
|
1178: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "reflocation.cap" ) == 0 ) {
|
|
1179: return "ReferenceLocation Entry" ;
|
|
1180: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "export.cap" ) == 0 ) {
|
|
1181: return "Export Entry" ;
|
|
1182: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "descriptor.cap" ) == 0 ) {
|
|
1183: return "Descriptor Entry" ;
|
|
1184: } else if ( Stricmp ( FileNameGetBase ( entry . filename ) , "debug.cap" ) == 0 ) {
|
|
1185: return "Debug Entry" ;
|
|
1186: }
|
|
1187: }
|
|
1188: return "Unknown Entry" ;
|
|
1189: }
|
|
1190:
|
|
1191: void WriteCAPFILERECORD ( CAPFILERECORD & file , string s )
|
|
1192: {
|
|
1193: local int len = Strlen ( s ) ;
|
|
1194: if ( exists ( file . frFileName ) )
|
|
1195: {
|
|
1196: Strncpy ( file . frFileName , s , file . frFileNameLength ) ;
|
|
1197: if ( len < file . frFileNameLength )
|
|
1198: file . frFileName [ len ] = 0 ;
|
|
1199: }
|
|
1200: }
|
|
1201:
|
|
1202:
|
|
1203:
|
|
1204: local uint tag ;
|
|
1205: local ushort filename_len = 0 ;
|
|
1206: local char filename [ ] ;
|
|
1207: LittleEndian ( ) ;
|
|
1208: while ( ! FEof ( ) )
|
|
1209: {
|
|
1210:
|
|
1211: tag = ReadUInt ( FTell ( ) ) ;
|
|
1212:
|
|
1213: if ( tag == 0x4034B50 )
|
|
1214: {
|
|
1215: SetBackColor ( cLtGray ) ;
|
|
1216: current_file_rec_offset = FTell ( ) ;
|
|
1217: filename_len = ReadUShort ( FTell ( ) + 26 ) ;
|
|
1218: filename = ReadString ( FTell ( ) + 0x1E , filename_len ) ;
|
|
1219:
|
|
1220: if ( Stricmp ( FileNameGetBase ( filename ) , "header.cap" ) == 0 ) {
|
|
1221: CAPFILERECORD record ;
|
|
1222: } else if ( Stricmp ( FileNameGetBase ( filename ) , "directory.cap" ) == 0 ) {
|
|
1223: CAPFILERECORD record ;
|
|
1224: } else if ( Stricmp ( FileNameGetBase ( filename ) , "applet.cap" ) == 0 ) {
|
|
1225: CAPFILERECORD record ;
|
|
1226: } else if ( Stricmp ( FileNameGetBase ( filename ) , "class.cap" ) == 0 ) {
|
|
1227: CAPFILERECORD record ;
|
|
1228: } else if ( Stricmp ( FileNameGetBase ( filename ) , "import.cap" ) == 0 ) {
|
|
1229: CAPFILERECORD record ;
|
|
1230: } else if ( Stricmp ( FileNameGetBase ( filename ) , "constantpool.cap" ) == 0 ) {
|
|
1231: CAPFILERECORD record ;
|
|
1232: } else if ( Stricmp ( FileNameGetBase ( filename ) , "method.cap" ) == 0 ) {
|
|
1233:
|
|
1234: method_comp_offset = current_file_rec_offset ;
|
|
1235: if ( descriptor_comp_decoded == true ) {
|
|
1236: CAPFILERECORD record ;
|
|
1237: } else {
|
|
1238: method_comp_decoded = false ;
|
|
1239: local uint64 pk_header_size = 30 + ReadUInt ( FTell ( ) + 18 ) + ReadUShort ( FTell ( ) + 26 ) + ReadUShort ( FTell ( ) + 28 ) ;
|
|
1240:
|
|
1241:
|
|
1242:
|
|
1243: FSeek ( FTell ( ) + pk_header_size ) ;
|
|
1244: }
|
|
1245: } else if ( Stricmp ( FileNameGetBase ( filename ) , "staticfield.cap" ) == 0 ) {
|
|
1246: CAPFILERECORD record ;
|
|
1247: } else if ( Stricmp ( FileNameGetBase ( filename ) , "reflocation.cap" ) == 0 ) {
|
|
1248: CAPFILERECORD record ;
|
|
1249: } else if ( Stricmp ( FileNameGetBase ( filename ) , "export.cap" ) == 0 ) {
|
|
1250: CAPFILERECORD record ;
|
|
1251: } else if ( Stricmp ( FileNameGetBase ( filename ) , "descriptor.cap" ) == 0 ) {
|
|
1252: head_index = 0 ;
|
|
1253: tail_index = 0 ;
|
|
1254: CAPFILERECORD record ;
|
|
1255: next_file_rec_offset = FTell ( ) ;
|
|
1256: if ( method_comp_decoded == false ) {
|
|
1257: FSeek ( method_comp_offset ) ;
|
|
1258: CAPFILERECORD record ;
|
|
1259: FSeek ( next_file_rec_offset ) ;
|
|
1260: }
|
|
1261: } else if ( Stricmp ( FileNameGetBase ( filename ) , "debug.cap" ) == 0 ) {
|
|
1262: CAPFILERECORD record ;
|
|
1263: } else {
|
|
1264: CAPFILERECORD record ;
|
|
1265: }
|
|
1266: }
|
|
1267: else if ( tag == 0x8074B50 )
|
|
1268: {
|
|
1269: SetBackColor ( cLtGreen ) ;
|
|
1270: CAPDATADESCR dataDescr ;
|
|
1271: }
|
|
1272: else if ( tag == 0x2014B50 )
|
|
1273: {
|
|
1274: SetBackColor ( cLtPurple ) ;
|
|
1275: CAPDIRENTRY dirEntry ;
|
|
1276: }
|
|
1277: else if ( tag == 0x5054B50 )
|
|
1278: {
|
|
1279: SetBackColor ( cLtBlue ) ;
|
|
1280: CAPDIGITALSIG digitalSig ;
|
|
1281: }
|
|
1282: else if ( tag == 0x6054B50 )
|
|
1283: {
|
|
1284: SetBackColor ( cLtYellow ) ;
|
|
1285: CAPENDLOCATOR endLocator ;
|
|
1286: }
|
|
1287: else
|
|
1288: {
|
|
1289: Warning ( "Unknown CAP tag encountered. Template stopped." ) ;
|
|
1290: return - 1 ;
|
|
1291: }
|
|
1292: } tok_eof |