android获得对象地址,android 7.0获取soinfo

烂笔头

7.0开始不再允许获取soinfo对象,贴一下大概流程以及依据:

6.0:

dlopen -> dlopen_ext:返回soinfo* result = do_dlopen(filename, flags, extinfo);

->do_dlopen:soinfo* si = find_library(name, flags, extinfo);return si;

7.0:

dlopen -> dlopen_ext:返回void* result = do_dlopen(filename, flags, extinfo, caller_addr);

->do_dlopen:

soinfo* si = find_library(ns, translated_name, flags, extinfo, caller);

return si->to_handle();

to_handle() -> 判断版本号,调用get_handle()

get_handle() -> 返回handle_

handle_ -> 定义在struct soinfo结构体中,类型为 uintptr_t.

获取方法

LibraryReader *libraryReader = new LibraryReader("/system/bin/linker");

void *soinfo_handles_map = reinterpret_cast(libraryReader->get_symbol_address(

"__dl__ZL20g_soinfo_handles_map"));

std::unordered_map *g_soinfo_handles_map = (std::unordered_map *) soinfo_handles_map;

void *handle = dlopen("/system/lib/libc++.so", 0);

auto it = g_soinfo_handles_map->find((uintptr_t) handle);

void *soinfo = it->second;

LogHex::DumpHexByPrintf(soinfo, 256);

内存打印

3566b1cce1d5

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值