1 /* radare - Apache 2.0 - Copyright 2007-2017 - pancake
2    class.h rewrite: Adam Pridgen <dso@rice.edu || adam.pridgen@thecoverofnight.com>
3  */
4 
5 #ifndef _INCLUDE_JAVA_CLASS_H_
6 #define _INCLUDE_JAVA_CLASS_H_
7 
8 #include <r_types.h>
9 #undef U
10 #define U(x) x
11 #include <r_list.h>
12 #include <r_bin.h>
13 #include <sdb.h>
14 #include "dsojson.h"
15 
16 #if defined(_MSC_VER) && !defined(R_API_BIN_ONLY)
17 #undef R_API
18 #define R_API
19 #endif
20 
21 #define USHORT(x,y) ((ut16)(x[y+1]|(x[y]<<8)))
22 #if 1
23 #define UINT(x,y) (ut32)(((x[y]&0xff)<<24) \
24 |  ((x[y+1]&0xff)<<16)  \
25 |  ((x[y+2]&0xff)<<8)   \
26 |  (x[y+3]&0xff))
27 #else
UINT(const ut8 * x,const int y)28 static inline ut32 UINT(const ut8 *x, const int y) {
29 	ut32 ret = 0;
30 	ret  = (x[y]&0xff)   << 24;
31 	ret |= (x[y+1]&0xff) << 16;
32 	ret |= (x[y+2]&0xff) << 8;
33 	ret |= (x[y+3]&0xff);
34 	return ret;
35 }
36 #endif
37 
38 #define R_BIN_JAVA_MAXSTR 256
39 
40 #define R_BIN_JAVA_USHORT(x,y) ((ut16)(((0xff&x[y+1])|((x[y]&0xff)<<8)) & 0xffff))
41 
42 #define R_BIN_JAVA_UINT(x,y) ((ut32)(((x[y]&0xff)<<24)|((x[y+1]&0xff)<<16)|((x[y+2]&0xff)<<8)|(x[y+3]&0xff)))
43 #define R_BIN_JAVA_FLOAT(x,y) ((float)R_BIN_JAVA_UINT(x,y))
44 
45 #define R_BIN_JAVA_LONG(x,y) ( ((ut64) R_BIN_JAVA_UINT (x, y) << 32) | ((ut64)R_BIN_JAVA_UINT (x, y+4) & 0xffffffff))
46 //#define R_BIN_JAVA_DOUBLE(x,y) ((double)RBIN_JAVA_LONG(x,y))
47 //#define R_BIN_JAVA_SWAPUSHORT(x) ((ut16)((x<<8)|((x>>8)&0x00FF)))
48 
49 
50 
51 #define R_BIN_JAVA_DOUBLE(x,y) rbin_java_raw_to_double(x, y)
52 
53 typedef enum {
54 	R_BIN_JAVA_METHOD_ACC_PUBLIC= 0x0001,
55 	R_BIN_JAVA_METHOD_ACC_PRIVATE = 0x0002,
56 	R_BIN_JAVA_METHOD_ACC_PROTECTED = 0x0004,
57 	R_BIN_JAVA_METHOD_ACC_STATIC = 0x0008,
58 
59 	R_BIN_JAVA_METHOD_ACC_FINAL = 0x0010,
60 	R_BIN_JAVA_METHOD_ACC_SYNCHRONIZED = 0x0020,
61 	R_BIN_JAVA_METHOD_ACC_BRIDGE = 0x0040,
62 	R_BIN_JAVA_METHOD_ACC_VARARGS = 0x0080,
63 
64 	R_BIN_JAVA_METHOD_ACC_NATIVE = 0x0100,
65 	R_BIN_JAVA_METHOD_ACC_INTERFACE = 0x0200,
66 	R_BIN_JAVA_METHOD_ACC_ABSTRACT = 0x0400,
67 	R_BIN_JAVA_METHOD_ACC_STRICT= 0x0800,
68 
69 	R_BIN_JAVA_METHOD_ACC_SYNTHETIC = 0x1000,
70 	R_BIN_JAVA_METHOD_ACC_ANNOTATION = 0x2000,
71 	R_BIN_JAVA_METHOD_ACC_ENUM = 0x4000
72 } R_BIN_JAVA_METHOD_ACCESS;
73 
74 typedef enum {
75 	R_BIN_JAVA_FIELD_ACC_PUBLIC= 0x0001,
76 	R_BIN_JAVA_FIELD_ACC_PRIVATE = 0x0002,
77 	R_BIN_JAVA_FIELD_ACC_PROTECTED = 0x0004,
78 	R_BIN_JAVA_FIELD_ACC_STATIC = 0x0008,
79 
80 	R_BIN_JAVA_FIELD_ACC_FINAL = 0x0010,
81 	R_BIN_JAVA_FIELD_ACC_VOLATILE = 0x0040,
82 	R_BIN_JAVA_FIELD_ACC_TRANSIENT = 0x0080,
83 
84 	R_BIN_JAVA_FIELD_ACC_SYNTHETIC = 0x1000,
85 	R_BIN_JAVA_FIELD_ACC_ENUM = 0x4000
86 } R_BIN_JAVA_FIELD_ACCESS;
87 
88 typedef enum {
89 	R_BIN_JAVA_CLASS_ACC_PUBLIC= 0x0001,
90 	R_BIN_JAVA_CLASS_ACC_PRIVATE = 0x0002,
91 	R_BIN_JAVA_CLASS_ACC_PROTECTED = 0x0004,
92 	R_BIN_JAVA_CLASS_ACC_STATIC = 0x0008,
93 
94 	R_BIN_JAVA_CLASS_ACC_FINAL = 0x0010,
95 	R_BIN_JAVA_CLASS_ACC_SUPER = 0x0020,
96 	R_BIN_JAVA_CLASS_ACC_BRIDGE = 0x0040,
97 	R_BIN_JAVA_CLASS_ACC_VARARGS = 0x0080,
98 
99 	R_BIN_JAVA_CLASS_ACC_NATIVE = 0x0100,
100 	R_BIN_JAVA_CLASS_ACC_INTERFACE = 0x0200,
101 	R_BIN_JAVA_CLASS_ACC_ABSTRACT = 0x0400,
102 	R_BIN_JAVA_CLASS_ACC_STRICT= 0x0800,
103 
104 	R_BIN_JAVA_CLASS_ACC_SYNTHETIC = 0x1000,
105 	R_BIN_JAVA_CLASS_ACC_ANNOTATION = 0x2000,
106 	R_BIN_JAVA_CLASS_ACC_ENUM = 0x4000
107 } R_BIN_JAVA_CLASS_ACCESS;
108 
109 typedef struct {
110 	char *str;
111 	ut16 value;
112 	ut8 len;
113 } RBinJavaAccessFlags;
114 
115 typedef enum {
116 	R_BIN_JAVA_REF_UNKNOWN = 0,
117 	R_BIN_JAVA_REF_GETFIELD = 1,
118 	R_BIN_JAVA_REF_GETSTATIC = 2,
119 	R_BIN_JAVA_REF_PUTFIELD = 3,
120 	R_BIN_JAVA_REF_PUTSTATIC = 4,
121 	R_BIN_JAVA_REF_INVOKEVIRTUAL = 5,
122 	R_BIN_JAVA_REF_INVOKESTATIC = 6,
123 	R_BIN_JAVA_REF_INVOKESPECIAL = 7,
124 	R_BIN_JAVA_REF_NEWINVOKESPECIAL = 8,
125 	R_BIN_JAVA_REF_INVOKEINTERFACE = 9
126 } R_BIN_JAVA_REF_TYPE;
127 
128 typedef enum {
129 	R_BIN_JAVA_CP_NULL = 0,
130 	R_BIN_JAVA_CP_UTF8 = 1,
131 	R_BIN_JAVA_CP_UNKNOWN = 2,
132 	R_BIN_JAVA_CP_INTEGER = 3,
133 	R_BIN_JAVA_CP_FLOAT = 4,
134 	R_BIN_JAVA_CP_LONG = 5,
135 	R_BIN_JAVA_CP_DOUBLE = 6,
136 	R_BIN_JAVA_CP_CLASS = 7,
137 	R_BIN_JAVA_CP_STRING = 8,
138 	R_BIN_JAVA_CP_FIELDREF = 9,
139 	R_BIN_JAVA_CP_METHODREF = 10,
140 	R_BIN_JAVA_CP_INTERFACEMETHOD_REF = 11,
141 	R_BIN_JAVA_CP_NAMEANDTYPE = 12,
142 	R_BIN_JAVA_CP_NOTHIN_13 = 13,
143 	R_BIN_JAVA_CP_NOTHIN_14 = 14,
144 	R_BIN_JAVA_CP_METHODHANDLE = 15,
145 	R_BIN_JAVA_CP_METHODTYPE = 16,
146 	R_BIN_JAVA_CP_NOTHIN_17 = 17,
147 	R_BIN_JAVA_CP_INVOKEDYNAMIC = 18,
148 } R_BIN_JAVA_CP_TYPE;
149 
150 typedef enum {
151 	R_BIN_JAVA_STACK_FRAME_IMPLICIT = 0,
152 	R_BIN_JAVA_STACK_FRAME_SAME,
153 	R_BIN_JAVA_STACK_FRAME_SAME_LOCALS_1,
154 	R_BIN_JAVA_STACK_FRAME_CHOP,
155 	R_BIN_JAVA_STACK_FRAME_SAME_FRAME_EXTENDED,
156 	R_BIN_JAVA_STACK_FRAME_APPEND,
157 	R_BIN_JAVA_STACK_FRAME_FULL_FRAME,
158 	R_BIN_JAVA_STACK_FRAME_RESERVED
159 } R_BIN_JAVA_STACK_FRAME_TYPE;
160 
161 typedef enum {
162 	R_BIN_JAVA_ATTR_TYPE_ANNOTATION_DEFAULT_ATTR = 0,
163 	R_BIN_JAVA_ATTR_TYPE_BOOTSTRAP_METHODS_ATTR,
164 	R_BIN_JAVA_ATTR_TYPE_CODE_ATTR,
165 	R_BIN_JAVA_ATTR_TYPE_CONST_VALUE_ATTR,
166 	R_BIN_JAVA_ATTR_TYPE_DEPRECATED_ATTR,
167 	R_BIN_JAVA_ATTR_TYPE_ENCLOSING_METHOD_ATTR,
168 	R_BIN_JAVA_ATTR_TYPE_EXCEPTIONS_ATTR,
169 	R_BIN_JAVA_ATTR_TYPE_INNER_CLASSES_ATTR,
170 	R_BIN_JAVA_ATTR_TYPE_LINE_NUMBER_TABLE_ATTR,
171 	R_BIN_JAVA_ATTR_TYPE_LOCAL_VARIABLE_TABLE_ATTR,
172 	R_BIN_JAVA_ATTR_TYPE_LOCAL_VARIABLE_TYPE_TABLE_ATTR,
173 	R_BIN_JAVA_ATTR_TYPE_RUNTIME_INVISIBLE_ANNOTATION_ATTR,
174 	R_BIN_JAVA_ATTR_TYPE_RUNTIME_INVISIBLE_PARAMETER_ANNOTATION_ATTR,
175 	R_BIN_JAVA_ATTR_TYPE_RUNTIME_VISIBLE_ANNOTATION_ATTR,
176 	R_BIN_JAVA_ATTR_TYPE_RUNTIME_VISIBLE_PARAMETER_ANNOTATION_ATTR,
177 	R_BIN_JAVA_ATTR_TYPE_SIGNATURE_ATTR,
178 	R_BIN_JAVA_ATTR_TYPE_SOURCE_DEBUG_EXTENTSION_ATTR,
179 	R_BIN_JAVA_ATTR_TYPE_SOURCE_FILE_ATTR,
180 	R_BIN_JAVA_ATTR_TYPE_STACK_MAP_TABLE_ATTR,
181 	R_BIN_JAVA_ATTR_TYPE_SYNTHETIC_ATTR,
182 	R_BIN_JAVA_ATTR_TYPE_UNKNOWN_ATTR,
183 	R_BIN_JAVA_ATTR_TYPE_FAILED_ATTR
184 } R_BIN_JAVA_ATTR_TYPE;
185 
186 typedef enum {
187 	R_BIN_JAVA_STACKMAP_TOP = 0,
188 	R_BIN_JAVA_STACKMAP_INTEGER,
189 	R_BIN_JAVA_STACKMAP_FLOAT,
190 	R_BIN_JAVA_STACKMAP_DOUBLE,
191 	R_BIN_JAVA_STACKMAP_LONG,
192 	R_BIN_JAVA_STACKMAP_NULL,
193 	R_BIN_JAVA_STACKMAP_THIS,
194 	R_BIN_JAVA_STACKMAP_OBJECT,
195 	R_BIN_JAVA_STACKMAP_UNINIT,
196 	R_BIN_JAVA_STACKMAP_UNKNOWN
197 } R_BIN_JAVA_STACKMAP_TYPE;
198 
199 typedef enum {
200 	R_BIN_JAVA_FIELD_TYPE_FIELD = 0,
201 	R_BIN_JAVA_FIELD_TYPE_METHOD,
202 	R_BIN_JAVA_FIELD_TYPE_INTERFACE
203 } R_BIN_JAVA_FIELD_TYPE;
204 
205 typedef struct r_bin_java_meta{
206 	ut64  file_offset;
207 	void *type_info;
208 	ut32 ord;
209 }  RBinJavaMetaInfo;
210 
211 /* Class Reference Informations */
212 
213 //struct r_bin_R_BIN_JAVA_CP_ant_t;
214 
215 typedef struct  r_bin_java_class_info_t {
216 	ut16 name_idx;
217 } RBinJavaCPTypeClass;
218 
219 typedef struct  r_bin_java_fieldref_info_t {
220 	ut16 class_idx;
221 	ut16 name_and_type_idx;
222 } RBinJavaCPTypeFieldRef;
223 
224 typedef struct  r_bin_java_methodref_info_t {
225 	ut16 class_idx;
226 	ut16 name_and_type_idx;
227 } RBinJavaCPTypeMethodRef;
228 
229 
230 typedef struct  r_bin_java_interfacemethodref_info_t {
231 	ut16 class_idx;
232 	ut16 name_and_type_idx;
233 } RBinJavaCPTypeInterfaceMethodRef;
234 
235 typedef struct  r_bin_java_methodhandle_info_t {
236 	ut8 reference_kind;
237 	ut16 reference_index;
238 } RBinJavaCPTypeMethodHandle;
239 
240 typedef struct  r_bin_java_methodtype_info_t {
241 	ut16 descriptor_index;
242 } RBinJavaCPTypeMethodType;
243 
244 typedef struct  r_bin_java_invokedynamic_info_t {
245 	ut16 bootstrap_method_attr_index;
246 	ut16 name_and_type_index;
247 } RBinJavaCPTypeInvokeDynamic;
248 
249 /* Primitive Type Informations */
250 
251 typedef struct  r_bin_java_string_info_t {
252 	ut16 string_idx;
253 } RBinJavaCPTypeString;
254 
255 typedef struct  r_bin_java_integer_info_t {
256 	union {
257 		ut8 raw[4];
258 		ut32 dword;
259 	} bytes;
260 
261 } RBinJavaCPTypeInteger;
262 
263 typedef struct  r_bin_java_float_info_t {
264 	union {
265 		ut8 raw[4];
266 		ut32 dword;
267 	} bytes;
268 } RBinJavaCPTypeFloat;
269 
270 
271 typedef struct  r_bin_java_long_info_t {
272 	union {
273 		ut8 raw[8];
274 		ut64 qword;
275 		struct{
276 			ut32 high;
277 			ut32 low;
278 		} dwords;
279 	} bytes;
280 } RBinJavaCPTypeLong;
281 
282 typedef struct  r_bin_java_double_info_t {
283 	union {
284 		ut8 raw[8];
285 		struct{
286 			ut32 high;
287 			ut32 low;
288 		} dwords;
289 	} bytes;
290 } RBinJavaCPTypeDouble;
291 
292 
293 /* Meta-data Info */
294 
295 typedef struct  r_bin_java_name_and_type_info_t {
296 	ut16 name_idx;
297 	ut16 descriptor_idx;
298 } RBinJavaCPTypeNameAndType;
299 
300 typedef struct  r_bin_java_utf8_info_t {
301 	ut16 length;
302 	ut8 *bytes;
303 } RBinJavaCPTypeUtf8;
304 
305 typedef struct  r_bin_java_cp_object_t {
306 	RBinJavaMetaInfo *metas;
307 	ut64 file_offset;
308 	ut8 tag;
309 	union {
310 		RBinJavaCPTypeClass cp_class;
311 		RBinJavaCPTypeMethodRef cp_method;
312 		RBinJavaCPTypeFieldRef cp_field;
313 		RBinJavaCPTypeInterfaceMethodRef cp_interface;
314 
315 		RBinJavaCPTypeString cp_string;
316 		RBinJavaCPTypeInteger cp_integer;
317 		RBinJavaCPTypeFloat cp_float;
318 		RBinJavaCPTypeLong cp_long;
319 		RBinJavaCPTypeDouble cp_double;
320 		RBinJavaCPTypeNameAndType cp_name_and_type;
321 		RBinJavaCPTypeUtf8 cp_utf8;
322 
323 		RBinJavaCPTypeMethodHandle cp_method_handle;
324 		RBinJavaCPTypeMethodType cp_method_type;
325 		RBinJavaCPTypeInvokeDynamic cp_invoke_dynamic;
326 	} info;
327 	char* name;
328 	ut8* value;
329 	ut64 loadaddr;
330 	ut16 idx;
331 } RBinJavaCPTypeObj;
332 
333 typedef struct r_bin_java_stack_map_frame_t { // attribute StackMap
334 	ut64 file_offset;
335 	ut64 size;
336 	ut32 code_offset;
337 	ut8 tag;
338 	ut8 type;
339 
340 	struct r_bin_java_stack_map_frame_t *p_stack_frame;
341 
342 	RBinJavaMetaInfo *metas;
343 	ut32 offset_delta;
344 	ut32 number_of_locals;
345 	// list of verification objects;
346 	RList* local_items;
347 	ut32 number_of_stack_items;
348 	// list of verification objects;
349 	RList* stack_items;
350 
351 } RBinJavaStackMapFrame;
352 
353 typedef struct r_bin_java_source_debugging_extension_attr_t {
354 	ut8* debug_extension;
355 } RBinJavaSourceDebugExtensionAttr;
356 
357 typedef struct r_bin_java_enclosing_method_attr_t {
358 	ut16 class_idx;
359 	ut16 method_idx;
360 	char *class_name;
361 	char *method_name;
362 	char *method_descriptor;
363 } RBinJavaEnclosingMethodAttr;
364 
365 typedef struct r_bin_java_boot_strap_arg_t{
366 	ut64 file_offset;
367 	ut64 size;
368 	ut16 argument_info_idx;
369 	// additional informations?
370 	RBinJavaCPTypeObj *argument_info_cp_obj;
371 } RBinJavaBootStrapArgument;
372 
373 typedef struct r_bin_java_boot_strap_method_t{
374 	ut64 file_offset;
375 	ut64 size;
376 	ut16 bootstrap_method_ref;
377 	ut16 num_bootstrap_arguments;
378 	// List of RBinJavaCodeAttribute
379 	RList *bootstrap_arguments;
380 } RBinJavaBootStrapMethod;
381 
382 
383 typedef struct r_bin_java_boot_strap_methods_t{
384 	ut16 num_bootstrap_methods;
385 	RList *bootstrap_methods;
386 } RBinJavaBootstrapMethodsAttr;
387 
388 
389 typedef struct {
390 	ut16 type_name_idx;
391 	ut16 const_name_idx;
392 	RBinJavaCPTypeObj *const_name_cp_obj;
393 	RBinJavaCPTypeObj *type_name_cp_obj;
394 } RBinJavaEnumConstValue;
395 
396 typedef struct {
397 	ut16 const_value_idx;
398 	RBinJavaCPTypeObj *const_value_cp_obj;
399 } RBinJavaConstValue;
400 
401 typedef struct {
402 	ut16 class_info_idx;
403 	RBinJavaCPTypeObj *class_info_cp_obj;
404 } RBinJavaClassInfoValue;
405 
406 typedef struct r_bin_java_element_value_ary_t{
407 	ut64 size;
408 	ut32 num_values;
409 	RList *values;
410 } RBinJavaElementValueArray;
411 
412 
413 
414 typedef struct r_bin_java_annotation_t{
415 	ut64 size;
416 	ut16 type_idx;
417 	ut16 num_element_value_pairs;
418 	RList *element_value_pairs;
419 } RBinJavaAnnotation;
420 
421 typedef enum {
422 	// Primitive Types
423 	R_BIN_JAVA_EV_TAG_BYTE = 'B',
424 	R_BIN_JAVA_EV_TAG_CHAR = 'C',
425 	R_BIN_JAVA_EV_TAG_DOUBLE = 'D',
426 	R_BIN_JAVA_EV_TAG_FLOAT = 'F',
427 	R_BIN_JAVA_EV_TAG_INT = 'I',
428 	R_BIN_JAVA_EV_TAG_LONG = 'J',
429 	R_BIN_JAVA_EV_TAG_SHORT = 'S',
430 	R_BIN_JAVA_EV_TAG_BOOLEAN = 'Z',
431 	// Other tags
432 	R_BIN_JAVA_EV_TAG_ARRAY = '[',
433 	R_BIN_JAVA_EV_TAG_STRING = 's',
434 	R_BIN_JAVA_EV_TAG_ENUM = 'e',
435 	R_BIN_JAVA_EV_TAG_CLASS = 'c',
436 	R_BIN_JAVA_EV_TAG_ANNOTATION = '@',
437 	//	R_BIN_JAVA_EV_TAG_CLASSNAME = 'L',
438 	R_BIN_JAVA_EV_TAG_UNKNOWN = 0xff,
439 } R_BIN_JAVA_EV_TAG;
440 
441 typedef struct r_bin_java_element_value_t {
442 	RBinJavaMetaInfo *metas;
443 	ut64 size;
444 	ut8 tag;
445 	ut64 file_offset;
446 	union {
447 		RBinJavaConstValue const_value;
448 		RBinJavaEnumConstValue enum_const_value;
449 		RBinJavaClassInfoValue class_value;
450 		RBinJavaAnnotation annotation_value;
451 		RBinJavaElementValueArray array_value;
452 	} value;
453 } RBinJavaElementValue;
454 
455 typedef struct r_bin_java_element_value_pair_t{
456 	ut64 file_offset;
457 	ut64 size;
458 	ut16 element_name_idx;
459 	char* name;
460 	RBinJavaElementValue *value;
461 } RBinJavaElementValuePair;
462 
463 
464 
465 typedef struct r_bin_java_annotations_attr_t {
466 	ut64 size;
467 	ut16 num_annotations;
468 	RList *annotations;
469 } RBinJavaAnnotationsArray;
470 
471 typedef RBinJavaAnnotationsArray RBinJavaRuntimeVisibleAnnotationsAttr;
472 typedef RBinJavaAnnotationsArray RBinJavaRuntimeInvisibleAnnotationsAttr;
473 typedef RBinJavaAnnotationsArray RBinJavaRuntimeParameterAnnotationsArray;
474 
475 typedef struct r_bin_java_parameter_annotation_attr_t {
476 	ut8 num_parameters;
477 	// RBinJavaRuntimeParameterAnnotationsArray
478 	RList *parameter_annotations;
479 } RBinJavaRuntimeVisibleParameterAnnotationsAttr;
480 
481 typedef RBinJavaRuntimeVisibleParameterAnnotationsAttr RBinJavaRuntimeInvisibleParameterAnnotationsAttr;
482 
483 typedef struct r_bin_java_parameter_annotations_attr_t {
484 	RBinJavaElementValue *default_value;
485 } RBinJavaAnnotationDefaultAttr;
486 
487 typedef struct r_bin_java_stack_map_table_attr_t { // attribute StackMap
488 	ut32 code_size;
489 	ut32 number_of_entries;
490 	RList* stack_map_frame_entries;
491 } RBinJavaStackMapTableAttr;
492 
493 
494 typedef struct r_bin_java_signature_attr_t {
495 	ut16 signature_idx;
496 	char *signature;
497 } RBinJavaSignatureAttr;
498 
499 typedef struct r_bin_java_stack_verification_t{
500 	ut64 file_offset;
501 	ut64 size;
502 	ut8 tag;
503 	char *name;
504 	union {
505 		ut16 obj_val_cp_idx;
506 		ut16 uninit_offset;
507 	} info;
508 } RBinJavaVerificationObj;
509 
510 typedef struct r_bin_java_fm_t {
511 	RBinJavaMetaInfo *metas;
512 	ut64 size;
513 	char *name;
514 	char *descriptor;
515 	char *class_name;
516 	char *flags_str;
517 
518 	ut64 file_offset;
519 	R_BIN_JAVA_FIELD_TYPE type;
520 	ut16 flags;
521 	ut16 name_idx;
522 	ut16 descriptor_idx;
523 
524 	RBinJavaCPTypeObj *field_ref_cp_obj;
525 	ut64 attr_offset;
526 	ut16 attr_count;
527 	RList *attributes;
528 	ut64 method_number;
529 } RBinJavaField;
530 
531 typedef struct r_bin_java_interface_info_desc_t{
532 	char *name;
533 	ut64 size;
534 	ut64 file_offset;
535 	ut16 class_info_idx;
536 	RBinJavaCPTypeObj *cp_class;
537 } RBinJavaInterfaceInfo;
538 
539 typedef struct r_bin_java_attr_constant_t {
540 	ut16 constantvalue_idx;
541 } RBinJavaConstantValueAttr;
542 
543 typedef struct r_bin_java_attr_exceptions_t {
544 	ut16 number_of_exceptions;
545 	ut16* exception_idx_table;
546 } RBinJavaExceptionsAttr;
547 
548 typedef struct r_bin_java_attr_exception_table_entry_t {
549 	ut64 file_offset;
550 	ut16 start_pc;
551 	ut16 end_pc;
552 	ut16 handler_pc;
553 	ut16 catch_type;
554 	ut64 size;
555 } RBinJavaExceptionEntry;
556 
557 typedef struct r_bin_java_attr_code_t {
558 	ut64 file_offset;
559 	ut32 code_offset;
560 	ut16 max_stack;
561 	ut16 max_locals;
562 	ut16 code_length;
563 	ut8 *code;
564 
565 	ut32 exception_table_length;
566 	RList *exception_table; // RBinJavaExceptionTableEntry *
567 
568 	ut16 attributes_count;
569 	RList *attributes;
570 	RBinJavaStackMapFrame *implicit_frame;
571 } RBinJavaCodeAttr;
572 
573 typedef struct r_bin_java_attr_inner_classes_t {
574 	ut16 number_of_classes;
575 	RList* classes;
576 } RBinJavaInnerClassesAttribute;
577 
578 typedef struct r_bin_java_attr_source_file_t{
579 	ut16 sourcefile_idx;
580 } RBinJavaSourceFileAttribute;
581 
582 typedef struct r_bin_java_line_number_table_t{
583 	ut64 file_offset;
584 	ut16 start_pc;
585 	ut16 line_number;
586 	ut64 size;
587 } RBinJavaLineNumberAttribute;
588 
589 typedef struct r_bin_java_attr_linenum_t {
590 	ut64 file_offset;
591 	ut16 line_number_table_length;
592 	RList* line_number_table; // RBinJavaLineNumberTable*
593 } RBinJavaLineNumberTableAttribute;
594 
595 typedef struct r_bin_java_attr_localvariabletype_t{
596 	char *name;
597 	char *signature;
598 
599 	ut64 file_offset;
600 	ut16 start_pc;
601 	ut16 length;
602 	ut16 name_idx;
603 	ut16 signature_idx;
604 	ut16 index;
605 	ut64 size;
606 } RBinJavaLocalVariableTypeAttribute;
607 
608 typedef struct r_bin_java_attr_localvariable_type_table_t {
609 	ut16 table_length;
610 	RList* local_variable_table; // RBinJavaLocalVariable
611 } RBinJavaLocalVariableTypeTableAttribute;
612 
613 typedef struct r_bin_java_attr_localvariable_t{
614 	char *name;
615 	char *descriptor;
616 
617 	ut64 file_offset;
618 	ut16 start_pc;
619 	ut16 length;
620 	ut16 name_idx;
621 	ut16 descriptor_idx;
622 	ut16 index;
623 	ut64 size;
624 } RBinJavaLocalVariableAttribute;
625 
626 
627 typedef struct r_bin_java_attr_localvariable_table_t {
628 	ut16 table_length;
629 	RList* local_variable_table; // RBinJavaLocalVariable
630 } RBinJavaLocalVariableTableAttribute;
631 
632 typedef struct r_bin_java_attr_t {
633 	ut8 *bytes;
634 	ut64 pos;
635 	ut64 size;
636 	char *name;
637 	ut64 file_offset;
638 	RBinJavaMetaInfo *metas;
639 	int type;
640 	ut16 name_idx; //	ut16 attribute_name_idx;
641 	ut32 length;   //ut16 attribute_length;
642 	ut64 loadaddr;
643 	bool is_attr_in_old_format;
644 	union {
645 		RBinJavaAnnotationDefaultAttr annotation_default_attr;
646 		RBinJavaBootstrapMethodsAttr bootstrap_methods_attr;
647 		RBinJavaCodeAttr code_attr;
648 		RBinJavaConstantValueAttr constant_value_attr;
649 		RBinJavaEnclosingMethodAttr enclosing_method_attr;
650 		RBinJavaExceptionsAttr exceptions_attr;
651 		RBinJavaLineNumberTableAttribute line_number_table_attr;
652 		RBinJavaLocalVariableTableAttribute local_variable_table_attr;
653 		RBinJavaLocalVariableTypeTableAttribute local_variable_type_table_attr;
654 		RBinJavaInnerClassesAttribute inner_classes_attr;
655 
656 		RBinJavaAnnotationsArray annotation_array;
657 		RBinJavaRuntimeVisibleAnnotationsAttr rtv_annotations_attr;
658 		RBinJavaRuntimeInvisibleAnnotationsAttr rti_annotations_attr;
659 
660 		RBinJavaRuntimeVisibleParameterAnnotationsAttr rtvp_annotations_attr;
661 		RBinJavaRuntimeInvisibleParameterAnnotationsAttr rtip_annotations_attr;
662 		RBinJavaSourceDebugExtensionAttr debug_extensions;
663 		RBinJavaSourceFileAttribute source_file_attr;
664 		RBinJavaStackMapTableAttr stack_map_table_attr;
665 		RBinJavaSignatureAttr signature_attr;
666 
667 	} info;
668 
669 } RBinJavaAttrInfo;
670 
671 typedef struct r_bin_java_attr_classes_t {
672 	char *name;
673 	char *flags_str;
674 	ut64 file_offset;
675 	RBinJavaAttrInfo *clint_attr;
676 	RBinJavaField *clint_field;
677 	ut16 inner_class_info_idx;
678 	ut16 outer_class_info_idx;
679 	ut16 inner_name_idx;
680 	ut16 inner_class_access_flags;
681 	ut64 size;
682 } RBinJavaClassesAttribute;
683 
684 typedef struct r_bin_java_classfile_t {
685 	ut8 cafebabe[4];
686 	ut8 minor[2];
687 	ut8 major[2];
688 	ut16 cp_count;
689 } RBinJavaClass;
690 
691 typedef struct r_bin_java_classfile2_t {
692 	ut16 access_flags;
693 	char *flags_str;
694 	char *this_class_name;
695 	ut16 this_class;
696 	ut16 super_class;
697 	ut16 cf2_size;
698 	RBinJavaField *this_class_entrypoint;
699 	RBinJavaAttrInfo *this_class_entrypoint_code_attr;
700 } RBinJavaClass2;
701 
702 typedef struct r_bin_java_lines_t {
703 	int count;
704 	int *addr;
705 	int *line;
706 } RBinJavaLines;
707 
708 typedef struct r_bin_java_obj_t {
709 	struct r_bin_java_classfile_t cf;
710 	RBinJavaClass2 cf2;
711 	const char *lang;
712 
713 	ut64 cp_offset, fields_offset, interfaces_offset;
714 	ut64 classes_offset, methods_offset, attrs_offset;
715 	ut32 cp_size, cp_count;
716 	ut32 fields_size, fields_count;
717 	ut32 interfaces_size, interfaces_count;
718 	ut32 methods_size, methods_count;
719 	ut32 classes_size, classes_count;
720 	ut32 attrs_size, attrs_count;
721 
722 	ut64 loadaddr; // load address that is used to calc actual offset
723 				// when multiple bins are loaded at once
724 	int size;
725 	int calc_size;
726 	char* file;
727 	RBinJavaLines lines;
728 
729 	// These state variables are used for parsing the appropriate number of bytes
730 	// when readin uoffset, ustack, ulocalvar values
731 	ut8 ulocalvar_sz;
732 	ut8 ustack_sz;
733 	ut8 offset_sz;
734 	ut32 cur_method_code_length;
735 	RBinJavaAttrInfo *current_code_attr;
736 
737 	ut32 attr_idx;
738 	ut32 method_idx;
739 	ut32 field_idx;
740 	ut32 cp_idx;
741 	ut32 interface_idx;
742 	ut32 attributes_idx;
743 
744 	//ut32 classes_idx; //TODO: when classes list is being used, update this value
745 
746 	int fsym;
747 	int fsymsz;
748 
749 	RBinJavaField *main;
750 	RBinJavaAttrInfo *main_code_attr;
751 
752 	RBinJavaField *entrypoint;
753 	RBinJavaAttrInfo *entrypoint_code_attr;
754 
755 	//RList* classes_list; // TODO: Not sure if this is necessary.  it would be the inner classes info.
756 	RList* fields_list;
757 	RList* methods_list;
758 	RList* cp_list;
759 	RList* interfaces_list;
760 	RList* attrs_list;
761 	RList* imports_list;
762 
763 	RList* functions;
764 	RList* disassembly;
765 
766 	Sdb *kv;
767 	Sdb *AllJavaBinObjs;
768 	ut32 id;
769 
770 	RStrConstPool constpool;
771 } RBinJavaObj;
772 
773 R_API RList * U(r_bin_java_get_interface_names)(RBinJavaObj * bin);
774 R_API RBinJavaCPTypeObj* U(r_bin_java_get_item_from_cp)(RBinJavaObj *bin, int i);
775 R_API RBinJavaCPTypeObj* r_bin_java_get_item_from_bin_cp_list(RBinJavaObj *bin, ut64 idx);
776 R_API ut8 * r_bin_java_cp_get_idx_bytes(RBinJavaObj *bin, ut16 idx, ut32 *out_sz);
777 R_API RList * r_bin_java_get_lib_names(RBinJavaObj * bin);
778 R_API RList* r_bin_java_get_sections(RBinJavaObj *bin);
779 R_API RList* r_bin_java_get_fields(RBinJavaObj *bin);
780 R_API char* r_bin_java_get_version(RBinJavaObj* bin);
781 R_API RBinAddr * r_bin_java_get_entrypoint(RBinJavaObj* bin, int sym);
782 R_API RList* r_bin_java_get_entrypoints(RBinJavaObj* bin);
783 R_API ut64 r_bin_java_get_main(RBinJavaObj* bin);
784 R_API RList* r_bin_java_get_symbols(RBinJavaObj* bin);
785 R_API RList* r_bin_java_get_strings(RBinJavaObj* bin);
786 R_API void* r_bin_java_free(RBinJavaObj* bin);
787 R_API RBinJavaObj* r_bin_java_new(const char* file, ut64 baddr, Sdb * kv);
788 R_API RBinJavaObj* r_bin_java_new_buf(RBuffer* buf, ut64 baddr, Sdb * kv);
789 R_API int r_bin_java_valid_class(const ut8 *buf, ut64 buf_sz);
790 
791 // Stuff used to manage Java Class File Constant Information
792 typedef struct r_bin_java_object_allocs_t {
793 	RBinJavaCPTypeObj *(*new_obj) (RBinJavaObj *bin, ut8* buffer, ut64 offset) ;
794 	void (*delete_obj) (void /*RBinJavaCPTypeObj*/ *obj);
795 	void (*print_summary) (RBinJavaCPTypeObj *obj);
796 	ut64 (*calc_size) (RBinJavaCPTypeObj *obj);
797 	char* (*stringify_obj) (RBinJavaCPTypeObj *obj);
798 } RBinJavaCPTypeObjectAllocs;
799 
800 typedef struct r_bin_java_attr_allocs_t {
801 	//void (*new_obj) (RBinJavaObj *bin, RBinJavaAttrInfo *obj, ut64 offset) ;
802 	RBinJavaAttrInfo* (*new_obj)(RBinJavaObj *bin, ut8* buffer, ut64 sz, ut64 buf_offset);
803 	void (*delete_obj) (void /*RBinJavaAttrInfo*/ *obj);
804 	void (*print_summary) (RBinJavaAttrInfo *obj);
805 	ut64 (*calc_size)(RBinJavaAttrInfo *obj);
806 } RBinJavaAttrInfoObjectAllocs;
807 
808 typedef struct r_bin_java_ver_allocs_t {
809 	void (*new_obj) (RBinJavaObj *bin, ut32 code_length, ut64 offset) ;
810 	void (*delete_obj) (void /*RBinJavaAttrInfo*/ *obj);
811 	void (*print_summary) (RBinJavaAttrInfo *obj);
812 } RBinJavaVerInfoObjectAllocs;
813 
814 typedef struct r_bin_java_stack_frame_allocs_t {
815 	RBinJavaStackMapFrame* (*new_obj) (RBinJavaObj *bin, ut64 offset) ;
816 	void (*delete_obj) (void /* RBinJavaStackMapFrame*/ *obj);
817 	void (*print_summary) (RBinJavaStackMapFrame *obj);
818 } RBinJavaStackMapFrameObjectAllocs;
819 
820 typedef struct {
821 	RBinJavaElementValue* (*new_obj) (RBinJavaObj *bin, ut64 offset) ;
822 	void (*delete_obj) (void /*RBinJavaElementValue*/ *obj);
823 	void (*print_summary) (RBinJavaElementValue *obj);
824 } RBinJavaElementValueObjectAllocs;
825 
826 typedef struct r_bin_R_BIN_JAVA_CP_ant_meta_t {
827 	char *name;
828 	ut8 tag;
829 	ut32 len;
830 	RBinJavaCPTypeObjectAllocs *allocs;
831 } RBinJavaCPTypeMetas;
832 
833 typedef struct r_bin_java_attr_meta_t {
834 	char *name;
835 	ut8 type;
836 	RBinJavaAttrInfoObjectAllocs *allocs;
837 } RBinJavaAttrMetas;
838 
839 typedef struct r_bin_java_ver_meta_t {
840 	char *name;
841 	ut8 type;
842 } RBinJavaVerificationMetas;
843 
844 typedef struct r_bin_java_stack_frame_meta_t {
845 	char *name;
846 	ut8 type;
847 	RBinJavaStackMapFrameObjectAllocs *allocs;
848 } RBinJavaStackMapFrameMetas;
849 
850 typedef struct{
851 	char* name;
852 	ut8 tag;
853 	RBinJavaElementValueObjectAllocs* allocs;
854 } RBinJavaElementValueMetas;
855 
856 typedef struct{
857 	char* name;
858 	ut8 tag;
859 } RBinJavaRefMetas;
860 
861 
862 typedef struct java_const_value_str_t {
863 	ut32 len;
864 	char *str;
865 } _JavaStr;
866 
867 typedef struct java_const_value_ref_t {
868 	char *class_name;
869 	char *name;
870 	char *desc;
871 	ut8 is_method;
872 	ut8 is_field;
873 } _JavaRef;
874 
875 
876 typedef struct java_const_value_t {
877 	const char * type;
878 	union {
879 		ut8 _null;
880 		ut8 _char;
881 		ut8 _byte;
882 		ut64 _long;
883 		double _double;
884 		ut32 _int;
885 		float _float;
886 		ut16 _short;
887 		ut8 _bool;
888 		_JavaStr * _str;
889 		_JavaRef * _ref;
890 	} value;
891 } ConstJavaValue;
892 
893 R_API ut8* r_bin_java_get_attr_buf(RBinJavaObj *bin,  ut64 sz, const ut64 offset, const ut8 *buf, const ut64 len);
894 R_API char* r_bin_java_get_name_from_cp_item_list(RList *cp_list, ut64 idx);
895 R_API char* r_bin_java_get_utf8_from_cp_item_list(RList *cp_list, ut64 idx);
896 R_API ut32 r_bin_java_get_utf8_len_from_cp_item_list(RList *cp_list, ut64 idx);
897 R_API char* r_bin_java_get_desc_from_cp_item_list(RList *cp_list, ut64 idx);
898 R_API char* r_bin_java_get_item_name_from_cp_item_list(RList *cp_list, RBinJavaCPTypeObj *obj, int depth);
899 R_API char* r_bin_java_get_item_desc_from_cp_item_list(RList *cp_list, RBinJavaCPTypeObj *obj, int depth);
900 
901 
902 
903 R_API char* r_bin_java_get_name_from_bin_cp_list(RBinJavaObj *bin, ut64 idx);
904 R_API char* r_bin_java_get_utf8_from_bin_cp_list(RBinJavaObj *bin, ut64 idx);
905 R_API ut32 r_bin_java_get_utf8_len_from_bin_cp_list(RBinJavaObj *bin, ut64 idx);
906 R_API char* r_bin_java_get_desc_from_bin_cp_list(RBinJavaObj *bin, ut64 idx);
907 R_API char* r_bin_java_get_item_name_from_bin_cp_list(RBinJavaObj *bin, RBinJavaCPTypeObj *obj);
908 R_API char* r_bin_java_get_item_desc_from_bin_cp_list(RBinJavaObj *bin, RBinJavaCPTypeObj *obj);
909 
910 // free bin lists
911 
912 R_API char * r_bin_java_print_utf8_cp_stringify(RBinJavaCPTypeObj* obj);
913 R_API char * r_bin_java_print_name_and_type_cp_stringify(RBinJavaCPTypeObj* obj);
914 R_API char * r_bin_java_print_double_cp_stringify(RBinJavaCPTypeObj* obj);
915 R_API char * r_bin_java_print_long_cp_stringify(RBinJavaCPTypeObj* obj);
916 R_API char * r_bin_java_print_float_cp_stringify(RBinJavaCPTypeObj* obj);
917 R_API char * r_bin_java_print_integer_cp_stringify(RBinJavaCPTypeObj* obj);
918 R_API char * r_bin_java_print_string_cp_stringify(RBinJavaCPTypeObj* obj);
919 R_API char * r_bin_java_print_classref_cp_stringify(RBinJavaCPTypeObj* obj);
920 R_API char * r_bin_java_print_fieldref_cp_stringify(RBinJavaCPTypeObj* obj);
921 R_API char * r_bin_java_print_methodref_cp_stringify(RBinJavaCPTypeObj* obj);
922 R_API char * r_bin_java_print_interfacemethodref_cp_stringify(RBinJavaCPTypeObj* obj);
923 R_API char * r_bin_java_print_unknown_cp_stringify(RBinJavaCPTypeObj* obj);
924 R_API char * r_bin_java_print_null_cp_stringify(RBinJavaCPTypeObj* obj);
925 R_API char * r_bin_java_print_methodtype_cp_stringify(RBinJavaCPTypeObj* obj);
926 R_API char * r_bin_java_print_invokedynamic_cp_stringify(RBinJavaCPTypeObj* obj);
927 R_API char * r_bin_java_print_methodhandle_cp_stringify(RBinJavaCPTypeObj* obj);
928 R_API char * r_bin_java_print_class_cp_stringify(RBinJavaCPTypeObj* obj);
929 
930 
931 R_API RBinSymbol* r_bin_java_create_new_symbol_from_field_with_access_flags(RBinJavaField *fm_type);
932 R_API RBinSymbol* r_bin_java_create_new_symbol_from_cp_idx(ut32 cp_idx, ut64 baddr);
933 R_API RBinSymbol* r_bin_java_create_new_symbol_from_invoke_dynamic(RBinJavaCPTypeObj *obj, ut64 baddr);
934 R_API RBinSymbol* r_bin_java_create_new_symbol_from_ref(RBinJavaObj *bin, RBinJavaCPTypeObj *obj, ut64 baddr);
935 R_API RBinSymbol* r_bin_java_create_new_symbol_from_method(RBinJavaField *fm_type);
936 
937 R_API ut64 r_bin_java_get_method_code_offset(RBinJavaField *fm_type);
938 R_API ut64 r_bin_java_get_method_code_size(RBinJavaField *fm_type);
939 R_API ut64 r_bin_java_get_class_entrypoint(RBinJavaObj* bin);
940 
941 R_API RBinJavaCPTypeObj *r_bin_java_find_cp_ref_info(RBinJavaObj *bin, ut16 name_and_typeidx);
942 R_API RBinJavaCPTypeObj *r_bin_java_find_cp_ref_info_from_name_and_type(RBinJavaObj *bin, ut16 name_idx, ut16 descriptor_idx);
943 R_API RBinJavaCPTypeObj *r_bin_java_find_cp_name_and_type_info(RBinJavaObj *bin, ut16 name_idx, ut16 descriptor_idx);
944 
945 R_API RBinClass* r_bin_java_allocate_r_bin_class(void);
946 R_API RList *r_bin_java_get_classes(RBinJavaObj *bin);
947 R_API RList *r_bin_java_enum_class_methods(RBinJavaObj *bin, ut16 class_idx);
948 R_API RList *r_bin_java_enum_class_fields(RBinJavaObj *bin, ut16 class_idx);
949 R_API ut64 r_bin_java_find_method_offset(RBinJavaObj *bin, const char* method_name);
950 
951 R_API RBinJavaField * r_bin_java_get_method_code_attribute_with_addr(RBinJavaObj *bin, ut64 addr);
952 R_API RList * r_bin_java_get_method_exception_table_with_addr(RBinJavaObj *bin, ut64 addr);
953 
954 R_API const RList* r_bin_java_get_methods_list(RBinJavaObj* bin);
955 R_API const RBinJavaObj* r_bin_java_get_bin_obj(const char *name);
956 R_API int r_bin_java_update_file (const char *key, RBinJavaObj *bin_obj);
957 R_API RBinJavaObj * r_bin_java_get_sdb_bin_obj(const char * filename);
958 R_API RList * r_bin_java_get_bin_obj_list(void);
959 R_API RList* r_bin_java_get_bin_obj_list_thru_obj(RBinJavaObj *bin_obj);
960 R_API char * r_bin_java_get_this_class_name(RBinJavaObj *bin_obj);
961 R_API char * r_bin_java_build_obj_key (RBinJavaObj *bin);
962 
963 R_API RList * r_bin_java_extract_type_values(const char *arg_str);
964 R_API int r_bin_java_extract_reference_name(const char * input_str, char ** ref_str, ut8 array_cnt);
965 R_API RList * r_bin_java_extract_all_bin_type_values( RBinJavaObj * bin_obj);
966 
967 R_API RList * r_bin_java_get_method_definitions(RBinJavaObj *bin);
968 R_API char * r_bin_java_get_method_definition(RBinJavaField *fm_type);
969 R_API RList * r_bin_java_get_field_definitions(RBinJavaObj *bin);
970 R_API char * r_bin_java_get_field_definition(RBinJavaField *fm_type);
971 R_API RList * r_bin_java_get_import_definitions(RBinJavaObj *bin);
972 R_API RList * r_bin_java_get_field_offsets(RBinJavaObj *bin);
973 R_API RList * U(r_bin_java_get_method_offsets)(RBinJavaObj *bin);
974 
975 R_API ut16 U(r_bin_java_calculate_method_access_value)(const char * access_flags_str);
976 R_API ut16 U(r_bin_java_calculate_field_access_value)(const char * access_flags_str);
977 R_API ut16 U(r_bin_java_calculate_class_access_value)(const char * access_flags_str);
978 
979 R_API RList * U(retrieve_all_method_access_string_and_value)(void);
980 R_API RList * U(retrieve_all_field_access_string_and_value)(void);
981 R_API RList * U(retrieve_all_class_access_string_and_value)(void);
982 R_API char * retrieve_method_access_string(ut16 flags);
983 R_API char * retrieve_field_access_string(ut16 flags);
984 R_API char * retrieve_class_method_access_string(ut16 flags);
985 
986 
987 R_API char * U(r_bin_java_resolve)(RBinJavaObj *obj, int idx, ut8 space_bn_name_type);
988 R_API char * r_bin_java_resolve_with_space(RBinJavaObj *obj, int idx);
989 R_API char * r_bin_java_resolve_without_space(RBinJavaObj *BIN_OBJ, int idx);
990 R_API char * U(r_bin_java_resolve_cp_idx_type)(RBinJavaObj *BIN_OBJ, int idx);
991 R_API char * U(r_bin_java_resolve_b64_encode)(RBinJavaObj *BIN_OBJ, ut16 idx);
992 R_API ut64 U(r_bin_java_resolve_cp_idx_address)(RBinJavaObj *BIN_OBJ, int idx);
993 R_API char * U(r_bin_java_resolve_cp_idx_to_string)(RBinJavaObj *BIN_OBJ, int idx);
994 R_API int U(r_bin_java_resolve_cp_idx_print_summary)(RBinJavaObj *BIN_OBJ, int idx);
995 
996 R_API struct java_const_value_t * U(r_bin_java_resolve_to_const_value)(RBinJavaObj *BIN_OBJ, int idx);
997 R_API void U(r_bin_java_free_const_value)(struct java_const_value_t * cp_value);
998 
999 
1000 R_API char * U(r_bin_java_get_fcn_name) ( RBinJavaField *fm_type);
1001 R_API RList * r_bin_java_get_args ( RBinJavaField *fm_type);
1002 R_API RList * r_bin_java_get_ret ( RBinJavaField *fm_type);
1003 
1004 R_API RList * U(r_bin_java_get_args_from_bin)(RBinJavaObj *bin_obj, ut64 addr);
1005 R_API RList * U(r_bin_java_get_ret_from_bin)(RBinJavaObj *bin_obj, ut64 addr);
1006 R_API char * U(r_bin_java_get_fcn_name_from_bin)( RBinJavaObj *bin_obj, ut64 addr);
1007 R_API int U(r_bin_java_is_method_static)(RBinJavaObj *bin_obj, ut64 addr);
1008 
1009 R_API ut8 r_bin_java_does_cp_idx_ref_method(RBinJavaObj *BIN_OBJ, int idx);
1010 R_API ut8 r_bin_java_does_cp_idx_ref_field(RBinJavaObj *BIN_OBJ, int idx);
1011 R_API int U(r_bin_java_is_method_protected)(RBinJavaObj *bin_obj, ut64 addr);
1012 R_API int U(r_bin_java_is_method_private)(RBinJavaObj *bin_obj, ut64 addr);
1013 R_API RBinJavaAttrInfo* r_bin_java_get_method_code_attribute(const RBinJavaField *method);
1014 
1015 R_API char * U(r_bin_java_get_method_name)(RBinJavaObj *bin_obj, ut32 idx);
1016 R_API int U(r_bin_java_print_method_idx_summary) (RBinJavaObj *bin_obj, ut32 idx);
1017 R_API ut32 U(r_bin_java_get_method_count)(RBinJavaObj *bin_obj);
1018 R_API RList * U(r_bin_java_get_method_num_name) ( RBinJavaObj *bin_obj);
1019 
1020 R_API char * U(r_bin_java_get_field_name) ( RBinJavaObj *bin_obj, ut32 idx);
1021 R_API int U(r_bin_java_print_field_idx_summary) (RBinJavaObj *bin_obj, ut32 idx);
1022 R_API ut32 U(r_bin_java_get_field_count) (RBinJavaObj *bin_obj);
1023 R_API RList * U(r_bin_java_get_field_num_name) (RBinJavaObj *bin_obj);
1024 
1025 R_API RList * U(r_bin_java_find_cp_const_by_val) ( RBinJavaObj *bin_obj, const ut8 *bytes, ut32 len, const char t);
1026 R_API char U(r_bin_java_resolve_cp_idx_tag)(RBinJavaObj *BIN_OBJ, int idx);
1027 
1028 R_API int U(r_bin_java_integer_cp_set)(RBinJavaObj *bin, ut16 idx, ut32 val );
1029 R_API int U(r_bin_java_float_cp_set)(RBinJavaObj *bin, ut16 idx, float val );
1030 R_API int U(r_bin_java_long_cp_set)(RBinJavaObj *bin, ut16 idx, ut64 val );
1031 R_API int U(r_bin_java_double_cp_set)(RBinJavaObj *bin, ut16 idx, ut32 val );
1032 R_API int U(r_bin_java_utf8_cp_set)(RBinJavaObj *bin, ut16 idx, const ut8* buffer, ut32 len);
1033 R_API ut8 * U(r_bin_java_cp_get_bytes)(ut8 tag, ut32 *out_sz, const ut8 *buf, const ut64 len);
1034 R_API ut8 * U(r_bin_java_cp_idx_get_bytes)(RBinJavaObj *bin, ut16 idx, ut32 *out_sz);
1035 R_API ut32 U(r_bin_java_cp_get_size)(RBinJavaObj *bin, ut16 idx);
1036 
1037 R_API ut64 r_bin_java_parse_cp_pool (RBinJavaObj *bin, const ut64 offset, const ut8 * buf, const ut64 len);
1038 R_API ut64 r_bin_java_parse_interfaces (RBinJavaObj *bin, const ut64 offset, const ut8 * buf, const ut64 len);
1039 R_API ut64 r_bin_java_parse_fields (RBinJavaObj *bin, const ut64 offset, const ut8 * buf, const ut64 len);
1040 R_API ut64 r_bin_java_parse_methods (RBinJavaObj *bin, const ut64 offset, const ut8 * buf, const ut64 len);
1041 R_API ut64 r_bin_java_parse_attrs (RBinJavaObj *bin, const ut64 offset, const ut8 * buf, const ut64 len);
1042 R_API int r_bin_java_load_bin (RBinJavaObj *bin, const ut8 * buf, ut64 len);
1043 R_API void r_bin_add_import (RBinJavaObj * bin, RBinJavaCPTypeObj *cp_obj, const char * type);
1044 R_API void r_bin_java_set_imports(RBinJavaObj* bin);
1045 R_API RList* r_bin_java_get_imports(RBinJavaObj* bin);
1046 
1047 R_API ut64 U(r_bin_java_get_method_start)(RBinJavaObj *bin, RBinJavaField *method);
1048 R_API ut64 U(r_bin_java_get_method_end)(RBinJavaObj *bin, RBinJavaField *method);
1049 
1050 R_API ut8 * r_bin_java_cp_get_fref_bytes (RBinJavaObj *bin, ut32 *out_sz, ut8 tag, ut16 cn_idx, ut16 fn_idx, ut16 ft_idx );
1051 R_API ut8 * U(r_bin_java_cp_append_method_ref) (RBinJavaObj *bin, ut32 *out_sz, ut16 cn_idx, ut16 fn_idx, ut16 ft_idx );
1052 R_API ut8 * U(r_bin_java_cp_append_field_ref)(RBinJavaObj *bin, ut32 *out_sz, ut16 cn_idx, ut16 fn_idx, ut16 ft_idx );
1053 R_API char * U(r_bin_java_unmangle_without_flags) (const char *name, const char *descriptor);
1054 R_API char * r_bin_java_unmangle (const char *flags, const char *name, const char *descriptor);
1055 
1056 R_API DsoJsonObj * r_bin_java_get_field_json_definitions(RBinJavaObj *bin);
1057 R_API DsoJsonObj * r_bin_java_get_method_json_definitions(RBinJavaObj *bin);
1058 R_API DsoJsonObj * r_bin_java_get_import_json_definitions(RBinJavaObj *bin);
1059 R_API DsoJsonObj * r_bin_java_get_interface_json_definitions(RBinJavaObj *bin);
1060 
1061 R_API DsoJsonObj * r_bin_java_get_fm_type_definition_json(RBinJavaObj *bin, RBinJavaField *fm_type, int is_method);
1062 R_API DsoJsonObj * r_bin_java_get_field_json_definition(RBinJavaObj *bin, RBinJavaField *fm_type);
1063 R_API DsoJsonObj * r_bin_java_get_method_json_definition(RBinJavaObj *bin, RBinJavaField *fm_type);
1064 R_API DsoJsonObj * r_bin_java_get_class_info_json(RBinJavaObj *bin);
1065 
1066 R_API DsoJsonObj * r_bin_java_get_bin_obj_json (RBinJavaObj *bin);
1067 R_API ut64 r_bin_java_calc_class_size(ut8* bytes, ut64 size);
1068 R_API int r_bin_java_valid_class (const ut8 * buf, ut64 buf_sz);
1069 #endif
1070