日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

elf文件反编译C语言,图文并茂,讲透C语言静态链接,ELF文件篇

發布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 elf文件反编译C语言,图文并茂,讲透C语言静态链接,ELF文件篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

gcc生成執行文件過程為:源文件(*.c文件)編譯成對象文件(*.o文件);

鏈接程序ld,把對象文件(*.o文件)鏈接成可執行程序。

因此要透徹鏈接的過程, 需要先了解對象文件(*.o文件)是怎樣構成的?

下面用個簡單的例子來說明:

#includeint global_var=5;extern int other_file_var;int main(){ int a=1;

int b=a other_file_var; return 0;

}gcc -c test.c -o test.o 生成test.o;

查看test.o內容(vim test.o):

圖1

看到的是一堆亂碼,因為查看方式不對, 就像mp3格式的文件需要用音樂播放器才能播放一樣,對象文件(*.o)是elf格式的, 需要用objdump, readelf 工具來查看。

從elf格式的官方文檔,可以了解到elf格式文件的結構如下圖所示:

圖2

下面將一個個部分來分析。

1. ELF文件頭(Header)分析

readelf -h test.o查看elf文件頭部信息

主要字段的含義已在圖中標識;

由Size of this headers可知,頭部占用了64字節;

用hexdump -n 64 test.o 查看頭部64字節數據內容(16進制格式);圖中紅框里的數據就是test.o文件的前64字節,也就是elf頭部,對比上面兩圖,(圖1)中的魔數7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 剛好與(圖2)中的前16字節(小段編碼)對應,后面每個字段的含義也是一一對應的;

頭部信息結構可以參考/usr/include/elf.h 里ELf64_Ehdr, 32位的可以參考ELf32_Ehdr結構typedef?struct{

unsigned?char?e_ident[EI_NIDENT];?????/*?Magic?number?and?other?info?*/

Elf64_Half????e_type;?????????????????/*?Object?file?type?*/

Elf64_Half????e_machine;??????????????/*?Architecture?*/

Elf64_Word????e_version;??????????????/*?Object?file?version?*/

Elf64_Addr????e_entry;????????????????/*?Entry?point?virtual?address?*/

Elf64_Off?????e_phoff;????????????????/*?Program?header?table?file?offset?*/

Elf64_Off?????e_shoff;????????????????/*?Section?header?table?file?offset?*/

Elf64_Word????e_flags;????????????????/*?Processor-specific?flags?*/

Elf64_Half????e_ehsize;???????????????/*?ELF?header?size?in?bytes?*/

Elf64_Half????e_phentsize;????????????/*?Program?header?table?entry?size?*/

Elf64_Half????e_phnum;????????????????/*?Program?header?table?entry?count?*/

Elf64_Half????e_shentsize;????????????/*?Section?header?table?entry?size?*/

Elf64_Half????e_shnum;????????????????/*?Section?header?table?entry?count?*/

Elf64_Half????e_shstrndx;?????????????/*?Section?header?string?table?index?*/}?Elf64_Ehdr;由字段Start Of Section Header可知,在test.o文件的656字節處有一個'段的頭部表'。

2. ELF段頭部表(Section Header)分析

用readelf -S test.o查看'段的頭部表',在這個表里保存了文件里所有段的屬性信息,如段的名字,段在文件的開始位置, 段的長度等:

圖4

由圖可知主要字段的含義已從圖中標識;

段表的數據在偏離文件開始的0x290處,跟ELF Header Start Of Section Header字段保持一致;

這個段表里總共有12項,不同的項描述了不同段的屬性;

2.1 text段

text段在偏離test.o文件開頭0x40字節處,長度為0x20字節,用hexdump -s 0x40 -n 0x20 test.o,查看text段的16進制內容。

圖5

然后objdump -d test.o 打印出程序的反匯編代碼,

圖6

由上面兩圖可知,text部分的數據恰好是main函數的機器碼,也就是text段里保存的是代碼段。

2.2 data段

data段在偏離test.o文件開頭0x60字節處,長度為0x4字節,用hexdump -s 0x60 -n 0x4 test.o,查看data段的16進制內容,

圖7

4個字節剛好是個int的長度,里面保存的數值是5,也就是全局變量global_var的值,驗證了已初始化的全局變量保存在data段。

2.3 bss段

2.4 .rela.text (text的重定位段)

main函數里的global_var定義在別的文件,后面鏈接需要根據別的文件來確定它的虛擬內存地址,由于text中有需要重定位的變量,所以就有了.rela.text段。readelf -r test.o

圖8

offset列表示需要重定位的符號在該段中的偏移,這里表示偏離text段0xd處;

info列高4個字節是該符號在.symtab中的索引,見下圖;

圖9

2.5 .symtab 符號表

圖9

ndx列是該符號在段表中的索引:(1)比如global_var的索引為3,圖4中索引3表示data段,

也就是說global_var這個符號在data段;(2)如果是“UND“則表示該符號定義在別的文件,需要重定位,重定位信息見“2.4 .rela.text”。

圖10

總結

以上是生活随笔為你收集整理的elf文件反编译C语言,图文并茂,讲透C语言静态链接,ELF文件篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。