Example #1
0
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
Example #2
0
def parse_encoded_field(dex_file_off, class_data_off, encoded_field_off):
    encoded_field_ptr = dex_file_off + class_data_off + encoded_field_off

    # field_idx_diff
    offset_field_idx_diff = 0x0
    field_idx_diff, length_field_idx_diff = utility.readuleb128(
        encoded_field_ptr + offset_field_idx_diff)
    # access_flags
    offset_access_flags = offset_field_idx_diff + length_field_idx_diff
    access_flags, length_access_flags = utility.readuleb128(
        encoded_field_ptr + offset_access_flags)
Example #3
0
def parse_encoded_field(dex_file_off, class_data_off, encoded_method_off):
    encoded_method_ptr = (
        (dex_file_off + class_data_off) & 0xffffffff) + encoded_method_off

    # field_idx_diff
    offset_method_idx_diff = 0x0
    method_idx_diff, length_method_idx_diff = utility.readuleb128(
        encoded_method_ptr + offset_method_idx_diff)
    # access_flags
    offset_access_flags = offset_method_idx_diff + length_method_idx_diff
    access_flags, length_access_flags = utility.readuleb128(
        encoded_method_ptr + offset_access_flags)
    # code_off
    offset_code_off = offset_access_flags + length_access_flags
    code_off, length_code_off = utility.readuleb128(encoded_method_ptr +
                                                    offset_code_off)
Example #4
0
def get_code_off(dex_file_off, class_data_off, encoded_method_off,
                 code_off_off):
    encoded_method_ptr = dex_file_off + class_data_off + encoded_method_off

    code_off, length_code_off = utility.readuleb128(encoded_method_ptr +
                                                    code_off_off)
    return code_off, length_code_off
Example #5
0
def get_access_flags(dex_file_off, class_data_off, encoded_method_off,
                     access_flags_off):
    encoded_method_ptr = dex_file_off + class_data_off + encoded_method_off

    access_flags, length_access_flags = utility.readuleb128(
        encoded_method_ptr + access_flags_off)
    return access_flags, length_access_flags
Example #6
0
def get_method_idx_diff(dex_file_off, class_data_off, encoded_method_off,
                        method_idx_diff_off):
    encoded_method_ptr = dex_file_off + class_data_off + encoded_method_off

    method_idx_diff, length_method_idx_diff = utility.readuleb128(
        encoded_method_ptr + method_idx_diff_off)
    return method_idx_diff, length_method_idx_diff
Example #7
0
def get_virtual_methods_size(dex_file_off, class_data_off,
                             virtual_methods_size_off):
    class_data_item_ptr = dex_file_off + class_data_off

    virtual_methods_size, length_virtual_methods_size = utility.readuleb128(
        class_data_item_ptr + virtual_methods_size_off)
    return virtual_methods_size, length_virtual_methods_size
Example #8
0
def get_direct_methods_size(dex_file_off, class_data_off,
                            direct_methods_size_off):
    class_data_item_ptr = dex_file_off + class_data_off

    direct_methods_size, length_direct_methods_size = utility.readuleb128(
        class_data_item_ptr + direct_methods_size_off)
    return direct_methods_size, length_direct_methods_size
Example #9
0
def get_instance_fields_size(dex_file_off, class_data_off,
                             instance_fields_size_off):
    class_data_item_ptr = dex_file_off + class_data_off

    instance_fields_size, length_instance_fields_size = utility.readuleb128(
        class_data_item_ptr + instance_fields_size_off)
    return instance_fields_size, length_instance_fields_size
Example #10
0
def get_static_fields_size(dex_file_off, class_data_off,
                           static_fields_size_off):
    class_data_item_ptr = dex_file_off + class_data_off

    static_fields_size, length_static_fields_size = utility.readuleb128(
        class_data_item_ptr + static_fields_size_off)
    return static_fields_size, length_static_fields_size
Example #11
0
def get_field_idx_diff(dex_file_off, class_data_off, encoded_field_off,
                       field_idx_diff_off):
    encoded_field_ptr = dex_file_off + class_data_off + encoded_field_off

    field_idx_diff, length_field_idx_diff = utility.readuleb128(
        encoded_field_ptr + field_idx_diff_off)
    return field_idx_diff, length_field_idx_diff
