Android7.0對dlopen的改變

來源:互聯網
上載者:User

標籤:自己的   參考   讀取   tle   details   bre   href   尋找   net   

兩個記憶體段

在同一個進程空間中dlopen一個.so檔案,理論上在記憶體中是同一片地區,但實際調試中發現Android7.0(read "/proc/self/maps")中,先後讀同一個.so記憶體中居然出現兩個段!

這在低版本Android(比如4.x)中不曾出現。

如下一些blog中分析,與Android7.0對dlopen的改寫有關,可能是不同命名空間下讀取結果不一樣,可能是對安全性的提升。

Android 7.0 行為變更

NDK 應用連結至平台庫

Android 7.0 dlopen的不同

 

7.0對已載入.so的引用/Hook

由於以上分析,自己的代碼中dlopen的.so檔案與目標程式中載入的.so在不同記憶體段中,故不能直接Hook,要想方法拿到目標程式載入的.so的記憶體位址。

可以用base_addr + offset得到目標方法的地址,base_addr通過尋找 “/proc/self/maps” 得到

//這個方法來自 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:

如何hook dlopen和dlsym底層函數  

Android7.0對dlopen的改變

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.