实际上走的是do_dlopen,do_dlopen在linker中,源码位于/bionic/linker/linker.cpp 其中find_library会先查找已加载的so,如果没有找到,最终会调用 load_library去加载so,这里不在详述。 我们的主要目标.init和.initarray的加载位置就位于call_constructors这个函数中 可见在call_constructors会调用call_function去调用.in...
一、为什么要调试init_array init_array的用途 1. 一些全局变量的初始化 (我这里试过, 一些全局变量的初始化,会统一用一个init_array表项来完成初始化) 2. 通过__attribute__ ((constructor)) 声明的函数 (可以定义n个) 通过so加载流程来看,init_array是我们程序代码可以控制的最早的时机了, 其次才加载Jni_...
同样在调试的ida中下好断点, 第2个断点就是调用.init_array数组的代码 然后按F9,注意观察寄存器窗口, 当有显示调试的是你想要断的so的时候开始注意 当断点断在BLX R4的时候,下一步就是调用init_array数组了, 所以F7跟进去 在直接把我们想要分析的so拖到ida分析进行验证, 代码一样, 说明我们成功的断点在了init...
init_array
以下将怎样在init_array下断点,首先要找到so的init_array端。把so拖入ida,然后按Crtl+s,会出现该so的全部段。例如以下: 进入.init_array。例如以下: 当中sub_2378就是init_array的代码。 我们在这里下断点,详细调试的步骤和在JNI_ONLOAD下断点调试是一样的。參考安卓逆向学习笔记(5) - 在JNI_Onload 函...
我们要hook的init_array就在dlopen的时候通过do_dlopen->call_constructors->call_array->call_function就已经运行了。这个流程走完后,loadLibrary才算作结束,所以我们再hook init_array中的函数的时候已经不会再次运行了。 接下来尝试hook linker 中的call_xxx...
在课时⑨中给出的init array的自吐 hook_linker,32位版本解决了,请分析64位版本,尝试给出解决方案并解决。 2. 分析 以8.1为例,查看源码后会发现。 dlopen调用过程中最终是: 目录/bionic/linker/linker_soinfo.cpp soinfo::call_constructors()call_...
public void initarray()代表共有函数 执行完毕没有返回值 根据函数名字里面的内容应该是要初始化数组的 C#的定义方式 例如:定义public class Myclass { int method();} 调用要先实例化:Myclass myclass = new Myclass();int i = myclassmethod();基本就是个这。class Name { public...
IDA脱壳定位 init 或init_array函数解析 定位 init 或init_array函数 _Z17dvmLoadNativeCodePKcP6ObjectPPc ThreadStatus oldStatus = dvmChangeStatus(self, THREAD_VMWAIT);handle = dlopen(pathName, RTLD_LAZY);//此so没有被加载过,调用dlopen加载此so dvmChangeStatus(self, oldStatus);dlopen函数源码: void...
static void call_constructors() { for (void (*const* a)() = __init_array_start; a != _...