X60加固分为前期反调试和后期反调试,前期反调试是保护释放到内存含有native化函数的dex文件和解析器so【含加密的解析器so和解密函数】。前期反调试的位置在jniOnload下的反调试函数case31中的 BLX LR下断,就可以得到各个反调试的位置。
要得到内存的dex,在过完前期反调试后,直接F9再,Ctrl+S,从下往上搜索就能找到dex035,用脚本dump下来就行。
加密解析器so,可以通过静态分析libjiagu.so,在string窗口搜索init,通过交叉引用就可以找到初始化函数,然后再在string窗口搜索*.so ,然后Tab键转换成伪代码,看看是哪个函数之后调用了解析器so的初始化函数。
后期反调试是出现在动态注册过程中,在注册完成mark2和mark3后,就会进入debug080区域,这个区域有反调试逻辑,反调试逻辑的模式:
SUBS R0, R1, R0
ITTT EQ <------------------------------也可能是(IT+N个T) EQ
进入debug080区域,需要单步F7进行调试,到达调用加密的指令数据区前,会有两个这种反调试。在R0寄存器看到调用的加密区域,且后面有ORR的解密标志,就能确定该位置是解密逻辑。之后按照dex文件格式重新将解密区重连接,就可以完成dex修复。
如何知道目标类位于哪个class_def数组呢?通过dex分析,可以知道目标函数所在的method_id,通过010工具的dex解析模板就可以定位该函数,展开后可以看到class_id(这里以0x2bc举例),然后展开头文件,找到class_def_off是多少,在010工具搜索BC02 ,搜索结果的地址第一个大于class_def_off的就是要找的类(这里以mainactivity举例) 在dex_class_def数据区中的起始地址。
用这个地址减去class_def_off 得到的值除以32 【每一个dex_class_def的数组成员由32个字节组成】就可以得到mainactivity是dex_class_def数组中的第几个数组成员。