命令使用
objdump可以對可執行文件進行反匯編
其常用參數為:
- objdump -d <file(s)>: 將代碼段反匯編;
- objdump -S <file(s)>: 將代碼段反匯編的同時,將反匯編代碼與源代碼交替顯示,編譯時需要使用-g參數,即需要調試信息;
- objdump -C <file(s)>: 將C++符號名逆向解析
- objdump -l <file(s)>: 反匯編代碼中插入文件名和行號
- objdump -j section <file(s)>: 僅反匯編指定的section
反匯編輸出結果解析
有很多個參數,這里先從基本的反匯編開始,即-d參數的輸出
段
objdump進行反匯編后的輸出結果通常包含多個段,每個段對應于可執行文件或共享庫的不同部分
一些常見段:
- .text:包含程序的機器碼指令,即可執行代碼.反匯編結果中大部分內容來自于這個段
- .data:程序的初始化數據.可能包含全局變量和靜態變量
- .rodata:只讀數據,如常量字符串.這些數據是只讀的,不允許被修改
- .bss:未初始化的全局和靜態變量.只包含變量的大小和位置信息,不包含實際的數據
- .plt:過程鏈接表(Procedure Linkage Table),包含用于進行動態鏈接的代碼
- .got:全局偏移標(Global Offset Table),包含全局變量和函數的地址
- .eh_frame:異常處理框架信息,用于處理異常可展開棧
- .comment:包含于目標架構/編譯器版本等相關的注釋信息
- .fini:包含在程序退出時執行的代碼,用于清理和收尾工作
- .init:通常包含在程序啟動時執行的代碼,用于初始化和準備運行時環境。
NT:實際的輸出內容會根據目標文件的類型和編譯選項而有所不同.可以使用objdump -h 可執行文件
查看更詳細的段信息,其中包含每個段的起始地址\大小等信息
如一個簡單的文件讀取C代碼,編譯后為可執行文件hi,進行反編譯后用objdump -h hi
查看段信息為