亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

確定程序集的 PEFileKind 的好方法?

確定程序集的 PEFileKind 的好方法?

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

1 回答

?
HUH函數

TA貢獻1836條經驗 獲得超4個贊

根據對參考源的搜索PEFileKinds枚舉僅用于AssemblyBuilderand ModuleBuilder(以及它們的非公共助手類型)。此枚舉和類位于System.Reflection.Emit命名空間中- 例如,它們旨在用于編寫程序集,而不是讀取。

但是,官方System.Reflection.MetadataNuGet 包在其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


查看完整回答
反對 回復 2022-01-09
  • 1 回答
  • 0 關注
  • 159 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號