新聞中心
反匯編是一種將機(jī)器碼轉(zhuǎn)換為匯編代碼的過程。在Linux下使用反匯編工具進(jìn)行分析,可以幫助程序員理解系統(tǒng)調(diào)用以及程序的執(zhí)行過程。而C語言作為系統(tǒng)編程的主流語言,深入理解其反匯編原理則有助于編寫更加高效和可靠的程序。

創(chuàng)新互聯(lián)服務(wù)緊隨時代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10多年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對網(wǎng)站進(jìn)行成都網(wǎng)站設(shè)計、成都做網(wǎng)站、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。
1. 反匯編的基礎(chǔ)概念
在Linux下,反匯編工具主要有objdump和gdb兩種。objdump是一種命令行工具,可以查看程序的匯編語言,但不能進(jìn)行調(diào)試;gdb是一種調(diào)試工具,可以通過反匯編對程序進(jìn)行調(diào)試。
反匯編的基本原理就是將二進(jìn)制文件轉(zhuǎn)換為匯編代碼。匯編代碼是一種類似于C語言的低級語言,它更接近于機(jī)器語言。反匯編的過程可以將二進(jìn)制代碼轉(zhuǎn)換為匯編代碼,使程序員能夠更好地理解程序的執(zhí)行過程。
2. C語言與反匯編的關(guān)系
C語言是一種高級編程語言,其代碼可以通過編譯器轉(zhuǎn)換為機(jī)器語言。反匯編可以將機(jī)器語言轉(zhuǎn)換為匯編代碼,因此C語言代碼可以通過反匯編工具轉(zhuǎn)換為相關(guān)的匯編代碼。通過反匯編,程序員可以理解C語言代碼的實(shí)際執(zhí)行過程以及其與機(jī)器指令的關(guān)系。
例如,下面是一個簡單的C語言程序:
“`
#include
int mn() {
printf(“Hello, World!”);
return 0;
}
“`
通過反匯編,可以將其轉(zhuǎn)換為以下匯編代碼:
“`
0x0000000000400536 : push %rbp
0x0000000000400537 : mov %rsp,%rbp
0x000000000040053a : mov $0x4005c4,%edi
0x000000000040053f : mov $0x0,%eax
0x0000000000400544 : callq 0x400430
0x0000000000400549 : mov $0x0,%eax
0x000000000040054e : pop %rbp
0x000000000040054f : retq
“`
可以看到,程序的執(zhí)行流程由匯編代碼表示。通過理解程序的反匯編結(jié)果,程序員可以更好地優(yōu)化其代碼,提高程序的性能。
3. 深入理解反匯編的目的
除了幫助程序員理解程序的執(zhí)行過程,反匯編還有其他重要的作用。
在安全領(lǐng)域中,反匯編可以用于逆向工程,即對閉源軟件進(jìn)行分析。逆向工程可以幫助安全專家檢測軟件漏洞并進(jìn)行修補(bǔ),從而確保軟件的安全性。
此外,反匯編還可以用于學(xué)習(xí)和探索。通過反匯編Linux操作系統(tǒng)的核心部件,比如內(nèi)核和驅(qū)動程序,可以更好地理解操作系統(tǒng)的內(nèi)部機(jī)制和工作原理。通過深入理解操作系統(tǒng)的反匯編,開發(fā)人員可以編寫更加高效且卓越的系統(tǒng)程序。
相關(guān)問題拓展閱讀:
- 用c-free5.0編譯一個C程序后,如何用c-free查看這個程序的反匯編代碼呢?像OD一樣查看
- 什么軟件能將C語言的執(zhí)行文件反匯編為匯編源代碼
用c-free5.0編譯一個C程序后,如何用c-free查看這個程序的反匯編代碼呢?像OD一樣查看
c-free默認(rèn)的調(diào)試器是gdb??梢赃@樣查看:
1.給程序下斷點(diǎn)。
2.點(diǎn)擊debug菜單下的start debug。程序停在斷點(diǎn)處。
3.點(diǎn)擊debug菜單雹兄最下邊的Console.彈出gdb的窗口。
4.在此窗口最下邊的命令行編輯框輸入:disassemble ,點(diǎn)擊“Enter”按鈕。游肆逗就會看到反匯編的神賣代碼。
其實(shí)就是gdb的運(yùn)用。
更詳細(xì)的信息:
什么軟件能將C語言的執(zhí)行文件反匯編為匯編源代碼
用一個反匯編調(diào)試器即可。
IDA或者OllyDbg,方便直觀,當(dāng)然VC也有自帶的調(diào)試器,不過很麻煩,不如IDA或者OD方便。
補(bǔ)充:
DLL 屬于可執(zhí)行文件中的一類,又稱為動態(tài)鏈接庫,不能直接用DEBUG加載,一般由應(yīng)用程序因使用該庫中的函數(shù),而由操作系統(tǒng)在應(yīng)用程序加載的同時被加載入特定地址,這個地址一般是DLL在鏈接時指定的。當(dāng)DLL被加載到運(yùn)行空間,根據(jù)輸出函數(shù)表,可以得到各個函數(shù)的入口地址,然后用DEBUG在各個入口下斷點(diǎn),調(diào)用該函數(shù)時DEBUG將跟蹤進(jìn)入該函數(shù),從而實(shí)現(xiàn)反匯編。
反匯編屬于逆向工程,逆向工程的主要手段有兩大類,其中一類是動態(tài)分析,另一類是靜態(tài)分析。
前面提到的方法屬于動態(tài)分析,由DEBUG實(shí)現(xiàn)反匯編,該方法不容易得到完整的代碼,一般只能形成一段一段獨(dú)立分散的代碼,同時由于DEBUG的局限性,反匯編的代碼質(zhì)量多不高,生成的代碼不能直接使用,原因在于DLL在加載時若沒有加載到指定地址空間,操作系統(tǒng)將對代碼進(jìn)行重定向,所以DEBUG只能得到重定向后的代碼,這類代碼必須修改每一個重定向點(diǎn),才能形成可執(zhí)行代碼。作為WINDOWS32位操作系統(tǒng), OLDBG是最為優(yōu)秀的調(diào)試、跟蹤、反匯編工具,多窗口運(yùn)行搜戚和,可以方便的通過窗口操作完成各類動作,而不需要像一般DEBUG那樣由命令行來完成,OLDBG還有許多一般調(diào)試器不具備的功能,同時由于每一代高手不斷的修改,使其具有多種功能,同時帶來的就世盯是混亂,誰也不知道有多少版本,誰也不清楚每個版本到底增加了什么功能,但就這樣,也是瑕不掩疵, OLDBG任然是DEBUG中最強(qiáng)大,更好使用的。
靜態(tài)分析和動態(tài)分析不同,靜態(tài)分析直接打開原程序,加載而不運(yùn)行,然后直接分析加載的代碼。目前靜態(tài)分析工具,最強(qiáng)大的當(dāng)屬IDA,IDA支持幾乎所有種類的匯編語言。
IDA加載應(yīng)用程序有許多選項(xiàng),可以選擇完整的加載整個程序,也可以選擇加載程序的某個塊,一般可選擇的是否加載文件頭、資源表、輸入表、輸出表等等。
IDA還支持調(diào)試,也就是說,當(dāng)你在進(jìn)行反匯編過程時,可以直接使用IDA來調(diào)試跟蹤,以分析代碼的動態(tài)執(zhí)行情況,不過就動態(tài)跟蹤來說,OLDBG更為強(qiáng)大。
IDA反匯編的正確率和代碼的復(fù)雜程度有關(guān),對于正規(guī)開發(fā)的代碼仔襲,尤其是如果能夠獲得源程序的調(diào)試文件,即所謂的PDB文件,IDA可以讀取PDB文件中的信息,使得反匯編的效率和準(zhǔn)確度大為提高,生成的代碼甚至比源代碼易讀。IDA將反匯編生成的結(jié)果存入IDB文件中。當(dāng)你確認(rèn)反匯編的結(jié)果達(dá)到你的要求,可以讓IDA輸出匯編源代碼,IDA也提供其他格式的輸出,例如HTML文件,便于用戶閱讀。樓主主要是用于分析DLL文件,一般來說這類文件更適合做靜態(tài)分析,所以推薦使用IDA來進(jìn)行。
IDA對于分析那些加殼或含有大量花指令、混淆代碼、垃圾代碼的程序,反匯編的正確率會大為下降,因?yàn)镮DA無法正確的確認(rèn)當(dāng)期位置上的數(shù)值是屬于代碼,還是屬于數(shù)據(jù),是普通C字符,還是DELPHI的字符串,還是UNICODE字符串,是結(jié)構(gòu)數(shù)據(jù)還是數(shù)組還是類表(DELPHI生成的代碼中含有大量的類表)等等。遇到這種情況,就需要使用者掌握許多技巧,例如可以通過使用者對當(dāng)前數(shù)據(jù)的認(rèn)識,指導(dǎo)IDA如何處理當(dāng)前的數(shù)據(jù)。對于大批量的,具有某些規(guī)律的數(shù)據(jù),IDA還提供了腳本語言(文件尾位idc),通過對腳本的執(zhí)行來指導(dǎo)IDA如何進(jìn)行反匯編。對于更為復(fù)雜的情況,例如程序是自解壓運(yùn)行的,這時IDA就沒有任何能力來進(jìn)行正確的分析,通常都會用OLDBG動態(tài)跟蹤,等程序完成自解壓后從內(nèi)存中將解壓后的代碼完整的挖下來形成文件,再由IDA進(jìn)行靜態(tài)分析。
對于成功進(jìn)行反匯編的代碼,IDA根據(jù)代碼的入口、調(diào)用、轉(zhuǎn)移等指令,可以為使用者提供各種格式的程序的流程圖,IDA提供許多格式由用戶選擇,便于用戶理解程序的結(jié)構(gòu)。
匯編語言的科學(xué)定義,其實(shí)就是介于機(jī)器碼(各種01)和高級語言(如C)之間的一種語言。你用C語言寫一段程序,其實(shí)要在機(jī)器上運(yùn)行的話,機(jī)器是不懂的,要經(jīng)過編譯器、匯編器編譯,變成匯編,最終再變成機(jī)器碼,機(jī)器根據(jù)這些機(jī)器碼的01可以控制硬件電路完成你程序想執(zhí)行的操作。
可以使用Linux下的objdump命令來反匯編。
常用命令:
objdump -x obj:以某種分類信息的形式把目標(biāo)文件的數(shù)據(jù)組成輸出;肆渣
objdump -t obj:輸出目標(biāo)文件的符號表
objdump -h obj:輸出目標(biāo)文件的所有段概括
objdump -j ./text/.data -S obj:輸出指定段的信息(反匯編源代碼)
objdump -S obj:輸出目標(biāo)文件的符號表,當(dāng)gcc -g時打印更明顯遲雀
objdump -j .text -Sl stack1 | more
-S 盡可能反匯編出源代碼,尤其當(dāng)編譯的時候指定了-g這種調(diào)試參數(shù)時,效果比較明顯。隱含了-d參數(shù)。
-l 用文件名和行號碼雹早標(biāo)注相應(yīng)的目標(biāo)代碼,僅僅和-d、-D或者-r一起使用
使用-ld和使用-d的區(qū)別不是很大,在源碼級調(diào)試的時候有用,要求編譯時使用了-g之類的調(diào)試編譯選項(xiàng)。
-j name 僅僅顯示指定section的信息
DOS,,系統(tǒng)下的DEBUG調(diào)試程序,,,
運(yùn)行后,,用參數(shù) -U
如:
-U 0B2A:
行動后就會把這地址里面的東西換成匯編了,伏羨行,,缺嘩
不過學(xué)過點(diǎn)匯編更好,,
另外DEBUG還有很多參數(shù)可以用,自己找找吧,網(wǎng)上應(yīng)該很多,派枯,
用一個反匯編調(diào)試器就行了
IDA或者OllyDbg,方便直觀伏喚察喚,當(dāng)然VC也有自帶的調(diào)試器,不過很麻缺沒凱煩,不如IDA或者OD方便
關(guān)于linux c 反匯編的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都服務(wù)器租用選創(chuàng)新互聯(lián),先試用再開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價格厚道的香港/美國云服務(wù)器和獨(dú)立服務(wù)器。物理服務(wù)器托管租用:四川成都、綿陽、重慶、貴陽機(jī)房服務(wù)器托管租用。
新聞名稱:深入理解Linux下C語言的反匯編原理 (linux c 反匯編)
網(wǎng)頁URL:http://fisionsoft.com.cn/article/coocooo.html


咨詢
建站咨詢
