在 C# 或 VB.NET 中,我想知道哪種方法是確定通過Reflection加載的程序集的PEFileKinds的最佳方法。換句話說,確定程序集是 WinExe、控制臺應用程序還是動態鏈接庫。我找到了這個解決方案(該問題中提出的其他解決方案無效),但如果我沒記錯的話,我認為這意味著假設加載的文件是一個 .NET 程序集,并且手動解析似乎有點整潔PE頭。我還找到了其他解決方案,但閱讀評論在某些情況下似乎無效。出于這些原因,我想知道是否存在一種真正安全的托管方式,最好是通過Reflection來確定加載程序集的 PE 文件類型。我確定System.Reflection.Emit.PEFileKinds枚舉不只是為了裝飾目的而存在,如果該枚舉存在,那么它的邏輯是認為我可能在反射命名空間中錯過了一個成員/函數,該命名空間在內部使用該枚舉來返回 PE 文件類型一個Assembly對象,但是,我設法看的私有成員Assembly通過階級的反思和其他相關類,我什么也沒找到相關的。
1 回答

HUH函數
TA貢獻1836條經驗 獲得超4個贊
根據對參考源的搜索,PEFileKinds
枚舉僅用于AssemblyBuilder
and ModuleBuilder
(以及它們的非公共助手類型)。此枚舉和類位于System.Reflection.Emit
命名空間中- 例如,它們旨在用于編寫程序集,而不是讀取。
但是,官方System.Reflection.Metadata
NuGet 包在其System.Reflection.PortableExecutable
命名空間中公開了程序集的 PE 標頭的相關值。您可以使用這些標頭對等效PEFileKinds
值進行逆向工程。這是 C# 中的一個示例:
using (var stream = File.OpenRead(filenameAndExtension)){ using (var peFile = new PEReader(stream)) { var headers = peFile.PEHeaders; Console.WriteLine($"Reading {filenameAndExtension} with System.Reflection.Metadata"); Console.WriteLine($" IsDll: {headers.IsDll}"); Console.WriteLine($" IsExe: {headers.IsExe}"); Console.WriteLine($" IsConsoleApplication: {headers.IsConsoleApplication}"); PEFileKinds reverseEngineeredKind; // NOTE: the header values cause IsConsoleApplication to return // true for DLLs, so we need to check IsDll first if (headers.IsDll) { reverseEngineeredKind = PEFileKinds.Dll; } else if (headers.IsConsoleApplication) { reverseEngineeredKind = PEFileKinds.ConsoleApplication; } else { reverseEngineeredKind = PEFileKinds.WindowApplication; } Console.WriteLine($" Reverse-engineered kind: {reverseEngineeredKind}"); }}
我在生成的程序集上運行此代碼System.Reflection.Emit
以確保其準確性。完整的程序在這個要點中。
您可能還可以通過第三方庫獲取此信息,例如Mono.Cecil或 Lex Li 提到的PeNet。
- 1 回答
- 0 關注
- 159 瀏覽
添加回答
舉報
0/150
提交
取消