先执行IDA动态调试步骤
在JNI_ONLOAD下断点,越往后越好,按ctrl+s查看节点信息,后面的R表示读,W表示写,X表示执行
我们需要的so变成了三个部分,第一个RX表示里面是代码区,对我们没用,最主要的是找到原so文件中被混淆的数据区,其实只需要 RW
但是如果要还原整个so程序的时候,这时候就全都需要弄下来,里面的debug也是需要的
复制上图中的start和end的值到文件中,后面用,执行脚本把so dump出来,如下图,start和end替换成上图中的值,然后点击run即可dump出来,代码如下
# so的dump
static main(void)
{
auto fp, start, end, size;
start = 0x792F1000;
end = 0x79302000;
fp = fopen("D:\\r.so", "wb");
for ( ; start < end; start++ )
fputc(Byte(start), fp);
}
# dex的dump如下,本质相同
static main(void)
{
auto fp, dexAddress, end, size;
dexAddress = 0xA7019000;
size = 0xA701B000;
end = dexAddress + size;
fp = fopen("D:\\classes.dex", "wb");
for ( ; dexAddress < end; dexAddress++ )
fputc(Byte(dexAddress), fp);
}
需要一个bt脚本,ELFTemplate.bt,把下图中2个文件全放进010 Editor 软件中,然后拖入ELFTemplate.bt,在原始so文件中(libnet_crypto.so)中按F5进行解析,接下来目标是把已经解密后的rw.so中的解密部分复制到原始的so文件中
把rw.so中的解密部分复制到 libnet_crypto.so 对应部分,注意此时前面6行是不需要的
复制的目标位置如下
点击下面 char_s_data 进到data的位置,上面说了前面6行是不要的,所以下面红框中的6行是略过的,从 91 9A 04 00的地方开始粘贴,然后 ctrl+s 保存
此时已经完成,so变成了解密后的数据
注意:因为上面我们只复制了数据区,所以基本没啥错误(红区)的地方,但是如果上面的数据区的中间部分有跳转部分,那么dump出来的跳转部分就会多了动态调试的基址,这时候需要把原来so中关于跳转的部分(一般来说是乱码)直接复制到修改的so文件即可,如下图