[英]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.