|
哈嘍,我是子牙老師,一個手寫過操作系統(tǒng)、編程語言、Java虛擬機、docker、Ubuntu系統(tǒng),玩透Windows內(nèi)核、Linux內(nèi)核…的硬核男人 我們用gdb調(diào)試器調(diào)試程序的時候,通過會一邊調(diào)試一邊看c代碼,以確定程序走到那了 ![]() 其實gdb能查看c代碼,是基于gdb能查看匯編代碼實現(xiàn)的。本篇文章就來講講gdb能查看匯編代碼的底層實現(xiàn) gdb查看c代碼的底層原理,后面再問文章細講。如果你對此感興趣,可以關(guān)注公眾號【硬核子牙】,屆時閱讀 先解釋下兩個詞:匯編與反匯編。把人寫的匯編程序編譯成機器碼的過程,稱為匯編過程。將機器碼翻譯成人能看懂的匯編的過程,稱為反匯編過程 接下來,進入正文。以下,enjoy 01匯編與機器碼 開始正式內(nèi)容之前,先來打點基礎(chǔ)吧:介紹下匯編與機器碼。機器碼,還有一個非常學術(shù)的名詞:硬編碼,可能很少人聽過 當你在gdb中執(zhí)行這條命令,就能看到CPU程序計數(shù)器rip指向位置的匯編代碼及機器碼 ![]() 其實早期的程序員是用0跟1進行編程的,打孔機時代。后來發(fā)現(xiàn)這樣編程效率太低了,代碼太難維護了,進入了硬編碼編程時代,就是使用的十六進制編程。發(fā)現(xiàn)這樣還是同樣的問題,于是誕生了編譯器,編程進入了匯編時代。然后進入c時代、c++時代、Java時代…… 其實這里要探討的是:機器碼與匯編的關(guān)系,有規(guī)律嗎?比如0x5a,對應的匯編是pop rdx,是固定的嗎?是的。秘密就在這張圖里 ![]() ![]() 無論是匯編過程,即將匯編語言翻譯成機器碼。還是反匯編過程,將機器碼翻譯成匯編,都是基于這張圖實現(xiàn)的。如果你想玩逆向如病毒、破解、外掛,這個是必學的 舉兩個例子吧 將匯編語言編程成機器碼,如圖 ![]() 將機器碼反匯編成匯編語言 ![]() 如果你想看opcode,需要去查Intel手冊,長這樣 ![]() 是不是像天書?當年學硬編碼的時候,差點沒把頭學炸了。不過痛苦過了,現(xiàn)在是一片坦途,看任何技術(shù),一眼到底 所以你現(xiàn)在知道匯編是如何編譯成機器碼的了,你也知道機器碼是如何反匯編成匯編的了,后面的事情就好辦了 02gdb實現(xiàn) 來看下disas是如何實現(xiàn)的 ![]() 104行,先調(diào)用ptrace函數(shù),request=PTRACE_GETREGS,拿到所有寄存器的指,從中再拿到CPU程序計數(shù)器rip的值 131行,調(diào)用ptrace函數(shù),request=PTRACE_PEEKDATA,拿到程序計數(shù)器處的機器碼,一次最多讀8字節(jié)。調(diào)試器讀內(nèi)存的原理,前面的文章《gdb底層實現(xiàn)原理》,不記得的或不了解的小伙伴去復習一下 140行,基于capstone庫實現(xiàn)將讀到的機器碼進行反匯編 gdb能夠查看反匯編,就是這么實現(xiàn)的 如果你想自實行調(diào)試器,反匯編引擎,除了capstone,這些也可以考慮。這其中名氣最大的,除了capstone,就是LLVM了,后面有空玩玩這個 ![]() 我的課程《從零手寫gdb調(diào)試器》是基于capstone實現(xiàn)的,gdb也是基于capstone實現(xiàn)的 03step over/step out與此 氣氛都到這了,這兩個就可以講了。這兩個是啥,看圖 ![]() 當程序在斷點處停下來了,是不是一般有四個按鈕:continue、step over、step into、step out。其中continue已經(jīng)講過了,在文章《gdb的放過去是怎么做到的》。step into也已經(jīng)講過了,在文章《gdb單步調(diào)試底層原理》?,F(xiàn)在來講step over,單步步過、step out,單步步出 step over的核心是識別函數(shù)調(diào)用指令call,跳過函數(shù)調(diào)用實現(xiàn)的。step out是識別函數(shù)返回指令ret,調(diào)過去實現(xiàn)的 ![]() 你可能想說,call對應的機器碼是0xe8,ret對應的機器碼是0xc3,gdb能夠識別啊,跟前面講的內(nèi)容有什么關(guān)系呢?0xe8有沒有可能就是單純的數(shù)字呢?0xc3有沒有可能是其他指令的一部分呢?所以核心的就是,要精準確定0xe8的含義,所以必須要借助反匯編引擎實現(xiàn) ![]() 至此,關(guān)于單步的所有底層實現(xiàn),你已全部知曉!怎么樣?是不是很痛快! |
|
|
來自: 新用戶0118F7lQ > 《待分類》