根据linker源码,so的执行顺序为:
.preinit_array->-> .init->->.init array->->JNI_Onload->->java_com_XXX; 但so是不会执行 .preinit_array 的, 可以忽略。
还有我们在脱壳的过程中会在一些系统级的.so中下断点比如:fopen,fget,dvmdexfileopen,等等
而.init以及.init_array一般会作为壳的入口地方,那我们索性叫它外壳级的.so文件
这里归纳为三类:
应用级别的:java_com_XXX;
外壳级别的:JNI_Onload,.init,.init_array;
系统级别的:fopen,fget,dvmdexfileopen;
对于在应用级别的和系统级别的就不说了比较简单容易理解。看到上面的.so的加载执行过程我们知道如果说反调试放在外壳级别的.so文件的话,我们就会遇程序在应用级核心函数一下断点就退出的尴尬,事实上多数的反调试会放在这,那么过反调试就必须要在这些地方下断点。
网友评论