我有一个c#解决方案,它包含两个项目,一个是主应用程序,另一个是许可证项目。项目进展顺利。我已经使用json来序列化许可证详细信息。现在我需要对我的许可项目进行混淆,以使其免受欺诈或黑客的侵害。我使用Dotfuscator
是为了混淆。我使用下面的行来反序列化应用程序收到的许可证详细信息。xmlDocument.LoadXml(xml);
details = xmlDocument.SelectSingleNode("/license/details");
licenseDetails = JsonConvert.DeserializeObject<LicenseDetails>(details.InnerText);
这行在混淆后返回未知对象I
,但在混淆之前工作良好。
混淆前的返回值
licenseDetails == Shared.Licensing.Client.LicenseDetails
混淆后的返回值
licenseDetails = I
<?xml version="1.0" encoding="utf-8"?>
<license>
<details>{"Product":"Outlook Templates","ProductVersion":"1.0.0.0","Username":"Demo","Serial":"1fKxUCJylsm+qVUccjUn8gYNVgDc4pE5OuqYs48vkaQ=","RegistrationDate":"/Date(1326202832909+0200)/","ExpirationDate":"/Date(1330387200000)/","PayloadEntries":[{"ValueType":2,"EntryName":"MaxNumProviders","Operation":1,"EntryValue":"3"},{"ValueType":2,"EntryName":"MaxNumQuick","Operation":1,"EntryValue":"5"},{"ValueType":2,"EntryName":"ExpirationDaysOffset","Operation":1,"EntryValue":"30"}]}</details>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>c/BK0YOhnW8cXUGxTJx3mpWQj1U=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>gWYcpr3OBhUoiPEFyWskgoRcDw5rO2RWNbMulXSXg2tsKWebEFqgptCUfr7JRvvSjm4kALyvU7mZviJI/peJWmJC69gs7QDMEOWLvrOa0TL1qyO5K5onCBZopJUdrPE0PJCVYRacasI3DvTOSo+IDEOSFVpEWZNcERhB6ZkOFrU=</SignatureValue>
</Signature>
</license>
我不知道在混淆时哪里出错了
您必须从重命名中排除JSON暴露的LicenseDetails
属性。
或者,如果你不想暴露这些名字,你可以手动从Json转换到你的LicenseDetails文本,不涉及反射。我觉得你可以这样写:
var json=new JObject(details.InnerText);
var license=new LicenseDetails();
license.Product=json["Product"];
license.ProductVersion=json["ProductVersion"];
....
注意,像这样手动操作需要做更多的工作。
混淆意味着所有现有的名称都被改变了,以模糊代码的含义和意图(聪明和有动力的人仍然可以弄清楚代码的作用,只是需要更多的努力)。
序列化通常依赖于命名约定来匹配输入和目标对象的属性。由于后者已被重命名,因此需要向序列化引擎提供显式的名称映射。这通常通过用属性注释所有序列化属性来实现,其中每个属性指定属性的序列化名称。该信息允许序列化器将"RegistrationDate"输入映射到属性"I1i"(作为混淆名称的例子,在混淆之前可能也称为"RegistrationDate")。参考序列化引擎的文档,了解如何配置它。
然而,您应该注意到这些属性和它们的值对于检查您的程序集的人来说是很容易获得的,因此实际上您通过混淆代码获得的东西很少。事实上,我认为这完全是浪费时间,因为即使是混淆的代码通常也可以反编译成相当合理的c#。