该方法可针对 upx 变种,但Android Linker 的时候不需要section表, 所以我们不能修复 section 表
进行SO层代码脱壳
1. 使用IDA 打开libexec.so,在导出函数中找到.init_proc 函数(0x39A79), 搜索特征码7D 27 00 DF
搜索到下面语句
2.自己编译一个load程序 , 然后ida 附加.
刚好到 死跳转处, 注意 r0和 r1修复program head 有用
3.开始dump 数据,
从基地址开始0x40501000 到0x40559000 结束, 也就是刚才下面一个libexec 的segment结束.
4.修复program head
这里是p_files和p_memsz 是错误的需要修正, 这里大小的计算为
mprotect 函数的参数1 + 参数2 - 模块基地址 结果如下:
0x40511000 + 0x00047490 - 0x40501000 = 0x57490;
并修改第一个(RW_) Loadable Segment的文件偏移,P_offet = p_addr - 0x1000 , 这里 应该修改为 0x57EE0; 下面是修改后的
5.修补数据
打开原始文件 libexec.so 文件定位到
第一个 (RW_) Loadable Segment的p_offset文件偏移0x3AEE0 , p_memsz 大小 (0x4BC8), 这里我们将这一步份数据复制出来, 粘贴到我dump出来的偏移 0x57EE0 处
6. 获得原始init 函数 RVA
定位原始的init 函数地址, 我们返回到刚才调试的IDA 中
0x404E8649就VA了这里我们减掉基地址 0x404D6000 获得RVA为 0x12649, 也可以将上面的死条状指令恢复然后, 一直 F8 经2次返回就可到原始 init 函数
第一次返回:
第二次返回:
7.修改 .init_prot 偏移地址
.init_prot rva= 0x039A79 , 所以我们在刚粘贴的数据中用WinHex 搜索 16进制
0C 00 00 00 79 9A 03 00 //前4个字节是类型标识 后4个字节是函数偏移地址
我们要将这里的 0x39A79 壳代码修改为原始的init函数.最终修改为