一、pack分析
现在部分app使用360pack都使用了解析执行,所以写一个简单的demo进行学习。
pack前demo中的onCreate函数smali显示如下图:
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.registers 3
.param p1,"saveInstanceState" #Landroid/os/Bundle;
.prologue
.line 14
invoke-super {po,p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
.line 15
const v0,0x7f040019
invoke-virtual {p0,v0}, Lcom/example/a71037/testos/MainActivity;->setContentView(I)v
.line 17
return-void
.end method
使用加固宝加固后的onCreate函数smali显示如下图:
# virtual methods
.method protected native onCreate(Landroid/os/Bundle;)v
.end method
360加固解析执行的文件是libjiagu.so运行时在内存释放的,故需要单步调试dump这个文件。使用IDA pro+android_server进行动态调试,具体步骤如下:
第一、安装IDA Pro服务器
adb push android_server /data/local/tmp
设置服务器运行权限
cd data/local/tmp/
chmod 777 android_server
运行服务:
adb shell & cd /data/local/tmp & ./android_server
设置端口转发:
adb forward tcp:23946 tcp:23946
第二、调试运行
adb shell am start D n Android.support.v8/android.support.v7.q448870015
第三、附加进程调试
Debugger > Attach
Ctrl+F 搜索 android.support.v8
第四、函数下断点
Modules中搜索 libc.so 给fopen,fgets下断点 Modules 中搜索 libdvm.so
给dvmDexFileOpenPartia 下断点
第五、jdb调试
打开monitor,鼠标选中要调试的进程(android.support.v8)
jdb–connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700
从内存中dump出so文件后,将其重命名为 libVM 。因为ELF文件映射到内存中会有内存对齐,所以需要使用十六进制工具进行修改。使用010 Editer 打开并执行ELF文件格式解析脚本。修改 program_table_element[3]数组,将Elf32_Off 的偏移修改成与Elf32_Addr相同的偏移。将Elf32_Word p_Filesz 的大小修改成与Elf32_Word p_memsz 相同的大小。修改program_table_element[7]数组,将Elf32_Off 的偏移修改与Elf32_Addr相同的偏移。将Elf32_Word p_Filesz 的大小修改成与Elf32_Word p_memsz 相同的大小。至此可以使用 IDA pro 静态分析libVM文件了。
二、libVM分析
从单步调试中可以知道,JNI_OnLoader函数主要的作用是进行dex文件解密,DexClassloder替换,使用registerNativeMethods函数进行注册(在dex壳文件中会有大量的Native函数),虚拟执行的初始化
处理方法: