3

正如标题所说,在使用 themida 保护我的应用程序后,反序列化失败,但有以下例外:

无法生成临时类(结果=1)。错误 CS0009:元数据文件 'c:\Path\to\protected.exe' 无法打开 -- '试图加载格式不正确的程序。'

这是我用于反序列化的代码(它在 exe 不受保护时工作):

MyClass myClass;
try
{
    using (var stream = new MemoryStream(Data))
    {
        var serializer = new XmlSerializer(typeof(ComSec.MyClass));
        myClass = serializer.Deserialize(stream) as MyClass;
    }
}
catch (Exception e)
{
    return null;
}

奇怪的是,代码 + themida 保护在我的机器上运行良好,但在虚拟机和同事的机器上却失败了

我正在使用(与我的同事相同的配置):

  • VS2012 专业版
  • Windows 7 x64 终极版
  • Themida 2.1.2.0 x86(支持.Net)

VM 是全新安装的 Windows 7 x86。

4

2 回答 2

4

我最终使用了该DataContract属性并使用 DataContractSerializer 来序列化和反序列化对象(它现在在任何地方都可以使用,并且有/没有保护)。

我的研究:

[DataContract(Name = "TestClass")]
public class TestClass
{
    [DataMember(Name = "Name")]
    public string Name { get; set; }
    [DataMember(Name = "Age")]
    public int Age { get; set; }
}

序列化/反序列化:

var serializer = new DataContractSerializer(typeof(TestClass));

using (var stream = new MemoryStream())
{
    serializer.WriteObject(stream, this);
    File.WriteAllBytes("TestClass.xml", stream.ToArray());
}

TestClass o = null;
using (var stream = new MemoryStream(File.ReadAllBytes("TestClass.xml")))
{
    o = serializer.ReadObject(stream) as TestClass;
}
于 2012-09-30T14:53:48.467 回答
0

我也遇到了这个问题,建议的答案效果很好。最初的问题是由于文件访问权限。只需添加此信息,以便其他人了解 DataContract 为何有效(来自https://stackoverflow.com/a/10340155/1111380):

DataContractSerializer、NetDataContractSerializer 和 DataContractJsonSerializer 不需要磁盘空间,也不会将程序集发送到磁盘。相反,它们在运行中(在内存中)生成 IL,并在随后的序列化情节中使用它在它们正在操作的 AppDomain 内进行序列化和反序列化。但是,XmlSerializer 确实需要磁盘空间并解释错误(文件路径无法打开/访问)。

于 2013-01-11T02:06:17.483 回答