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

时间:2018-06-08 11:36:40

标签: c# .net

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

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

先谢谢。

2 个答案:

答案 0 :(得分:2)

无法保证可以反序列化BinaryFormatter序列化对象(BinaryFormatter是包含.NET的二进制序列化程序......并且它被认为是非常"邪恶& #34;)生成它的源代码。简单的例子:

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

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

除非您使用反射,否则C#中无法编写具有特定MyClass值的Foo对象。你不能写:

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

因为Foo没有设置器。

特定情况(如果没有私有字段,并且如果有setter,则它们都是仅设置后备字段值而不进行额外细化的setter)可以转换为C#赋值。

可以做什么(但一般来说,使用BinaryFormatter是一个坏主意,因为它不能很好地处理对底层类型的更改)包括二进制文件作为嵌入式资源(参见this)然后阅读文件:

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);
}

请注意,这是一个非常糟糕的主意,因为如果底层类型(甚至某些私有字段)发生任何变化,一切都会破坏。

答案 1 :(得分:0)

我使用名为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