當前位置:編程學習大全網 - 編程語言 - dll文件如何反匯編成源碼,C++語言編寫

dll文件如何反匯編成源碼,C++語言編寫

DLL 屬於可執行文件中的壹類,又稱為動態鏈接庫,不能直接用DEBUG加載,壹般由應用程序因使用該庫中的函數,而由操作系統在應用程序加載的同時被加載入特定地址,這個地址壹般是DLL在鏈接時指定的。當DLL被加載到運行空間,根據輸出函數表,可以得到各個函數的入口地址,然後用DEBUG在各個入口下斷點,調用該函數時DEBUG將跟蹤進入該函數,從而實現反匯編。

反匯編屬於逆向工程,逆向工程的主要手段有兩大類,其中壹類是動態分析,另壹類是靜態分析。

前面提到的方法屬於動態分析,由DEBUG實現反匯編,該方法不容易得到完整的代碼,壹般只能形成壹段壹段獨立分散的代碼,同時由於DEBUG的局限性,反匯編的代碼質量多不高,生成的代碼不能直接使用,原因在於DLL在加載時若沒有加載到指定地址空間,操作系統將對代碼進行重定向,所以DEBUG只能得到重定向後的代碼,這類代碼必須修改每壹個重定向點,才能形成可執行代碼。作為WINDOWS32位操作系統, OLLYDBG是最為優秀的調試、跟蹤、反匯編工具,多窗口運行,可以方便的通過窗口操作完成各類動作,而不需要像壹般DEBUG那樣由命令行來完成,OLLYDBG還有許多壹般調試器不具備的功能,同時由於每壹代高手不斷的修改,使其具有多種功能,同時帶來的就是混亂,誰也不知道有多少版本,誰也不清楚每個版本到底增加了什麽功能,但就這樣,也是瑕不掩疵, OLLYDBG任然是DEBUG中最強大,最好使用的。

靜態分析和動態分析不同,靜態分析直接打開原程序,加載而不運行,然後直接分析加載的代碼。目前靜態分析工具,最強大的當屬IDA,IDA支持幾乎所有種類的匯編語言。

IDA加載應用程序有許多選項,可以選擇完整的加載整個程序,也可以選擇加載程序的某個塊,壹般可選擇的是否加載文件頭、資源表、輸入表、輸出表等等。

IDA還支持調試,也就是說,當妳在進行反匯編過程時,可以直接使用IDA來調試跟蹤,以分析代碼的動態執行情況,不過就動態跟蹤來說,OLLYDBG更為強大。

IDA反匯編的正確率和代碼的復雜程度有關,對於正規開發的代碼,尤其是如果能夠獲得源程序的調試文件,即所謂的PDB文件,IDA可以讀取PDB文件中的信息,使得反匯編的效率和準確度大為提高,生成的代碼甚至比源代碼易讀。IDA將反匯編生成的結果存入IDB文件中。當妳確認反匯編的結果達到妳的要求,可以讓IDA輸出匯編源代碼,IDA也提供其他格式的輸出,例如HTML文件,便於用戶閱讀。樓主主要是用於分析DLL文件,壹般來說這類文件更適合做靜態分析,所以推薦使用IDA來進行。

IDA對於分析那些加殼或含有大量花指令、混淆代碼、垃圾代碼的程序,反匯編的正確率會大為下降,因為IDA無法正確的確認當期位置上的數值是屬於代碼,還是屬於數據,是普通C字符,還是DELPHI的字符串,還是UNICODE字符串,是結構數據還是數組還是類表(DELPHI生成的代碼中含有大量的類表)等等。遇到這種情況,就需要使用者掌握許多技巧,例如可以通過使用者對當前數據的認識,指導IDA如何處理當前的數據。對於大批量的,具有某些規律的數據,IDA還提供了腳本語言(文件尾位idc),通過對腳本的執行來指導IDA如何進行反匯編。對於更為復雜的情況,例如程序是自解壓運行的,這時IDA就沒有任何能力來進行正確的分析,通常都會用OLLYDBG動態跟蹤,等程序完成自解壓後從內存中將解壓後的代碼完整的挖下來形成文件,再由IDA進行靜態分析。

對於成功進行反匯編的代碼,IDA根據代碼的入口、調用、轉移等指令,可以為使用者提供各種格式的程序的流程圖,IDA提供許多格式由用戶選擇,便於用戶理解程序的結構。

下面提供的是壹個匯編程序的源代碼,然後將這個源代碼編譯成可執行文件後,用IDA反匯編得到的結果,由此可清晰的認識到IDA的強大(由於匯編代碼都很長,所以截取部分來展示)。

匯編源代碼(這是以前寫“可執行文件頭的變形技術”壹書時書中示例的代碼):

下面這些是通過IDA反匯編得到的結果,IDA以HTML格式輸出(這裏給出的是圖形):

  • 上一篇:Opencv類似於python用彜語寫的
  • 下一篇:速8中黑客是如何控制汽車的?
  • copyright 2024編程學習大全網