2015年12月16日
脱壳基础 dvmDexFileOpenPartial
栗子在此
步骤
附加进程后,在libdvm.so
中的dvmDexFileOpenPartial
函数下断点.
dvmDexFileOpenPartial的函数原型为(位于/dalvik/vm/DvmDex.cpp):123456/* * @addr: 传入参数, dex文件的起始地址 * @len: 传出参数, dex文件的大小 * @ppDvmDex: 传出参数,指向 DvmDex 结构的地址*/int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex)
运行后断下:
得R0为addr,R1为len.
执行脚本:
现在就可以使用baksmali处理dex文件继续分析了.
原理
dalvik虚拟机会把dex文件优化为odex文件,而优化的源代码为/dalvik/dexopt/OptMain.cpp
.
|
|
其中fromzip
和preopt
都会调用processZipFile
先将dex文件提取出来,fromDex
则直接调用dvmContinueOptimization
优化.
|
|
在extractAndProcessZip
中处理zip文件并将dex提取出来,随后调用优化函数.
|
|
dvmContinueOptimization
函数位于/dalvik/vm/analysis/DexPrepare.cpp文件,其中调用了dvmDexFileOpenPartial
.
|
|
dvmDexFileOpenPartial
调用了dexFileParse
,用来解析内存中优化过或未优化过的dex文件,返回dexFile结构.
所以此时dex文件已经被加载进内存,就可以dump出来了.
|
|