Android7.0 Elf文件读取Elf32_Dyn结果不正确? static void getSegmentInfo(ElfInfo&info,常量Elf32_单词类型,Elf32_Phdr**pPhdr,Elf32_单词*pSize, T*数据){ Elf32_Phdr*_Phdr=findSegmentByType(信息,类型); 如果(_phdr){ 如果(info.handle->fromfile){ 安全设置值(数据,重新解释转换(info.elf\u base+\u phdr->p\u offset)); 安全设置值(pSize,\u phdr->p\u filesz); }否则{ 安全设置值(数据,重新解释转换(info.elf\u base+\u phdr->p\u vaddr)); 安全设置值(pSize,_phdr->p_memsz); } }否则{ LOGI(“查找段失败!”); 出口(-1); } 安全设定值(pPhdr、phdr); } void getElfInfoBySegmentView(ElfInfo&info,常量ElfHandle*handle){ info.handle=句柄; info.elf_base=(uint8_t*)句柄->基; info.ehdr=reinterpret_cast(info.elf_base); info.shdr=reinterpret\u cast(info.elf\u base+info.ehdr->e\u shoff); info.phdr=reinterpret\u cast(info.elf\u base+info.ehdr->e\u phoff); info.shstr=NULL; Elf32_Phdr*动态=空; Elf32_字长=0; getSegmentInfo(info、PT_DYNAMIC和DYNAMIC、size和info.dyn); 如果(!动态){ 逻辑(错误); 出口(-1); } info.dynsz=尺寸/尺寸(Elf32_-Dyn); Elf32_Dyn*Dyn=info.Dyn; }

Android7.0 Elf文件读取Elf32_Dyn结果不正确? static void getSegmentInfo(ElfInfo&info,常量Elf32_单词类型,Elf32_Phdr**pPhdr,Elf32_单词*pSize, T*数据){ Elf32_Phdr*_Phdr=findSegmentByType(信息,类型); 如果(_phdr){ 如果(info.handle->fromfile){ 安全设置值(数据,重新解释转换(info.elf\u base+\u phdr->p\u offset)); 安全设置值(pSize,\u phdr->p\u filesz); }否则{ 安全设置值(数据,重新解释转换(info.elf\u base+\u phdr->p\u vaddr)); 安全设置值(pSize,_phdr->p_memsz); } }否则{ LOGI(“查找段失败!”); 出口(-1); } 安全设定值(pPhdr、phdr); } void getElfInfoBySegmentView(ElfInfo&info,常量ElfHandle*handle){ info.handle=句柄; info.elf_base=(uint8_t*)句柄->基; info.ehdr=reinterpret_cast(info.elf_base); info.shdr=reinterpret\u cast(info.elf\u base+info.ehdr->e\u shoff); info.phdr=reinterpret\u cast(info.elf\u base+info.ehdr->e\u phoff); info.shstr=NULL; Elf32_Phdr*动态=空; Elf32_字长=0; getSegmentInfo(info、PT_DYNAMIC和DYNAMIC、size和info.dyn); 如果(!动态){ 逻辑(错误); 出口(-1); } info.dynsz=尺寸/尺寸(Elf32_-Dyn); Elf32_Dyn*Dyn=info.Dyn; },android,hook,elf,Android,Hook,Elf,我通过上面的代码读取/system/lib/libart.so,然后进行解析,我查看了010editor中的struct dynamic\u link\u表地址是否正确,在Android4.4 DVM中,Elf32\u Dyn*Dyn=info.Dyn;运行的结果是正确的,但在Android7.0中,运行到Elf32\u Dyn*Dyn=info.Dyn;Dyn是不正确的结果在Android6.0之后需要添加偏移量[program header table(R_u_;)可加载段p_vaddr]值

我通过上面的代码读取/system/lib/libart.so,然后进行解析,我查看了010editor中的struct dynamic\u link\u表地址是否正确,在Android4.4 DVM中,Elf32\u Dyn*Dyn=info.Dyn;运行的结果是正确的,但在Android7.0中,运行到Elf32\u Dyn*Dyn=info.Dyn;Dyn是不正确的结果

在Android6.0之后需要添加偏移量[program header table(R_u_;)可加载段p_vaddr]值

所以,这工作很好

static void getSegmentInfo(ElfInfo &info, const Elf32_Word type, Elf32_Phdr **pPhdr, Elf32_Word *pSize,
           T *data) {
    Elf32_Phdr *_phdr = findSegmentByType(info, type);
    if (_phdr) {
        if (info.handle->fromfile) { 
            SAFE_SET_VALUE(data, reinterpret_cast<T>(info.elf_base + _phdr->p_offset));
            SAFE_SET_VALUE(pSize, _phdr->p_filesz);
        } else { 
            SAFE_SET_VALUE(data, reinterpret_cast<T>(info.elf_base + _phdr->p_vaddr));
            SAFE_SET_VALUE(pSize, _phdr->p_memsz);
        }
    } else {
        LOGI("find segment fail!");
        exit(-1);
    }
    SAFE_SET_VALUE(pPhdr, _phdr);
}

void getElfInfoBySegmentView(ElfInfo &info, const ElfHandle *handle) {
info.handle = handle;
info.elf_base = (uint8_t *) handle->base; 
info.ehdr = reinterpret_cast<Elf32_Ehdr *>(info.elf_base); 
info.shdr = reinterpret_cast<Elf32_Shdr *>(info.elf_base + info.ehdr->e_shoff); 
info.phdr = reinterpret_cast<Elf32_Phdr *>(info.elf_base + info.ehdr->e_phoff);
info.shstr = NULL;
Elf32_Phdr *dynamic = NULL;
Elf32_Word size = 0; 
getSegmentInfo(info, PT_DYNAMIC, &dynamic, &size, &info.dyn);
if (!dynamic) {
    LOGI("Error );
    exit(-1);
}
info.dynsz = size / sizeof(Elf32_Dyn);
Elf32_Dyn *dyn = info.dyn;
}