反匯編和逆向工程 為什么有反匯編而沒(méi)有反C的說(shuō)法?
為什么有反匯編而沒(méi)有反C的說(shuō)法?反匯編是指將非匯編目標(biāo)代碼轉(zhuǎn)換成匯編代碼的過(guò)程。您看到的反匯編代碼實(shí)際上是由C編譯器直接從C語(yǔ)言代碼編譯成匯編代碼,而不是從機(jī)器代碼中編譯出來(lái)的。這在調(diào)試階段具有重要意
為什么有反匯編而沒(méi)有反C的說(shuō)法?
反匯編是指將非匯編目標(biāo)代碼轉(zhuǎn)換成匯編代碼的過(guò)程。
您看到的反匯編代碼實(shí)際上是由C編譯器直接從C語(yǔ)言代碼編譯成匯編代碼,而不是從機(jī)器代碼中編譯出來(lái)的。
這在調(diào)試階段具有重要意義。例如,你寫的代碼沒(méi)有語(yǔ)法錯(cuò)誤,但是有一個(gè)邏輯錯(cuò)誤,你很難找到這個(gè)邏輯錯(cuò)誤。此時(shí),在調(diào)試過(guò)程中逐步執(zhí)行反匯編代碼是非常有意義的。讓我給你一個(gè)例子:把變量十進(jìn)制代碼轉(zhuǎn)換成十六進(jìn)制,把十進(jìn)制代碼放在變量TMP中。如果代碼如下所示:
D=(TMP>>4)*10 TMP&0x0f
如果您輸入TMP變量來(lái)存儲(chǔ)十進(jìn)制23(存儲(chǔ)為0x23),然后使用前面的語(yǔ)句更改為十六進(jìn)制,那么D應(yīng)該等于0x17,但實(shí)際上代碼的結(jié)果是0x07,因?yàn)榍懊娴恼Z(yǔ)句代碼雖然沒(méi)有語(yǔ)法錯(cuò)誤,但存在邏輯錯(cuò)誤,運(yùn)算符error “的優(yōu)先級(jí)”高于運(yùn)算符“&;”,導(dǎo)致運(yùn)算結(jié)果錯(cuò)誤。結(jié)合反匯編代碼很容易發(fā)現(xiàn)這種錯(cuò)誤
反匯編和C代碼都可以設(shè)置斷點(diǎn),但調(diào)試反匯編可以獲得更高的精度,因?yàn)橐粋€(gè)C代碼可能由幾十個(gè)匯編代碼組成,而C代碼中的一個(gè)單步可以執(zhí)行十多個(gè)匯編代碼,最基本的計(jì)算機(jī)編程語(yǔ)言是匯編語(yǔ)言。當(dāng)它用作動(dòng)詞時(shí),意味著用匯編語(yǔ)言編寫的程序代碼被編譯并連接起來(lái)生成可執(zhí)行程序。反匯編是這個(gè)過(guò)程的逆過(guò)程,一般用于商業(yè)軟件或病毒以及其他不知道如何編寫源程序的程序。拆卸后,機(jī)器代碼(即由01組成的指令)被翻譯成裝配指令。在一定程度上,人們可以了解程序的編寫方法和所用算法的特點(diǎn),增加反匯編難度的方法有很多,如在程序中添加shell、使用大量的跳轉(zhuǎn)等