小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

反匯編:逆向的利器

 新用戶0118F7lQ 2025-10-25

哈嘍,我是子牙老師,一個手寫過操作系統(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)在知道匯編是如何編譯成機器碼的了,你也知道機器碼是如何反匯編成匯編的了,后面的事情就好辦了




02


gdb實現(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)的




03


step 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),你已全部知曉!怎么樣?是不是很痛快!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多