1、ELF檔案内容解析
readelf: 可解析ELF檔案的所有内容;
strings: 檢視ELF檔案中的字元串;
file : 檢視ELF檔案的資訊;
nm : 檢視ELF檔案中的符号資訊;
ldd : 檢視ELF檔案所依賴的庫檔案;
2、objdump
用于對ELF檔案進行反彙編;
objdump -d ;反彙編部分可執行的二進制代碼;
objdump -D ;反彙編全部的可執行的二進制代碼;
objdump -S ;盡量把可執行的二進制代碼反彙編成源碼;
3、hexdump
以十六進制格式檢視ELF格式的二進制可執行檔案的内容;
hexdump -C elf_file_name
4、od
以指定的進制格式檢視ELF格式的二進制可執行檔案的内容;預設是八進制;
od -t x4 ;-t指定格式化的位元組單元機關;
;x4-每4個位元組為一個單元格式化成十六進制,
;x2-每2個位元組為一個單元格式化成十六進制,
;x1-以1個位元組為一個單元格式化成十六進制;
-t x2 等價于 -x
-A選項指定進制格式:x-十六進制, d-十進制,o-八進制;
如果使用-t指定了十六進制格式,則-A選項就不是必須的了;
5、xxd
以十六進制格式檢視ELF格式的二進制可執行檔案的内容;
xxd ;以小寫的十六進制格式顯示;
xxd -u ;以大寫的十六進制格式顯示;
xxd -s +10 ;以ELF檔案頭處的第1個位元組為參照,從第10個位元組處開始顯示;
xxd -s -10 ;以ELF檔案尾處的第1個位元組為參照,從第10個位元組處開始顯示;
6、編輯ELF檔案
使用vi/vim與指令xxd配合完成;
STEP1:使用vi/vim以二進制模式打開ELF檔案;
vi -b binary_file
vim -b binary_file
STEP2:在vi/vim的指令模式下輸入如下内容,把二進制内容轉換成16進制格式顯示:
:%!xxd -u
STEP3:按照vi/vim正常的編輯方法來修改以十六進制格式顯示的二進制内容;
STEP4:編輯完成之後,在vi/vim的指令模式下輸入以下内容,把十六進制格式顯示的内容轉換回原始的二進制格式:
:%!xxd -r
STEP5:在vi/vim的指令模式下輸入以下内容,儲存二進制格式的ELF檔案:
:wq
---備注---
% :表示目前檔案中顯示的所有行;
!xxd:表示執行外部指令xxd;
格式"%!xxd"表示把目前檔案中的所有行傳遞給外部指令xxd;
7、
動态調試工具
ltrace: 跟蹤ELF檔案或程序對庫函數的調用(library_function_call);
strace: 跟蹤ELF檔案或程序對系統調用的調用(system_call);
gdb : 對一個程式進行調試;使用gcc編譯該程式時需加上選項-g,讓編譯器增加一些調試資訊;
strip : 删除程式中的調試資訊;這些調試資訊是編譯該程式時,gcc編譯器的-g選項添加的;
splint: 檢視一個程式中對未指派變量的引用、未使用的函數參數,等情況;(
靜态檢測)
lsof : 檢視一個程序打開的檔案;
fuser : 檢視正在通路指定的file、filesystem或socket的所有程序的資訊;即:檢視都有哪些程序正在通路指定的file、filesystem或socket;
如果沒有找到任何程序,fuser傳回非零值;如果找到至少一個程序,則fuser傳回0;
-k:該選項會向所有這些程序發送SIGKILL信号,以kill掉所有正在通路指定file、filesystem或socket的所有程序;
-i:在kill掉fuser指令找到的這些程序之前進行必要的提示資訊;
fuser指令顯示的是pid,并且在每個pid後面附加一個字母,用以表示通路方式:
c: 以目錄方式通路;
e: 以可執行檔案方式通路;
f: 以打開檔案方式通路,預設不顯示;
F: 以寫的方式打開檔案進行通路;
r: 以root目錄的方式通路;
m: 以mmap檔案或共享庫的方式通路;
/proc : proc檔案系統中包含程序的所有資訊;