android 禁用dlsym_Android7.0对dlopen的改变——读取私有.so结果变化
兩個(gè)內(nèi)存段
在同一個(gè)進(jìn)程空間中dlopen一個(gè).so文件,理論上在內(nèi)存中是同一片區(qū)域,但實(shí)際調(diào)試中發(fā)現(xiàn)Android7.0(read "/proc/self/maps")中,先后讀同一個(gè).so內(nèi)存中居然出現(xiàn)兩個(gè)段!
這在低版本Android(比如4.x)中不曾出現(xiàn)。
如下一些blog中分析,與Android7.0對dlopen的改寫有關(guān),可能是不同命名空間下讀取結(jié)果不一樣,可能是對安全性的提升。
NDK 應(yīng)用鏈接至平臺庫
7.0對已加載.so的引用/Hook
由于以上分析,自己的代碼中dlopen的.so文件與目標(biāo)程序中加載的.so在不同內(nèi)存段中,故不能直接Hook,要想方法拿到目標(biāo)程序加載的.so的內(nèi)存地址。
可以用base_addr + offset得到目標(biāo)方法的地址,base_addr通過查找 “/proc/self/maps” 得到
//這個(gè)方法來自 android inject 用于獲取地址
void* get_module_base(int pid, const char* module_name)
{
FILE *fp;
long addr = 0;
char *pch;
char filename[32];
char line[1024];
if (pid < 0) {
/* self process */
snprintf(filename, sizeof(filename), "/proc/self/maps", pid);
}
else {
snprintf(filename, sizeof(filename), "/proc/%d/maps", pid);
}
fp = fopen(filename, "r");
if (fp != NULL) {
while (fgets(line, sizeof(line), fp)) {
if (strstr(line, module_name)) {
pch = strtok(line, "-");
addr = strtoul(pch, NULL, 16);
if (addr == 0x8000)
addr = 0;
break;
}
}
fclose(fp);
}
return (void *)addr;
}
參考blog:
總結(jié)
以上是生活随笔為你收集整理的android 禁用dlsym_Android7.0对dlopen的改变——读取私有.so结果变化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: api 原生hbase_Hbase常用a
- 下一篇: 头条上python广告_满大街都是Pyt
