C# 如何将序列化的 .NET 对象编译为 .NET 程序集



我有一个二进制文件,里面有序列化的.NET对象(流(。我需要将其编译回.NET程序集(可能使用CodeDomProvider Class或其他任何东西(。

任何指针都将受到高度赞赏。

提前谢谢。

不能保证可以反序列化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

最新更新