移动应用中对so文件,有些函数用了mprotect进行保护,即将加密数据解密后再在内存执行,然后再将内存数据加密后写回原位置,通常解密后数据具有反调试功能。
破解应对措施:ida调试跟踪后内存加密数据解密还原及加密算法提取完毕后,将密钥的内存数据和修改后的内存数据地址作为idc脚本输入,打印输出生成的加密数据或指令,从而利用UE修改so,实现永久修改的目的,后续直接跟踪调试so即可。
将下面的脚本保存为xx.idc后在ida中shrift+F2导入执行即可。
import idaapi
import struct
#input
def dump24c8(start, len, key, target):
rawInc = idaapi.dbg_read_memory(start, len)
offset = start-0x70d1a4c8
rawIncByte = bytearray(rawInc)
rawIncHex = struct.unpack('<I', rawInc)[0]
print 'rawIncHex is ' + str(hex(rawIncHex))
rawkey = idaapi.dbg_read_memory(key, 0x6C)
rawkeyByte = bytearray(rawkey)
#rawkeyHex = struct.unpack('<I', rawkey)[0]
#print 'rawkeyHex is ' + str(hex(rawkeyHex))
#rawdex = "hello"