import idaapi
global_table = 0x78D05D8E80
fun_id = 158
fun_addr_ref = 0x0
instr_fun_table = 0x0
# 0x1b4
translator_8_12 = [ 3 , 2 , 1 , 0 , 7 , 6 , 5 , 4 , 0xb , 0xA , 9 , 8 , 0xF , 0xE , 0xD , 0xC ]
translator_12_16 = [ 0xB , 0xA , 9 , 8 , 0xF , 0xE , 0xD , 0xC , 3 , 2 , 1 , 0 , 7 , 6 , 5 , 4 ]
def aget(instr_addr,x10):
print ( "aget" , "arg:" )
return 4
def const_4(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
arg0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ]
arg1 = translator_12_16[instr_0_2 >> 12 ]
print ( "const/4 v%d, %d" % (arg0,arg1))
return 2
def const_16(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
arg0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
print ( "const/16 v%d, %d" % (arg0,instr_2_4))
return 4
def const(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
arg0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
print ( "const v%d, %d" % (arg0,instr_2_4))
return 6
def const_string(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
v60 = instr_0_2 >> 12
v61 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF
v63 = 16 * (translator_12_16[v60] & 0xF )
v75 = v63 | v61
#
a38_index_11 = read_mem_to_Int(x10 + 0x58 , 8 )
a38_index_2 = read_mem_to_Int(x10 + 0x10 , 8 )
v3 = read_mem_to_Int(instr_2_4 * 4 + a38_index_2, 4 )
string = v3 + a38_index_11
# print("string addr",hex(string),hex(instr_addr))
# cla_len = read_mem_to_Int(string, 1)
# return_type = idaapi.dbg_read_memory(string+1, cla_len).decode('utf-8')
#
# print("const-string ",v75,return_type)
print ( "const-string v%d, %s" % (v75, hex (string)))
return 4
def xor(instr_addr,x10):
print ( "xor" , "arg:" )
return 4
def move_16(instr_addr,x10):
print ( "move-16" , "arg:" )
return 2
def iput_object(instr_addr,x10):
print ( "iput_object" , "arg:" )
return 4
def aput_object(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v37 = (instr_0_2 >> 8 ) & 0xF
v38 = instr_0_2 >> 12
v40 = translator_8_12[v37];
v41 = translator_12_16[v38];
arg_v1 = v40 & 0xF | ( 16 * (v41 & 0xF ))
arg_v2 = read_mem_to_Int(instr_addr + 2 , 1 )
arg_v3 = read_mem_to_Int(instr_addr + 3 , 1 )
print ( "aput-object v%d, v%d, v%d" % (arg_v1,arg_v2,arg_v3))
return 4
def goto(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v3 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
if v3 > = 128 :
int_num = (v3 - 256 ) * 2
else :
int_num = v3 * 2
print ( "goto" , "arg:" , hex (instr_addr + int_num),int_num)
return 2
def rsub(instr_addr,x10):
print ( "rsub" , "arg:" )
return 4
def cmp (instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v1 = read_mem_to_Int(instr_addr + 2 , 1 )
v2 = read_mem_to_Int(instr_addr + 3 , 1 )
v3 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "cmp" , "arg:" ,v3,v1,v2)
return 4
def invoke_super(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_add_4 = read_mem_to_Int(instr_addr + 4 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
register_size = v63 >> 4
arg1 = instr_add_4 & 0xF
arg2 = instr_add_4 >> 4 & 0xF
arg3 = (instr_add_4 >> 8 ) & 0xf
arg4 = instr_add_4 >> 12
arg5 = v63 & 0xF
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
classname_str = get_class_name(x10,ref_index)
method_name_str = get_method_name(x10,ref_index)
type_name_str = get_proto_type_name(x10, ref_index)
# arg_name_str = get_method_arg(x10,ref_index)
# print("invoke_direct class:",classname_str,"method:",method_name_str,"method_ref_index",hex(ref_index),"type:",type_name_str,"register:",register_size,"arg1:",arg1,"arg2:",arg2,"arg3:",arg3,"arg4:",arg4,"arg5:",arg5)
print ( "invoke-super " ,classname_str + "->" + method_name_str + type_name_str, "method_ref_index" , hex (ref_index), "register:" ,register_size, "arg1:" ,arg1, "arg2:" ,arg2, "arg3:" ,arg3, "arg4:" ,arg4, "arg5:" ,arg5)
return 6
def invoke_direct(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_add_4 = read_mem_to_Int(instr_addr + 4 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
register_size = v63 >> 4
arg1 = instr_add_4 & 0xF
arg2 = instr_add_4 >> 4 & 0xF
arg3 = (instr_add_4 >> 8 ) & 0xf
arg4 = instr_add_4 >> 12
arg5 = v63 & 0xF
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
classname_str = get_class_name(x10,ref_index)
method_name_str = get_method_name(x10,ref_index)
type_name_str = get_proto_type_name(x10, ref_index)
# arg_name_str = get_method_arg(x10,ref_index)
# print("invoke-direct class:",classname_str,"method:",method_name_str,"method_ref_index",hex(ref_index),"type:",type_name_str,"register:",register_size,"arg1:",arg1,"arg2:",arg2,"arg3:",arg3,"arg4:",arg4,"arg5:",arg5)
print ( "invoke-direct " ,classname_str + "->" + method_name_str + type_name_str, "method_ref_index" , hex (ref_index), "register:" ,register_size, "arg1:" ,arg1, "arg2:" ,arg2, "arg3:" ,arg3, "arg4:" ,arg4, "arg5:" ,arg5)
return 6
def invoke_static(instr_addr, x10): # 第一个字节是指令,主导函数偏移,第二个字节是寄存器,三四字节是方法偏移
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_add_4 = read_mem_to_Int(instr_addr + 4 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
register_size = v63 >> 4
arg1 = instr_add_4 & 0xF
arg2 = instr_add_4 >> 4 & 0xF
arg3 = (instr_add_4 >> 8 ) & 0xf
arg4 = instr_add_4 >> 12
arg5 = v63 & 0xF
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
classname_str = get_class_name(x10,ref_index)
method_name_str = get_method_name(x10,ref_index)
type_name_str = get_proto_type_name(x10, ref_index)
# arg_name_str = get_method_arg(x10,ref_index)
# print("invoke-static class:",classname_str,"method:",method_name_str,"method_ref_index",hex(ref_index),"type:",type_name_str,"register:",register_size,"arg1:",arg1,"arg2:",arg2,"arg3:",arg3,"arg4:",arg4,"arg5:",arg5)
print ( "invoke-static " ,classname_str + "->" + method_name_str + type_name_str, "method_ref_index" , hex (ref_index), "register:" ,register_size, "arg1:" ,arg1, "arg2:" ,arg2, "arg3:" ,arg3, "arg4:" ,arg4, "arg5:" ,arg5)
# print("CallStaticVoidMethod arg_name_str:",arg_name_str)
return 6
def invoke_interface(instr_addr,x10): # 第一个字节是指令,主导函数偏移,第二个字节是寄存器,三四字节是方法偏移
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_add_4 = read_mem_to_Int(instr_addr + 4 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
register_size = v63 >> 4
arg1 = instr_add_4 & 0xF
arg2 = instr_add_4 >> 4 & 0xF
arg3 = (instr_add_4 >> 8 ) & 0xf
arg4 = instr_add_4 >> 12
arg5 = v63 & 0xF
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
classname_str = get_class_name(x10,ref_index)
method_name_str = get_method_name(x10,ref_index)
type_name_str = get_proto_type_name(x10, ref_index)
# arg_name_str = get_method_arg(x10,ref_index)
print ( "invoke-interface " ,classname_str + "->" + method_name_str + type_name_str, "method_ref_index" , hex (ref_index), "register:" ,register_size, "arg1:" ,arg1, "arg2:" ,arg2, "arg3:" ,arg3, "arg4:" ,arg4, "arg5:" ,arg5)
# print("CallStaticVoidMethod arg_name_str:",arg_name_str)
return 6
def invoke_virutal(instr_addr,x10): # 第一个字节是指令,主导函数偏移,第二个字节是寄存器,三四字节是方法偏移
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_add_4 = read_mem_to_Int(instr_addr + 4 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
register_size = v63 >> 4
arg1 = instr_add_4 & 0xF
arg2 = instr_add_4 >> 4 & 0xF
arg3 = (instr_add_4 >> 8 ) & 0xf
arg4 = instr_add_4 >> 12
arg5 = v63 & 0xF
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
classname_str = get_class_name(x10,ref_index)
method_name_str = get_method_name(x10,ref_index)
type_name_str = get_proto_type_name(x10, ref_index)
# arg_name_str = get_method_arg(x10,ref_index)
print ( "invoke-virtual " ,classname_str + "->" + method_name_str + type_name_str, "method_ref_index" , hex (ref_index), "register:" ,register_size, "arg1:" ,arg1, "arg2:" ,arg2, "arg3:" ,arg3, "arg4:" ,arg4, "arg5:" ,arg5)
# print("CallStaticVoidMethod arg_name_str:",arg_name_str)
return 6
def rem_doule(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
print ( "rem-doule" , hex (v_arg_0), hex (instr_2_4))
return 4
def move_result_object(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
print ( "move-result-object v%d" % v_arg_0)
return 2
def MonitorEnter(instr_addr,x10):
print ( "MonitorEnter" , "arg:" )
return 2
def return_object(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "return-object v%d" % v_arg_0)
return 2
def move_object(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ];
v_arg_1 = translator_12_16[instr_0_2 >> 12 ]
print ( "move-object v%d, v%d" % (v_arg_0,v_arg_1))
return 2
def new_instance(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
classname_str = byIndexGet_dex_type_name(dex_base_addr,dex_type_off,dex_string_list_off,ref_index)
print ( "new-instance v%d, %s" % (v_arg_0,classname_str))
return 4
def move_result(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "move-result v%d" % v_arg_0)
return 2
def new_array(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_size = translator_12_16[instr_0_2 >> 12 ]
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ];
ref_index = read_mem_to_Int(instr_addr + 2 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
classname_str = byIndexGet_dex_type_name(dex_base_addr,dex_type_off,dex_string_list_off,ref_index)
print ( "new-array v%d, v%d, %s" % (v_arg_0,v_arg_size,classname_str))
return 4
def if_ne(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
arg1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ];
arg2 = translator_12_16[instr_0_2 >> 12 ];
print ( "if-ne v%d, v%x, %x" % (arg1,arg2,instr_addr + instr_2_4 * 2 ))
return 4
def if_eqz(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
print ( "if-eqz v%d, %x" % (v63,instr_addr + instr_2_4 * 2 ))
return 4
def if_gt(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
arg1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ];
arg2 = translator_12_16[instr_0_2 >> 12 ];
print ( "if-gt v%d, v%x, %x" % (arg1,arg2,instr_addr + instr_2_4 * 2 ))
return 4
def if_lt(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
arg1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ];
arg2 = translator_12_16[instr_0_2 >> 12 ];
print ( "if-lt v%d, v%x, %x" % (arg1,arg2,instr_addr + instr_2_4 * 2 ))
return 4
def if_lez(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
print ( "if-lez v%d, %x" % (v63,instr_addr + instr_2_4 * 2 ))
return 4
def if_nez(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
instr_2_4 = read_mem_to_Int(instr_addr + 2 , 2 )
v63 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF )); #处理一个字节(8 bit)的 数据,作为寄存器转换
print ( "if-nez v%d, %x" % (v63,instr_addr + instr_2_4 * 2 ))
return 4
def iput(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
filed_index = read_mem_to_Int(instr_addr + 2 , 2 )
v_arg_0 = translator_12_16[instr_0_2 >> 12 ]
v_arg_1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ]
dex_filed_off = read_mem_to_Int(x10 + 0x20 , 8 )
class_index = read_mem_to_Int( 8 * filed_index + dex_filed_off, 2 )
filed_type_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 2 , 2 )
name_string_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 4 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
class_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, class_index)
filed_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, filed_type_index)
name_string = byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,name_string_index)
# print("iput-object ",v_arg_0,v_arg_1,class_type_string,"->",name_string,";",filed_type_string,"filed_index:",filed_index)
print ( "iput-object v%d, v%d, %s" % (v_arg_1,v_arg_0,class_type_string + "->" + name_string + ":" + filed_type_string + " filed_index: " + filed_index))
return 4
def aget_object(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
arg_1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
arg_v2 = read_mem_to_Int(instr_addr + 2 , 1 )
arg_v3 = read_mem_to_Int(instr_addr + 3 , 1 )
print ( "aget-object v%d, v%d, v%d" % (arg_1,arg_v2,arg_v3))
return 4
def iget_object(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
filed_index = read_mem_to_Int(instr_addr + 2 , 2 )
v_arg_0 = translator_12_16[instr_0_2 >> 12 ]
v_arg_1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ]
dex_filed_off = read_mem_to_Int(x10 + 0x20 , 8 )
class_index = read_mem_to_Int( 8 * filed_index + dex_filed_off, 2 )
filed_type_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 2 , 2 )
name_string_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 4 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
class_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, class_index)
filed_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, filed_type_index)
name_string = byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,name_string_index)
print ( "iget-object v%d, v%d, %s" % (v_arg_1,v_arg_0,class_type_string + "->" + name_string + ":" + filed_type_string + " filed_index: " + filed_index))
return 4
def check_cast(instr_addr,x10):
type_index = read_mem_to_Int(instr_addr + 2 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, type_index)
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "check-cast v%d, %s" % (v_arg,type_string))
return 4
def sget_object(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
filed_index = read_mem_to_Int(instr_addr + 2 , 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
dex_filed_off = read_mem_to_Int(x10 + 0x20 , 8 )
class_index = read_mem_to_Int( 8 * filed_index + dex_filed_off, 2 )
filed_type_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 2 , 2 )
name_string_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 4 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
class_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, class_index)
filed_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, filed_type_index)
name_string = byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,name_string_index)
print ( "sget-object v%d, %s" % (v_arg_0,class_type_string + "->" + name_string + ":" + filed_type_string))
return 4
def sget_boolean(instr_addr, x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
filed_index = read_mem_to_Int(instr_addr + 2 , 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
dex_filed_off = read_mem_to_Int(x10 + 0x20 , 8 )
class_index = read_mem_to_Int( 8 * filed_index + dex_filed_off, 2 )
filed_type_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 2 , 2 )
name_string_index = read_mem_to_Int( 8 * filed_index + dex_filed_off + 4 , 2 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
class_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, class_index)
filed_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, filed_type_index)
name_string = byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,name_string_index)
print ( "sget-boolean v%d, %s" % (v_arg_0,class_type_string + "->" + name_string + ":" + filed_type_string))
return 4
def nop(instr_addr,x10):
print ( "nop" )
return 2
def return_void(instr_addr,x10):
print ( "return-void" )
return 2
def throw(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "throw v%d" % v_arg_0)
return 2
def throw_2(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
v_arg_0 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ] & 0xF | ( 16 * (translator_12_16[instr_0_2 >> 12 ] & 0xF ))
print ( "move-exception v%d" % v_arg_0)
return 2
def array_length(instr_addr,x10):
instr_0_2 = read_mem_to_Int(instr_addr, 2 )
arg_0 = translator_12_16[instr_0_2 >> 12 ]
arg_1 = translator_8_12[(instr_0_2 >> 8 ) & 0xF ]
print ( "array-length v%d, v%d" % (arg_1,arg_0))
return 2
switch = { 0x0 :iput, 0x1 :invoke_super, 0x2 :aget, 0x3 :xor, 0x4 :move_16, 0x5 :iput_object, 0x5a :nop, 0xd :goto, 0xda :aput_object , 0x7 :rsub, 0x8 : cmp , 0x1e :if_lez, 0x2b :if_nez, 0x3e :if_eqz, 0x3c :if_gt, 0x21 :if_lt, 0x44 :const_16, 0xc3 :const,
0x5e :move_result , 0x68 :invoke_direct, 0xA6 :invoke_virutal, 0xAA :new_instance, 0xc7 :move_result_object, 0xbb :return_object, 0x92 :return_void, 0xfc :move_object, 0x79 :invoke_interface, 0xf9 :check_cast,
0xf0 :const_4, 0xfa :if_ne, 0x93 :sget_object, 0xc2 :sget_boolean, 0x9a :invoke_static, 0x9b :const_string, 0x1f :new_array, 0x19 :iget_object, 0x9d :MonitorEnter, 0xc4 :array_length, 0x6b :aget_object, 0xf5 :throw, 0xee :throw_2}
def ByFunIDgetFunAddr( id ):
offset_mem = int .from_bytes(idaapi.dbg_read_memory( 4 * id + global_table, 4 ),byteorder = 'little' )
method_addr = global_table + offset_mem
print ( "fun_id:" , hex ( id ), "method_addr:" , hex (offset_mem), "method_addr:" , hex (method_addr))
return method_addr
def read_mem_to_String(addr,size):
mem = idaapi.dbg_read_memory(addr,size)
return mem
def read_mem_to_Int(addr, size):
mem = int .from_bytes(idaapi.dbg_read_memory(addr,size),byteorder = 'little' )
return mem
def get_proto_type_name(x10, type_index):
dex_method_off = read_mem_to_Int(x10 + 0x28 , 8 )
dex_string_list_off = read_mem_to_Int(x10 + 0x10 , 8 )
dex_type_off = read_mem_to_Int(x10 + 0x18 , 8 )
dex_base_addr = read_mem_to_Int(x10 + 0x58 , 8 )
dex_proto_off = read_mem_to_Int(x10 + 0x30 , 8 )
proto_index = read_mem_to_Int( 8 * type_index + dex_method_off + 2 , 2 )
return_type_index = read_mem_to_Int(dex_proto_off + 12 * proto_index + 4 , 4 )
pararm_off = read_mem_to_Int(dex_proto_off + 12 * proto_index + 8 , 4 )
sign_type_string_list = "("
if pararm_off ! = 0 :
pararm_size = read_mem_to_Int(dex_base_addr + pararm_off, 4 )
# pararm_mem_total = pararm_size * 2
# for i in pararm_size:
for i in range (pararm_size):
pararm_type_index = read_mem_to_Int(dex_base_addr + pararm_off + 4 + i * 2 , 2 )
pararm_type_string = byIndexGet_dex_type_name(dex_base_addr, dex_type_off, dex_string_list_off, pararm_type_index)
sign_type_string_list = sign_type_string_list + pararm_type_string
return_type_string = byIndexGet_dex_type_name(dex_base_addr,dex_type_off,dex_string_list_off,return_type_index)
sign_type_string_list = sign_type_string_list + ")" + return_type_string
return sign_type_string_list
def byIndexGet_dex_type_name(dex_base_addr,dex_type_off,dex_string_list_off,pararm_type_index):
string_index = read_mem_to_Int(pararm_type_index * 4 + dex_type_off, 4 )
type_string = byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,string_index)
return type_string
def byIndexGet_dex_string_name(dex_base_addr,dex_string_list_off,string_index):
v3 = read_mem_to_Int(string_index * 4 + dex_string_list_off, 4 )
cla_len = read_mem_to_Int(dex_base_addr + v3, 1 )
class_str = idaapi.dbg_read_memory(dex_base_addr + v3 + 1 , cla_len).decode( 'utf-8' )
print ( "byIndexGet_dex_string_name:" , hex (dex_base_addr + v3))
return class_str
def get_class_name(x10,class_index):
a38_index_5 = read_mem_to_Int(x10 + 0x28 , 8 )
a38_index_2 = read_mem_to_Int(x10 + 0x10 , 8 )
a38_index_3 = read_mem_to_Int(x10 + 0x18 , 8 )
a38_index_11 = read_mem_to_Int(x10 + 0x58 , 8 )
v1 = read_mem_to_Int( 8 * class_index + a38_index_5, 2 )
v2 = read_mem_to_Int(v1 * 4 + a38_index_3, 4 )
v3 = read_mem_to_Int(v2 * 4 + a38_index_2, 4 )
class_str_addr = v3 + a38_index_11
cla_len = read_mem_to_Int(class_str_addr, 1 )
class_str = idaapi.dbg_read_memory(class_str_addr + 1 , cla_len).decode( 'utf-8' )
# print("classname len:",cla_len)
return class_str
def get_method_name(x10, method_index):
a38_index_5 = read_mem_to_Int(x10 + 0x28 , 8 )
a38_index_2 = read_mem_to_Int(x10 + 0x10 , 8 )
a38_index_3 = read_mem_to_Int(x10 + 0x18 , 8 )
a38_index_11 = read_mem_to_Int(x10 + 0x58 , 8 )
v1 = read_mem_to_Int( 8 * method_index + a38_index_5 + 4 , 2 )
v3 = read_mem_to_Int(v1 * 4 + a38_index_2, 4 )
method_name_str_addr = v3 + a38_index_11
method_name_str_len = read_mem_to_Int(method_name_str_addr, 1 )
method_name_str = idaapi.dbg_read_memory(method_name_str_addr + 1 , method_name_str_len).decode( 'utf-8' )
return method_name_str
def get_method_arg(x10, index):
# (v70 + * (v69 + 4LL * * (v68 + 4LL * * (v81 + v84 + 2))));
a38_index_5 = read_mem_to_Int(x10 + 0x28 , 8 )
a38_index_2 = read_mem_to_Int(x10 + 0x10 , 8 )
a38_index_3 = read_mem_to_Int(x10 + 0x18 , 8 )
a38_index_11 = read_mem_to_Int(x10 + 0x58 , 8 )
a38_index_6 = read_mem_to_Int(x10 + 0x30 , 8 )
v0 = read_mem_to_Int( 8 * index + a38_index_5 + 2 , 2 )
v80 = read_mem_to_Int(a38_index_6 + 12 * v0 + 8 , 4 )
print ( "arg_addr a38_index_5:" , hex (a38_index_5))
print ( "arg_addr a38_index_2:" , hex (a38_index_2))
print ( "arg_addr a38_index_3:" , hex (a38_index_3))
print ( "arg_addr a38_index_11:" , hex (a38_index_11))
print ( "arg_addr a38_index_6:" , hex (a38_index_6))
print ( "arg_addr v80:" ,v80)
v81 = v80 + a38_index_11
# print("arg_addr v81:",v81)
v1 = read_mem_to_Int(v81 + 2 , 4 )
v2 = read_mem_to_Int(v1 * 4 + a38_index_3, 4 )
v3 = read_mem_to_Int(v2 * 4 + a38_index_2, 4 )
return_type = v3 + a38_index_11
# cla_len = read_mem_to_Int(return_type, 1)
# return_type = idaapi.dbg_read_memory(return_type+1, cla_len).decode('utf-8')
print ( "arg_addr:" ,return_type)
return return_type
# def instr_handle(instr_addr,x10):
# offset_mem = read_mem(instr_addr,2) & 0xff
# instr_len = dexinstr[offset_mem](instr_addr,x10)
#
# return instr_len
def get_segment_address(segment_name):
seg = idaapi.get_segm_by_name(segment_name)
if seg is not None :
return seg.start_ea, seg.end_ea
else :
return None
# 使用方法
def main():
method_addr = ByFunIDgetFunAddr(fun_id)
register_size = read_mem_to_Int(method_addr, 2 )
ins_size = read_mem_to_Int(method_addr + 2 , 2 )
insns_size = read_mem_to_Int(method_addr + 12 , 4 )
print ( "method registers_size:" , hex (register_size))
print ( "method ins_size:" , hex (ins_size))
print ( "method insns_size:" , hex (insns_size))
method_addr_2 = ByFunIDgetFunAddr(fun_id + 1 )
funSize = method_addr_2 - method_addr
print ( "method_size:" , hex (funSize))
instr_addr = method_addr + 0x10
print ( "method_end:" , hex (instr_addr + insns_size * 2 ))
while ( 1 ):
offset = read_mem_to_Int(instr_addr, 2 ) & 0xff #第一个字节
instr_fun_addr = instr_fun_table + offset * 8
print ( "-----------------------------------" )
print ( "instr_fun_addr:" , hex (instr_fun_addr), hex (offset))
instr_handle = switch[offset]
print ( "instr_addr:" , hex (instr_addr))
print ( hex (offset))
if (instr_handle = = None ):
break
instr_len = instr_handle(instr_addr, fun_addr_ref)
instr_addr = instr_addr + instr_len
print ( hex (offset))
def init_var():
global global_table
global instr_fun_table
global fun_addr_ref
bss_start, bss_end = get_segment_address( ".bss" )
qword_78B9BFCDC8 = read_mem_to_Int(bss_start + 0x2B8 , 8 )
global_table = read_mem_to_Int(bss_start + 0x270 , 8 )
yaq2__sec = read_mem_to_Int(bss_start + 0x2B0 , 8 )
v6 = yaq2__sec + fun_id * 12
v6_index_1 = read_mem_to_Int(v6 + 4 , 4 )
v6_index_2 = read_mem_to_Int(v6 + 8 , 4 )
fun_addr_ref = read_mem_to_Int( 8 * (v6_index_2 - 1 ) + qword_78B9BFCDC8, 8 )
instr_fun_table, data_rel_end = get_segment_address( ".data.rel.ro" )
print ( "qword_78B9BFCDC8" , hex (qword_78B9BFCDC8))
print ( "global_table" , hex (global_table))
print ( "v6_index_1" , hex (v6_index_1))
print ( "v6_index_2" , hex (v6_index_2))
print ( "fun_addr_ref" , hex (fun_addr_ref))
if __name__ = = '__main__' :
init_var()
main()
|