我有一个二进制文件,其中包含序列化的.NET对象(流)。我需要将它编译回.NET程序集(可能使用CodeDomProvider Class或其他任何东西)。
任何指针都将受到高度赞赏。
先谢谢。
答案 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