Android ELF文件got表符號偏移的確定

眾所周知Android的動態(tài)鏈接器是linker,iOS是dyld,linux是ld-linux.so.2。由于同是linux內(nèi)核,所以Android的linker與linux很相似,最大的區(qū)別就是linker不支持懶綁定,懶綁定的相關知識請參考我的另一篇博客linux plt 的實現(xiàn)。所以當Android的so或可執(zhí)行文件在調(diào)用外部定義的函數(shù)之前l(fā)inker已經(jīng)把函數(shù)的偏移寫到got表中,我們看一下如何通過ELF文件的結構獲取到got表的偏移。

首先我要獲取.dynsym .dynstr .rel.plt三個節(jié)的數(shù)據(jù)

.rel.plt和dynsym的定義如下:

typedef struct{
Elf32_Addr  r_offset;
Elf32_Word  r_info;
} Elf32_Rel;

typedef structelf32_sym{
     Elf32_Word    st_name;
     Elf32_Addr    st_value;
     Elf32_Word    st_size;
     unsignedcharst_info;
     unsignedcharst_other;
     Elf32_Half     st_shndx;
} Elf32_Sym;

獲取.rel.plt每個重定位表所對應的符號的步驟:
1、使用ELF32_R_SYM宏(參數(shù)為.rel.plt的r_info)獲取符號在.dynsym中的偏移
2、找到對應的dynsym在獲取.dynsym的st_name字段,但這個字段不是字符串,也是一個偏移,是.dynstr節(jié)的偏移
3、通過偏移可以獲取到相應的符號

以下代碼來自于網(wǎng)絡,是尋找got符號的程序?qū)崿F(xiàn):

for (i = 0; i < relplt_shdr->sh_size / sizeof(Elf32_Rel); i++){ 
    uint16_t ndx = ELF32_R_SYM(rel_ent->r_info); 
    LOGD("ndx = %d, str = %s", ndx, dynstr + dynsymtab[ndx].st_name);
    if (strcmp(dynstr + dynsymtab[ndx].st_name, symbol_name) == 0) { 
      LOGD("符號%s在got表的偏移地址為: 0x%x", symbol_name, rel_ent->r_offset); 
      offset = rel_ent->r_offset; 
      break;
    } 
    if(read(fd, rel_ent, sizeof(Elf32_Rel)) != sizeof(Elf32_Rel)) {
    LOGD("獲取符號%s的重定位信息失敗", symbol_name); return -1; }
}

如果是一個靜態(tài)綁定的符號獲取方式就是獲取.dynsym結構體st_value字段的值

for(i = 0; i < (dynsym_shdr->sh_size) / sizeof(Elf32_Sym); ++i) { 
    if(strcmp(dynstr + dynsymtab[i].st_name, symbol_name) == 0) { 
        LOGD("符號%s的地址位: 0x%x", symbol_name, dynsymtab[i].st_value); 
        offset = dynsymtab[i].st_value; 
        break; 
    }
 }

以上代碼出自Android GOT表HOOK技術

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,324評論 25 708
  • 1. 背景 在我們的日常工作中經(jīng)常會遇到一些BUG,而且這些BUG發(fā)生在native層,也就是在我們的so共...
    2baf611355d8閱讀 17,493評論 3 41
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 8,141評論 0 27
  • 概要 SO文件是Linux下共享庫文件,它的文件格式被稱為ELF文件格式。由于Android操作系統(tǒng)的底層基于Li...
    羊角包閱讀 26,384評論 1 14
  • 首先是寫倪泥飾演的程羽蒙在和一幫富豪千金一起吃飯的場景,美食方面的卓越表現(xiàn),把她美食專欄作家的頭銜發(fā)揮的淋漓盡致。...
    解憂雜貨店520閱讀 441評論 0 1

友情鏈接更多精彩內(nèi)容