題:
確定文件是否為託管代碼
Jannu
2013-04-05 22:54:15 UTC
view on stackexchange narkive permalink

如何快速確定我擁有的EXE或DLL是否是託管代碼?

最近我花了一些時間試圖反彙編文件,然後通過代碼中的一些痕跡了解了本可以跳過所有工作,而只使用ILspy。我如何避免將來再重複這種經歷?

八 答案:
peter ferrie
2013-04-06 01:38:14 UTC
view on stackexchange narkive permalink

檢查PE標頭中偏移0xE8(32位)或0xF8(64位)處的雙字。如果非零,則它是指向CLR標頭的指針。那是一個託管文件(您不能在其中放置隨機數據,因為XP和更高版本內置了直接的.NET解析支持,因此如果數據無效,則不會加載該文件)。僅憑mscoree.dll的存在是不夠的,因為該應用程序可能正在使用託管文件來做事,但本身無法託管。

這個答案值得最高的帳單。除了您的大腦和對PE​​標頭的了解之外,您無需任何其他工具即可獲得答案。
偏移量可以不同,具體取決於它是PE32還是PE32 +。
-1
僅供參考,這等效於@broadway's答案和Karsten Hahn的答案:偏移量0xe8或0xf8是IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR的虛擬地址。
@pts有一個顯著的區別:使用#define意味著32位程序只能識別32位程序,64位程序只能識別64位。這就是為什麼我建議使用硬編碼值的原因。
N3mes1s
2013-04-06 01:29:55 UTC
view on stackexchange narkive permalink

託管的DLL /應用程序將主要依賴MSCOREE.dll ...因此,如果在Dependency Walker中打開DLL,則從非託管的庫中告訴託管庫沒有問題。 >

  http://www.dependencywalker.com/  

引自此處

和其他有用的鏈接: msdn; msdn2

查看百老彙和彼得·弗里的答案。檢查mscoree.dll依賴關係有些可靠,但不是100%。
為了確認,我製作了[PoC](https://code.google.com/p/corkami/source/detail?r=1595),該文件導入了mscoree.dll,甚至具有偽造的.NET外觀的EntryPoint,但沒有.COM目錄。
這不是一個很有建設性的評論。我只是想證明,對於此問題,COM目錄比導入或EntryPoint更可靠。
broadway
2013-04-06 04:44:21 UTC
view on stackexchange narkive permalink

檢查PE標頭的數據目錄部分中的 DataDirectory [IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] .VirtualAddress 是否為非零值是最快的方法。

#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM運行時描述符

引用:

這是我使用的方法。數據目錄數組的第14個成員是IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR,因為該帖子未列出。我們應該避免像這樣的絕對引用。
十六進制編輯器沒有數據目錄的概念,因此沒有絕對偏移量。
確實取決於十六進制編輯器。 010有PE模板。
waliedassar
2013-06-28 13:22:23 UTC
view on stackexchange narkive permalink

手動操作時,我更喜歡在 PE標頭中觀察以下符號:

1- 中存在 mscoree!_CorExeMain 導入表

2- CLR標頭 / * Com的 VirtualAddress 大小描述符 *數據目錄已設置。大小設置為 0x48

3- 基本重定位數據目錄的大小設置為 0x0C ,即僅一個修復程序。

此外,一個小符號是:

4- SectionAlignment 設置為 0x2000

Peter Andersson
2013-04-05 23:01:01 UTC
view on stackexchange narkive permalink

嘗試先在ILSpy中打開它。它應該告訴您程序集是否未被管理。

這意味著ILSpy能夠打開它,但情況並非總是如此。
如果未管理程序集,則ILSpy會顯示一條特定消息。如果由於其他原因無法加載,我確定會有不同的消息:)您能告訴我一個ILSpy說不被管理的託管程序集嗎?
如果無法加載PE(是否使用託管代碼),則會出現Mono.Cecil.PE.ImageReader錯誤。 [TinyNet](https://code.google.com/p/corkami/source/browse/trunk/src/PE/tinynet.asm?r=1596#44)使用了常見的惡意軟件技巧,即使用一個小的NumOfRVA來隱藏其COM目錄-失敗ILSpy-即使它使用的是託管代碼。
0xC0000022L
2013-04-05 22:59:54 UTC
view on stackexchange narkive permalink

到目前為止,我發現的最快的啟發式方法是檢查它是否導入了 mscoree.dll

mscoree.dll 的版本資源中Microsoft稱之為: Microsoft .NET運行時執行引擎

不,這是行不通的,因為許多其他可執行文件也從非託管程序集的mscoree.dll導入。
Karsten Hahn
2014-05-27 16:33:58 UTC
view on stackexchange narkive permalink

除了彼得輪渡的答案,還有一些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))):打印“無託管可執行文件” :打印“託管可執行文件”  
Neutrino
2013-10-25 01:39:16 UTC
view on stackexchange narkive permalink

CorFlags.exe是Windows SDK附帶的實用程序。執行該過程,輸入有問題的文件名,如果它是託管文件,它將告訴您它使用的是什麼版本的Dotnet框架,以及該文件是全部託管代碼還是混合模式,是否經過簽名以及其他一些信息其他有用的信息。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...