.net从二进制资源中逆向出文件。

.NET(C#):使用IResourceReader,IResourceWriter和ResourceSet

注意:

这是另一篇文章“.NET(C#):浅谈程序集清单资源和RESX资源”的一部分。

所有提及类均在:System.Resources命名空间内。

来看这三个类的常用成员:

interface IResourceWriterIDisposable

    void AddResource(string name, object/string/byte[]);

    //添加资源数据

    void Generate();

    //更新缓冲区(Flush)

    void Close();

    //调用Dispose

 

 

interface IResourceReaderIDisposableIEnumerable

    IDictionaryEnumerator GetEnumerator();

    //获取字典迭代器(用来枚举资源)

    void Close();

    //调用Dispose

 

 

class ResourceSetIDisposableIEnumerable

//没有CultureInfo支持,封装一个IResourceReader

    构造函数(Stream/IResourceReader/string);

 

    Type GetDefaultReader/Writer();

    //返回默认IResourceReader/Writer类型

 

    IDictionaryEnumerator GetEnumerator();

    //等效于IResourceReader.GetEnumerator

 

    object GetObject(string);

    string GetString(string);

    //有bool参数:指定否是不区分大小写

    //返回资源中指定名称的数据

 

 

有两个类继承IResourceReader,分别是ResourceReader和ResxResourceReader。

IResourceWriter则为ResourceWriter和ResxResourceWriter。

ResourceReader和ResourceWriter操作的是二进制的资源文件,以.resources为扩展名。

ResxResourceReader和ResxResourceWriter操作的是XML格式的RESX文件(注意RESX在编译后也用到.resources文件)

image

 

这些类的构造函数可以指定字符串表示文件路径或者Stream对象。

最后ResxResourceReader/Writer类型在System.Windows.Forms.dll类库中。而ResourceReader/Writer在mscorlib.dll类库中。

 

下面代码,使用IResourceWriter来写一个资源文件(用ResourceWriter类型,所以是.resources文件),然后用IResourceReader和ResourceSet来读取资源文件:

//+ using System.Resources

class Program

{

    static void Main()

    {

        //使用IResourceWriter

        Write();

        //使用IResourceReader

        ReadUsingResourceReader();

        //使用ResourceSet

        ReadUsingResourceSet();

    }

 

    //使用IResourceWriter

    static void Write()

    {

        using (IResourceWriter rw = new ResourceWriter("a.resources"))

        {

            rw.AddResource("byte"0xff);

            rw.AddResource("文本""hellow");

            rw.AddResource("guid"Guid.NewGuid());

        }

    }

    //使用IResourceReader

    static void ReadUsingResourceReader()

    {

        Console.WriteLine("== 使用IResourceReader");

        using (IResourceReader rr = new ResourceReader("a.resources"))

        {

            var iter = rr.GetEnumerator();

            while (iter.MoveNext())

                Console.WriteLine("键: {0} 值: {1}", iter.Key, iter.Value);

        }

    }

    //使用ResourceSet

    static void ReadUsingResourceSet()

    {

        Console.WriteLine("== 使用ResourceSet");

        using (ResourceSet rs = new ResourceSet("a.resources"))

        {

            Console.WriteLine(rs.GetObject("byte"));

            Console.WriteLine(rs.GetString("文本"));

            Console.WriteLine(rs.GetObject("guid"));

        }

    }

 

}

 

输出:

== 使用IResourceReader

键: 文本 值: hellow

键: guid 值: 7f958dc9-eae2-43f5-a150-88fd8a07374e

键: byte 值: 255

== 使用ResourceSet

255

hellow

7f958dc9-eae2-43f5-a150-88fd8a07374e

 

.NET还提供一个ResourceManager类型来提供支持多语言的资源提取,原理是通过探索.NET中的附属程序集(satellite assembly),关于ResourceManager的使用,可以参考这篇文章:.NET(C#):使用ResourceManager类型.

作者:Mgen 

你可能感兴趣的:(.net从二进制资源中逆向出文件。)