3

タイトルにあるように、次の例外を除いて、themidaでアプリケーションを保護した後、逆シリアル化は失敗します。

一時クラスを生成できません(result = 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保護は私のマシンでは正常に機能しますが、VMと同僚のマシンでは失敗します

私が使用しているのは(同僚と同じ構成):

  • VS2012プロフェッショナル
  • Windows 7 x64 Ultimate
  • Themida 2.1.2.0 x86(.Netサポート付き)

VMは、Windows7x86の新規インストールです。

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 に答える