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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

elf文件反编译C语言,ELF文件解析和反汇编

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 elf文件反编译C语言,ELF文件解析和反汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先來看一段Unix/Linux下的匯編代碼:

#PURPOSE: This program finds the maximum number of a

# set of data items.

##VARIABLES: The registers have the following uses:

## %edi - Holds the index of the data item being examined

# %ebx - Largest data item found

# %eax - Current data item

## The following memory locations are used:

## data_items - contains the item data. A 0 is used

# to terminate the data

#

.section .data

data_items:

.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

.section .text

.globl _start

_start:

movl $0, %edi

movl data_items(,%edi,4), %eax

movl %eax, %ebx

start_loop:

cmpl $0, %eax

je loop_exit

incl %edi

movl data_items(,%edi,4), %eax

cmpl %ebx, %eax

jle start_loop

movl %eax, %ebx

jmp start_loop

loop_exit:

movl $1, %eax

int $0x80

被紅色注釋的部分就是匯編代碼,先大概的解釋一下這段代碼的意思。.section .data表示的是數據段。

data_items:

.long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

表示的是定義的一個long型的數組。

.section .text 表示的是代碼區段。下面的部分就是真正的代碼部分。

.globl _start 表示的定義了一個全局的標識符_start,相當C語言中的標簽作用,_start要被鏈接器使用,相當C語言中的main函數一樣,是整個程序的入口。

用%edi寄存器中的值表示數組下標

movl data_items(,%edi,4), %eax

movl %eax, %ebx

表示把取數組data_items中的第%edi的值,存放至寄存器%eax,同時%ebx表示的是數組中的最大值,初始化為數組的第一個元素。

start_loop,loop_exit都屬于標簽性質。

cmpl $0, %eax

je loop_exit

因為我們定義數組的時候,最后一個元素為0,即0為哨兵,比較%eax和0,如果相等的話,表示程序已經完成,跳轉至loop_exit處執行。

incl %edi

movl data_items(,%edi,4), %eax

cmpl %ebx, %eax

否則移動數組下標,取數組的下一個元素值,與%ebx進行比較,若%eax中的值比%ebx值大,則將%eax值給%ebx,保持%ebx維持是數組的最大值。

movl $1, %eax

int $0x80

表示exit退出,并且退出碼為1.

上面所講的就是該段匯編代碼的涵義。.

把上述的匯編代碼編輯在test.s文檔中,然后執行下面的命令:

as test.s -o test.o

ld test.o -o test

Unix/Linux中的可執行文件都是采用的ELF文件格式標準,但是有3中不同的類型:

<1>.可重定位的目標文件(Relocatable Object file)

<2>.可執行文件(Executable file)

<3>.共享庫(Shared library)

我們通過分析ELF文件的組成,來了解編譯和鏈接的過程。

我們用Linux下帶的工具來查看elf文件,用下述命令即可:

$ readelf -a test.o

ELF Header:

Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class: ELF32

Data: 2's complement, little endian

Version: 1 (current)

OS/ABI: UNIX - System V

ABI Version: 0

Type: REL (Relocatable file)

Machine: Intel 80386

Version: 0x1

Entry point address: 0x0

Start of program headers: 0 (bytes into file)

Start of section headers: 200 (bytes into file)

Flags: 0x0

Size of this header: 52 (bytes)

Size of program headers: 0 (bytes)

Number of program headers: 0

Size of section headers: 40 (bytes)

Number of section headers: 8

Section header string table index: 5

...

上面的就是被解讀出來的elf文件信息。

ELF Header中描述了操作系統是UNIX,體系結構是80386。Section Header Table中有8個Section Header,在文件中的位置(或者叫文件地址)從200(0xc8)開始,每個40字節,共320字節,到文件地址0x207結束。這個目標文件沒有Program Header。

如果想要從目標文件反匯編的話,可以執行下述命令即可。

$ objdump -d test.o

test.o: file format elf32-i386

Disassembly of section .text:

00000000 <_start>:

0: bf 00 00 00 00?mov $0x0,%edi

5: 8b 04 bd 00 00 00 00?mov 0x0(,%edi,4),%eax

c: 89 c3?mov %eax,%ebx

0000000e :

e: 83 f8 00?cmp $0x0,%eax

11: 74 10?je 23

13: 47?inc %edi

14: 8b 04 bd 00 00 00 00?mov 0x0(,%edi,4),%eax

1b: 39 d8?cmp %ebx,%eax

1d: 7e ef?jle e

1f: 89 c3?mov %eax,%ebx

21: eb eb?jmp e

00000023 :

23: b8 01 00 00 00?mov $0x1,%eax

28: cd 80?int $0x80

上面右邊的代碼就是反匯編后生成的代碼,對比一下本身的代碼和反匯編后的有何區別,會發現很多該出現地址的地方都是0,這是因為程序只有在鏈接的時候才會真正的把函數以及變量的地址加載進代碼中來。

我們對可執行程序反匯編一下,就知道結果了:

$ objdump -d test

test: file format elf32-i386

Disassembly of section .text:

08048074 <_start>:

8048074: bf 00 00 00 00?mov $0x0,%edi

8048079: 8b 04 bd a0 90 04 08?mov 0x80490a0(,%edi,4),%eax

8048080: 89 c3?mov %eax,%ebx

08048082 :

8048082: 83 f8 00?cmp $0x0,%eax

8048085: 74 10?je 8048097

8048087: 47?inc %edi

8048088: 8b 04 bd a0 90 04 08?mov 0x80490a0(,%edi,4),%eax

804808f: 39 d8?cmp %ebx,%eax

8048091: 7e ef?jle 8048082

8048093: 89 c3?mov %eax,%ebx

8048095: eb eb?jmp 8048082

08048097 :

8048097: b8 01 00 00 00?mov $0x1,%eax

804809c: cd 80?int $0x80現在反匯編的代碼中已經把絕對地址都加在進程序中了。從這個角度來理解編譯和鏈接應該更深入一些,編譯只是檢查語法錯誤,對應的地址都是虛擬地址(即被MMU單元截獲了地址),鏈接時,把虛擬地址轉化為絕對地址,加載進可執行文件中。

總結

以上是生活随笔為你收集整理的elf文件反编译C语言,ELF文件解析和反汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

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