def parse_encoded_catch_handler_list(dex_file_off, encoded_catch_handler_list_off, tries_size):
	if tries_size == 0x0:
		return 0x0

	encoded_catch_handler_list_ptr = (dex_file_off + encoded_catch_handler_list_off) & 0xffffffff
	
	# size
	offset_size = 0x0
	size, length_size = utility.readuleb128(encoded_catch_handler_list_ptr + offset_size)
	print "[encoded_catch_handler_list] size = %#x" % size
	
	offset_catch_handler = offset_size + length_size
	length_catch_handler = 0x0
	# encoded_catch_handler list
	encoded_catch_handler_ptr = encoded_catch_handler_list_ptr + offset_catch_handler
	for handler_idx in range(size):
		offset_size = 0x0
		size, length_size = utility.readsleb128(encoded_catch_handler_ptr + offset_size)
		print "[encoded_catch_handler] (idx = %#x) size = %#x" % (handler_idx, size)
		
		offset_encoded_type_addr_pair = offset_size + length_size
		length_encoded_type_addr_pair = 0x0
		# encoded_type_addr_pair
		encoded_type_addr_pair_ptr = encoded_catch_handler_ptr + offset_encoded_type_addr_pair
		for pair_idx in range(abs(size)):
			off_type_idx = 0x0
			type_idx, length_type_idx = utility.readuleb128(encoded_type_addr_pair_ptr + off_type_idx)
			off_addr = off_type_idx + length_type_idx
			addr, length_addr = utility.readuleb128(encoded_type_addr_pair_ptr + off_addr)
			print "[encoded_type_addr_pair] (idx = %#x) (pair_idx = %#x) type_idx = %#x, addr = %#x" % (handler_idx, pair_idx, type_idx, addr)
			# update length_encoded_type_addr_pair, encoded_type_addr_pair_ptr
			length_encoded_type_addr_pair = length_encoded_type_addr_pair + length_type_idx + length_addr
			encoded_type_addr_pair_ptr = encoded_type_addr_pair_ptr + length_type_idx + length_addr
		
		offset_catch_all_addr = offset_encoded_type_addr_pair + length_encoded_type_addr_pair
		length_catch_all_addr = 0x0
		if size <= 0:
			catch_all_addr, length_catch_all_addr = utility.readuleb128(encoded_catch_handler_ptr + offset_catch_all_addr)
			print "[encoded_catch_handler] (idx = %#x) catch_all_addr = %#x" % (handler_idx, catch_all_addr)
			
		# update length_catch_handler, encoded_catch_handler_ptr
		length_catch_handler = length_catch_handler + length_size + length_encoded_type_addr_pair + length_catch_all_addr
		encoded_catch_handler_ptr = encoded_catch_handler_ptr + length_size + length_encoded_type_addr_pair + length_catch_all_addr
		
	return length_size + length_catch_handler
Example #13
0
def parse_string_id_item(dex_file_off, string_ids_off, string_id):
    string_data_item_ptr = dex_file_off + string_ids_off + string_id * 0x4
    string_data_item_off = memory.readMemory32(string_data_item_ptr +
                                               offset_string_data_off)

    utf16_size, offset_data_off = utility.readuleb128(dex_file_off +
                                                      string_data_item_off +
                                                      offset_utf16_size_off)
    data = memory.retrieve_char_array(dex_file_off + string_data_item_off +
                                      offset_data_off)
Example #14
0
def get_string_id_item_data_off(dex_file_off, string_ids_off, string_id):
    string_data_item_ptr = dex_file_off + string_ids_off + string_id * 0x4
    string_data_item_off = memory.readMemory32(string_data_item_ptr +
                                               offset_string_data_off)

    utf16_size, offset_data_off = utility.readuleb128(dex_file_off +
                                                      string_data_item_off +
                                                      offset_utf16_size_off)

    return dex_file_off + string_data_item_off + offset_data_off