def parse_class_data_item(dex_file_off, class_data_off): class_data_item_ptr = (dex_file_off + class_data_off) & 0xffffffff # static_fields_size offset_static_fields_size = 0x0 static_fields_size, length_static_fields_size = utility.readuleb128(class_data_item_ptr + offset_static_fields_size) # instance_fields_size offset_instance_fields_size = offset_static_fields_size + length_static_fields_size instance_fields_size, length_instance_fields_size = utility.readuleb128(class_data_item_ptr + offset_instance_fields_size) # direct_methods_size offset_direct_methods_size = offset_instance_fields_size + length_instance_fields_size direct_methods_size, length_direct_methods_size = utility.readuleb128(class_data_item_ptr + offset_direct_methods_size) # virtual_methods_size offset_virtual_methods_size = offset_direct_methods_size + length_direct_methods_size virtual_methods_size, length_virtual_methods_size = utility.readuleb128(class_data_item_ptr + offset_virtual_methods_size) # static_fields offset_static_fields = offset_virtual_methods_size + length_virtual_methods_size encoded_field_off = offset_static_fields for idx in range(static_fields_size): field_idx_diff_off = 0x0 field_idx_diff, length_field_idx_diff = encoded_field.get_field_idx_diff(dex_file_off, class_data_off, encoded_field_off, field_idx_diff_off) access_flags_off = field_idx_diff_off + length_field_idx_diff access_flags, length_access_flags = encoded_field.get_access_flags(dex_file_off, class_data_off, encoded_field_off, access_flags_off) encoded_field_off = access_flags_off + length_access_flags # instance_fields offset_instance_fields = encoded_field_off encoded_field_off = offset_instance_fields for idx in range(instance_fields_size): field_idx_diff_off = 0x0 field_idx_diff, length_field_idx_diff = encoded_field.get_field_idx_diff(dex_file_off, class_data_off, encoded_field_off, field_idx_diff_off) access_flags_off = field_idx_diff_off + length_field_idx_diff access_flags, length_access_flags = encoded_field.get_access_flags(dex_file_off, class_data_off, encoded_field_off, access_flags_off) encoded_field_off = access_flags_off + length_access_flags # direct_methods offset_direct_methods = encoded_field_off encoded_method_off = offset_direct_methods for idx in range(direct_methods_size): method_idx_diff_off = 0x0 method_idx_diff, length_method_idx_diff = encoded_method.get_method_idx_diff(dex_file_off, class_data_off, encoded_method_off, method_idx_diff_off) access_flags_off = method_idx_diff_off + length_method_idx_diff access_flags, length_access_flags = encoded_method.get_access_flags(dex_file_off, class_data_off, encoded_method_off, access_flags_off) code_off_off = access_flags_off + length_access_flags code_off, length_code_off = encoded_method.get_code_off(dex_file_off, class_data_off, encoded_method_off, code_off_off) encoded_method_off = code_off_off + length_code_off # virtual_methods offset_virtual_methods = encoded_method_off encoded_method_off = offset_virtual_methods for idx in range(virtual_methods_size): method_idx_diff_off = 0x0 method_idx_diff, length_method_idx_diff = encoded_method.get_method_idx_diff(dex_file_off, class_data_off, encoded_method_off, method_idx_diff_off) access_flags_off = method_idx_diff_off + length_method_idx_diff access_flags, length_access_flags = encoded_method.get_access_flags(dex_file_off, class_data_off, encoded_method_off, access_flags_off) code_off_off = access_flags_off + length_access_flags code_off, length_code_off = encoded_method.get_code_off(dex_file_off, class_data_off, encoded_method_off, code_off_off) encoded_method_off = code_off_off + length_code_off
def get_virtual_methods(dex_file_off, class_data_off, virtual_methods_off, virtual_methods_size): encoded_methods = [] length_virtual_methods = 0x0 encoded_method_off = virtual_methods_off for idx in range(virtual_methods_size): method_idx_diff_off = 0x0 method_idx_diff, length_method_idx_diff = encoded_method.get_method_idx_diff(dex_file_off, class_data_off, encoded_method_off, method_idx_diff_off) access_flags_off = method_idx_diff_off + length_method_idx_diff access_flags, length_access_flags = encoded_method.get_access_flags(dex_file_off, class_data_off, encoded_method_off, access_flags_off) code_off_off = access_flags_off + length_access_flags code_off, length_code_off = encoded_method.get_code_off(dex_file_off, class_data_off, encoded_method_off, code_off_off) encoded_methods.append((method_idx_diff, access_flags, code_off)) length_virtual_methods = length_virtual_methods + length_method_idx_diff + length_access_flags + length_code_off encoded_method_off = encoded_method_off + code_off_off + length_code_off return encoded_methods, length_virtual_methods