一步一步走進Linux HOOK API 四

2021-07-16 03:22:51 字數 1889 閱讀 7141

這一節主要是講述的是符號節.

要怎麼才能找到符號節呢

,其實只要在上一期講的遍歷節頭的時候

,判斷每乙個節型別是不是sht_symtab或

sht_dynsym,那麼相應的節就是乙個符號節了

,符號節存放的是一張符號表

,符號表也是乙個連續儲存的結構陣列

.那什麼叫符號呢?

程式設計過程中用到的變數和函式都可以稱之為符號,乙個

elf檔案中並不只有乙個符號節

,通常是兩個

,乙個叫動態節

,列印名稱為

".dynsym",它的型別是sht_dynsym,所有引入的外部符號在這裡有所體現

.另乙個型別值為sht_symtab,名字為

".symtab",它儲存了所有有用的符號資訊

.[cpp]view plain

copy

typedef

struct

elf32_sym;  

st_name;符號的名字索引

這個成員是乙個符號表對應的字串表中的乙個偏移,

對應的字串表可以通過該節

link

成員獲取得到

.st_value;符號位址

該成員給出了相應的符號值,

根據符號型別和用途

,它可能是個記憶體位址或者絕對值

st_size; 

符號的位元組大小

如果是資料物件,

可能給出該資料物件占用的大小

,如果是函式

,可能給出了函式指令占用的大小

.st_info;符號的資訊

這個成員有2

部分組成

,第四位用來表示符號的型別

.高四位表示這個符號的繫結型別

,對於從動態庫引入的函式

,這個欄位就應該為stb_global,表示這個符號是全域性符號.在

elf.h中,

給出了如下2個巨集

,用來獲取符號資訊

[cpp]view plain

copy

#define elf32_st_bind(val)   (((unsigned char) (val)) >> 4)

#define elf32_st_type(val)   ((val) & 0xf)

#define elf32_st_info(bind, type)   (((bind) << 4) + ((type) & 0xf))

st_other;此欄位恒為0

st_shndx; 

每個符號和某些節相關

,這個字段給出了乙個節頭的索引

.如果函式體所在的節不存於當前檔案中,此字段為0.

下面就通過**來看一下,

怎麼獲取這些符號節表的資訊

.**寫的不是很好,

~~示例**:

[cpp]view plain

copy

void

display_dynsym(elf32_ehdr *ehdr,elf32_shdr *shdr)  

}  void

display_sym(elf32_ehdr *ehdr,elf32_shdr *shdr)  

}  void

displaysmby(elf32_ehdr *ehdr,elf32_shdr *shdr)  

else

if(shdr->sh_type == sht_dynsym)  

shdr++;  

}  }  

一步一步走進Docker

docker命令 啟動sudo service docker start 檢視映象 docker images 檢視當前映象 docker ps 進入映象 docker run i t tomcat 1 bin bash 目錄對映 sudo docker run i t v data softwar...

一步一步走進Linux HOOK API 七

我又來啦,今天是本系列介紹 elf檔案的最後一篇教程 跟隨大家一起了解了 elf檔案的大致結構 整個結構其實是很明朗的,根據 elf頭 程式頭,節頭 從節頭里提取不同的型別 到不同的節表內去獲取不同的資訊 今天這裡主要介紹重定位表 也是常用的節表之一 有了符號名和動態庫的名字作業系統就可以為我們引入...

一步一步 Sql Azure

一步一步 sql azure 1.使用 windowsazure 平台賬號登陸 2.新建sqlazure server 3.新建資料庫 4.為sql azure server 新增防火牆規則,只有將本機新增到規則裡才能從本機連線到該sqlazure server 5.連線到sql azure ser...