android自定義linker實現安全加固

轉:https://blog.csdn.net/liumengdeqq/article/details/79247091

mmap的用戶層應用
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize);
具體參數含義
start :  指向欲映射的內存起始地址,通常設爲 NULL,代表讓系統自動選定地址,映射成功後返回該地址。
length:  代表將文件中多大的部分映射到內存。
prot  :  映射區域的保護方式。可以爲以下幾種方式的組合:
                    PROT_EXEC 映射區域可被執行
                    PROT_READ 映射區域可被讀取
                    PROT_WRITE 映射區域可被寫入
                    PROT_NONE 映射區域不能存取
flags :  影響映射區域的各種特性。在調用mmap()時必須要指定MAP_SHARED 或MAP_PRIVATE。
                    MAP_FIXED 如果參數start所指的地址無法成功建立映射時,則放棄映射,不對地址做修正。通常不鼓勵用此旗標。
                    MAP_SHARED 對映射區域的寫入數據會複製迴文件內,而且允許其他映射該文件的進程共享。
                    MAP_PRIVATE 對映射區域的寫入操作會產生一個映射文件的複製,即私人的“寫入時複製”(copy on write)對此區域作的任何修改都不會寫回原來的文件內容。
                    MAP_ANONYMOUS建立匿名映射。此時會忽略參數fd,不涉及文件,而且映射區域無法和其他進程共享。
                    MAP_DENYWRITE只允許對映射區域的寫入操作,其他對文件直接寫入的操作將會被拒絕。
                    MAP_LOCKED 將映射區域鎖定住,這表示該區域不會被置換(swap)。
fd    :  要映射到內存中的文件描述符。如果使用匿名內存映射時,即flags中設置了MAP_ANONYMOUS,fd設爲-1。有些系統不支持匿名內存映射,則可以使用fopen打開/dev/zero文件,
          然後對該文件進行映射,可以同樣達到匿名內存映射的效果。
offset:文件映射的偏移量,通常設置爲0,代表從文件最前方開始對應,offset必須是PAGE_SIZE的整數倍。

返回值:
      若映射成功則返回映射區的內存起始地址,否則返回MAP_FAILED(-1),錯誤原因存於errno 中。

錯誤代碼:
            EBADF  參數fd 不是有效的文件描述詞
            EACCES 存取權限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED則要有PROT_WRITE以及該文件要能寫入。
            EINVAL 參數start、length 或offset有一個不合法。
            EAGAIN 文件被鎖住,或是有太多內存被鎖住。
            ENOMEM 內存不足。
用戶層的調用很簡單,其具體功能就是直接將物理內存直接映射到用戶虛擬內存,使用戶空間可以直接對物理空間操作。

 

開源代碼地址:https://github.com/liumengdeqq/CustomLinker.git        

 一.so的加載過程分析

      

    二.分析系統加載so的原理

     (1)用mmap函數映射so文件的程序頭表格到內存 

             

        (2)映射內存根地址(分配可加載段內存)

         

          (3)映射so可加載段到內存

        

         (4)映射soinfo結構體和重定向

             (5)重定向系統函數

 

           (6)調用初始化函數和函數數組

        (7)還原系統權限

        (8)單個函數加密

      

        三.難點分析

       (1).在android 7.0之後dlopen不返回soinfo結構體,通過讀取maps 獲取基地址讀取系統so的結構體

       (2).在android5.1之後 出現read被pread64函數讀取so的結構

       (3).在android4.1.2 5.0 7.0等page_size 也是內存大小有改變

       (4).在android4.4之後都是c++ 考慮安全問題 用c語言實現

        四.加固前後對比圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章