实际上走的是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的用途 1. 一些全局变量的初始化 (我这里试过, 一些全局变量的初始化,会统一用一个init_array表项来完成初始化) 2. 通过__attribute__ ((constructor)) 声明的函数 (可以定义n个) 通过so加载流程来看,init_array是我们程序代码可以控制的最早的时机了, 其次才加载Jni_onload 所以有些样本会在init...
init启动Zygote时主要调用app_main.cpp的mian函数中的AppRuntime的start方法来启动Zygote进程,这个过程如下: 我们先从app_main.cpp的mian函数来分析,代码如下: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 // /frameworks/base/cmds/app_process/app_main.cppintmain(int argc,char*constargv[]){...whil...
dlopen调用过程中最终是: 目录/bionic/linker/linker_soinfo.cpp soinfo::call_constructors()call_function("DT_INIT", init_func_, get_realpath());call_array("DT_INIT_ARRAY", init_array_, init_array_count_,false, get_realpath());--...
init_array的用途 1. 一些全局变量的初始化 (我这里试过, 一些全局变量的初始化,会统一用一个init_array表项来完成初始化) 2. 通过__attribute__((constructor)) 声明的函数 (可以定义n个) 通过so加载流程来看,init_array是我们程序代码可以控制的最早的时机了, 其次才加载Jni_onload ...
{ "ro.boot.baseband", "ro.baseband", "unknown", }, { "ro.boot.bootloader", "ro.bootloader", "unknown", }, { "ro.boot.hardware", "ro.hardware", "unknown", }, { "ro.boot.revision", "ro.revision", "0", }, }; for (size_t i = 0; i < arraysize(prop_map); i++) {...
在课时⑨中给出的init array的自吐 hook_linker,32位版本解决了,请分析64位版本,尝试给出解决方案并解决。 以8.1为例,查看源码后会发现 dlopen调用过程中最终是 目录/bionic/linker/linker_soinfo.cpp 这个函数是模版函数,把linker拷到IDA上一看,会发现这个函数是唯一的,且参数是4个,同时会发现64位的linker中是...
init,/bin/sh 这四个应用程序进行启动,只要这些应用程序有一个启动了,其他就不启动了.Android 系统一般会在根目录下放一个 init 的可执行文件,也就是说 Linux 系统的 init 进程在内核初始化完成后,就直接通过 run_init_process 函数执行 init 这个文件,该可执行文件的源代码在 system/core/init/main.cpp 中...
目录/bionic/linker/linker_soinfo.cpp 这个函数是模版函数,把linker拷到IDA上一看,会发现这个函数是唯一的,且参数是4个,同时会发现64位的linker中是没有call_function这个函数的,这个函数被优化成了代码片段,插进call_constructors函数和call_array函数中了。
[cpp] view plaincopy1.void import_kernel_cmdline(int in_qemu,void (*import_kernel_nv)(char *name, int in_qemu)) 2.{ 3. char cmdline[1024]; 4. char *ptr; 5. int fd; 6. //打开并读取/proc/cmdline文件 7. fd = open("/proc/cmdline", O_RDONLY); 8. ...