簡體   English   中英

C#如何將序列化的.NET對象編譯為.NET程序集

[英]C# How to compile a serialized .NET object to a .NET Assembly

我有一個二進制文件,其中帶有序列化的.NET對象(流)。 我需要將其編譯回.NET程序集(也許使用CodeDomProvider類或其他方法)。

任何指針將不勝感激。

提前致謝。

不能保證可以反序列化BinaryFormatter序列化的對象( BinaryFormatter是包含.NET的二進制序列化器,並且被認為是相當“邪惡”)到生成它的源代碼。 簡單的例子:

[Serializable]
public class MyClass
{
    public DateTime Foo { get; private set; }

    public MyClass()
    {
        Foo = DateTime.Now;
    }
}

除非您使用反射,否則C#中無法用特定的Foo值編寫MyClass對象。 你不能寫:

var bar = new MyClass { Foo = new DateTime(2018, 1, 1 }

因為Foo沒有二傳手。

可以將特定情況(其中沒有私有字段並且如果有設置程序的情況下,它們都是只設置后備字段的值而不進行額外說明的所有設置程序)可以轉換為C#分配。

可以怎么做(但通常是一個壞主意用BinaryFormatter ,因為它沒有很好地處理變化的基本類型)是包括二進制文件作為嵌入資源(見 ),然后讀取文件:

var assembly = Assembly.GetExecutingAssembly();
var resourceName = "ConsoleApp2.Folder1.File1.bin";

MyClass mc;

using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
    var bf = new BinaryFormatter();
    mc = (MyClass)bf.Deserialize(stream);
}

請注意,這是一個非常非常糟糕的主意,因為如果基礎類型(甚至某些私有字段)發生任何更改,則所有內容都會嚴重中斷。

我已經使用名為ClrGuard的工具完成了此操作。 https://github.com/endgameinc/ClrGuard 它將在嘗試執行.NET程序集並將其轉儲到磁盤時捕獲該程序集。 然后,我們可以使用ilspy或任何其他.NET反編譯器進行加載。

ClrGuard將掛鈎到系統上的所有.NET進程。 從那里開始,它執行本機LoadImage()函數的內聯掛鈎。 這就是Assembly.Load()在CLR幕后所調用的。

參考: https : //www.endgame.com/blog/technical-blog/hunting-memory-net-attacks

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM