如何快速確定我擁有的EXE或DLL是否是託管代碼?
最近我花了一些時間試圖反彙編文件,然後通過代碼中的一些痕跡了解了本可以跳過所有工作,而只使用ILspy。我如何避免將來再重複這種經歷?
如何快速確定我擁有的EXE或DLL是否是託管代碼?
最近我花了一些時間試圖反彙編文件,然後通過代碼中的一些痕跡了解了本可以跳過所有工作,而只使用ILspy。我如何避免將來再重複這種經歷?
檢查PE標頭中偏移0xE8(32位)或0xF8(64位)處的雙字。如果非零,則它是指向CLR標頭的指針。那是一個託管文件(您不能在其中放置隨機數據,因為XP和更高版本內置了直接的.NET解析支持,因此如果數據無效,則不會加載該文件)。僅憑mscoree.dll的存在是不夠的,因為該應用程序可能正在使用託管文件來做事,但本身無法託管。
託管的DLL /應用程序將主要依賴MSCOREE.dll ...因此,如果在Dependency Walker中打開DLL,則從非託管的庫中告訴託管庫沒有問題。 >
http://www.dependencywalker.com/
引自此處
檢查PE標頭的數據目錄部分中的 DataDirectory [IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] .VirtualAddress
是否為非零值是最快的方法。
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM運行時描述符
引用:
手動操作時,我更喜歡在 PE標頭中觀察以下符號:
1- 中存在 mscoree!_CorExeMain 導入表。
2- CLR標頭 / * Com的 VirtualAddress 和大小描述符 *數據目錄已設置。大小設置為 0x48 。
3- 基本重定位數據目錄的大小設置為 0x0C ,即僅一個修復程序。
此外,一個小符號是:
4- SectionAlignment 設置為 0x2000 。
嘗試先在ILSpy中打開它。它應該告訴您程序集是否未被管理。
到目前為止,我發現的最快的啟發式方法是檢查它是否導入了 mscoree.dll
。
在 mscoree.dll
的版本資源中Microsoft稱之為: Microsoft .NET運行時執行引擎。
除了彼得輪渡的答案,還有一些python代碼來檢查是否相同:
import sysdef unpack(byte):return sum([ord(b)<<(8 * i)對於i,b枚舉(byte)])如果len(sys.argv)== 1:打印>> sys.stderr,“未提供輸入文件!”否則:myfile = sys.argv [1],其中open(myfile “ r”)作為f:f.seek(0x3c)peoffset =解包(f.read(2))optoffset = peoffset + 24 f.seek(optoffset)magic = f.read(2)offset = -1(如果magic = ='\ x0b \ x01':偏移= 208 + optoffset否則:偏移= 224 + optoffset f.seek(偏移)clr_address =如果(cl.address == 0則解壓縮(f.read(4))):打印“無託管可執行文件” :打印“託管可執行文件”
CorFlags.exe是Windows SDK附帶的實用程序。執行該過程,輸入有問題的文件名,如果它是託管文件,它將告訴您它使用的是什麼版本的Dotnet框架,以及該文件是全部託管代碼還是混合模式,是否經過簽名以及其他一些信息其他有用的信息。