Android逆向之编写和调试init_array

前言

Elf 可执行文件和共享目标文件都有的一个节是 .init_array(类似于PE文件格式的TLS),它先于JNI_OnLoad或者main函数执行,主要用于给编译器生成初始化C或者C++运行时库,为后续代码准备运行时环境。.init_array 节中包含指针,这些指针指向了一些初始化代码,在分析linker 源码中,可以知道节的执行顺序一般为.preinit_array-> .init -> .init_array,在共享目标文件so中.preinit_array中函数是不会执行的,这里我们只说.init_array,很多APK加固方案都在这里有文章。

编写


JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    LOGD("%s" , __FUNCTION__);
    return JNI_VERSION_1_6;
}

//init函数定义,必须为_init
extern "C"  void _init(void){
    LOGD("%s" , __FUNCTION__);
}

__attribute__((constructor,visibility("hidden"))) void init_array_0(void) {
    LOGD("%s" , __FUNCTION__);
}

__attribute__((constructor,visibility("hidden"))) void  init_array_1(void) {
    LOGD("%s" , __FUNCTION__);
}

extern "C" void preinit(int argc, char **argv, char **envp) {
    LOGD("preinit_array never be called in so");
}
__attribute__((section(".preinit_array"))) typeof(preinit) *__preinit = preinit;

调试

调试这部分腾讯扛把子泉哥的blog上已经有所介绍
http://riusksk.blogbus.com/logs/271566148.html ,这里不再重复讲解了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容