More Related Content Similar to ch7-pv1-modules Similar to ch7-pv1-modules (20) ch7-pv1-modules4. 4
7.a ELF 介紹
optional
ELF Header
Program Header
Table(k 項 )
Section 1
Section 2
Section n
Section Header
Table(n 項 )
ELF Header
Program Header
Table(k 項 )
Segment 1
Section Header
Table(n 項 )
Segment k
optional
section 有各自的大小
有些 section 會出現在 table 之後
1 個 segment
由 1 到多個 section 組成
許多 section
不會對應到 segment
在硬碟上的執行檔 準備要執行的執行檔
( 依舊在硬碟上 )
7. 7
7.a ELF 介紹
userspace
kernelspace
由 ld.so 做解析 , 重定
(run time)
由 kernel 做解析 , 重定
VA
有些 symbol(ex: function) 的值 (ex: address)
要到 runtime 才會確定
從未知到確定 , 就稱為重定 (relocation)
由 ld 做解析
(compile time)
0x00000000
relocatable
executable
so
coredump
27. 27
0 1 2 3 4 5 6 7 8 9
0 . t e x t 0 . d a
t a 0 . r o d a t a
0
0
10
20
0 1 2 3 4 5 6 7 8 9
0 a d d 0 m a i 0 e
0tix
0
10
20
__ksymtab_gpl
__ksymtab_strings
.rodata
.exit.text
.init.text
.text
.strtab
.symtab
.shstrtab
.bssmodule 初始需要的 code 和 data
程式本體 ( 組語 )
module 卸載需要的 code 和 data
常數 , 唯讀
開放給 kernel 裡 GPL 相容部份使用 ( 字串 )
開放給 kernel 裡 GPL 相容部份使用 (struct)
無初值的變數 , 可讀寫
section name( 字串 )
struct symbol
symbol name( 字串 )
elf32_sym
st_name
st_value
st_shndx
kernel_symbol
value
name
.data
__param
.modinfo
modinfo 可以看到的資訊
0 1 2 3 4 5 6 7 8 9
0 a d d 0 m a i 0 e
0tix
0
10
20
( 我猜類似這樣 )
31. 31
50
45
40
35
30
20
15
10
53
load_info
hdr
sechdrs
secstrings
strtab
52
25
mod
0x00000000
1. 把 module 從 userspace
複製到 kernelspace 的 tmp memory
2. 建立此 module 的 load info & 設定 mod 指向位置
5
0
module
state init_size
list core_size
name init_text_size
syms core_text_size
crcs arch
num_syms taints
extable source_list
module_init waiter
module_core exit
num_gpl_syms symtab
gpl_syms num_symtab
gpl_crcs strtab
gpl_future_syms sect_attrs
num_exentries percpu
gpl_future_crcs notes_attrs
init target_list
num_gpl_future_syms args
36. 36
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
5. 分配 final memory 空間 & 複製
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
rodata
data
core
.bss
37. 37
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
rodata
data
core
.bss
38. 38
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
43. 43
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8.
50
45
40
35
20
15
10
52
25
5
0
30
53
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
44. 44
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section
50
45
40
35
52
53
.init.text text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
text
core
.bss
20
10
25
5
30
15
0
45. 45
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
50
45
40
35
20
10
52
25
5
30
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.bss
15
0
46. 46
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
.rel.text
47. 47
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
48. 48
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
r_offset
49. 49
5. 分配 final memory 空間 & 複製 & 更新 mod 指標
6. 新增其它 section 資訊到 struct module
7. 解析每個 symbol 的 value
未定義的 symbol, 會去 kernel 和已載入的 module 找
8. 找出 non-debug 的 .rel section & 重定對應的 section
.init.text
init
.strtab
.symtab(resolved)
.text
core
elf32_rel
r_offset
r_info
.rel.text
elf32_rel
r_offset
r_info
elf32_rel
r_offset
r_info
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
elf32_sym
st_name
st_value
st_shndx
.text
r_offset
51. 51
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
50
45
40
35
52
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
20
10
25
5
30
15
0
52. 52
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
.gnu...this_module
.gnu...this_module
53. 53
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
54. 54
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
12. 把 module 串進系統
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
55. 55
9. 從 init 部份的 symtab 和 strtab, 複製部份到 core 部份
10. 確認 module 是否已載入過
11. 檢查整個系統有無重複 symbol
12. 把 module 串進系統
13. 剖析 module argument( 無圖 )
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
modules
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__ksymtab_gpl
.gnu...this_module
__ksymtab
__ksymtab_gpl_future
__start___ksymtab
__start___ksymtab_gpl
__start___ksymtab_gpl_future
56. 56
load_info
hdr
sechdrs
secstrings
strtab
.modinfo
mod
0x00000000
14. 釋放 tmp memory
50
45
40
35
52
53
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
20
10
25
5
30
15
0
57. 57
mod
0x00000000
14. 釋放 tmp memory
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
58. 58
mod
0x00000000
14. 釋放 tmp memory
15. 初始化 module
.init.text
init
.strtab
.symtab(resolved)
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
59. 59
mod
0x00000000
14. 釋放 tmp memory
15. 初始化 module & 釋放 final memory 的 init 部份
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
65. 65
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
66. 66
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module_use
source_list
source
target_list
target
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
67. 67
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係 & 資料結構
.text
.exit.text
.rodata.str1.4
.rodata
__ksymtab_strings
__ksymtab_gpl
.ARM.exidx.init.text
.ARM.extab.init.text
.ARM.exidx.exit.text
.ARM.extab.exit.text
__param
.modinfo
.ARM.extab
.ARM.exidx
.note.gnu.build-id
.gnu...this_module
.data
core
.strtab(partial)
.symtab(partial)
.bss
nf_conntrack
module
source_list
target_list
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4
68. 68
modules
.gnu...this_module
.gnu...this_module
0x00000000
1. 確認 module 是否在系統裡
2. 檢查該 module 有無被使用
3. 使用該 module 的 exit( )
4. 從系統 module list 移除
5. 移除使用關係 & 資料結構 & 釋放 module
module
source_list
target_list
nf_conntrack_ipv4
module
source_list
target_list
iptable_nat
module
source_list
target_list
nf_conntrack_ftp
module
source_list
target_list
nf_nat
module
source_list
target_list
nf_defrag_ipv4