0

我有一个 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 文件是

<?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>

我不知道在混淆过程中出了什么问题。

4

2 回答 2

0

混淆意味着更改所有现有名称,以掩盖代码的含义和意图(聪明和有动力的人仍然可以弄清楚代码的作用,只是需要更多的努力)。

序列化通常依赖于命名约定来匹配输入和目标对象的属性。由于后者已重命名,因此您需要为序列化引擎提供明确的名称映射。这通常通过使用属性注释所有序列化属性来工作,其中每个属性指定属性的序列化名称。该信息允许序列化程序例如将“RegistrationDate”输入映射到属性“I1i”(作为混淆名称的示例,在混淆之前可能也称为“RegistrationDate”)。请查阅序列化引擎的文档以了解如何配置它。

但是,您应该注意,这些属性及其值对于检查您的程序集的人来说是很容易获得的,因此实际上您通过混淆代码获得的收益很少。事实上,我认为这完全是在浪费你的时间,因为即使是混淆的代码通常也可以反编译为相当合理的 C#。

于 2013-04-28T13:19:42.787 回答
0

您必须LicenseDetails从重命名中排除 JSON 公开的属性。

或者,如果您不想公开这些名称,则可以以不涉及反射的方式手动将 Json 转换为您的 LicenseDetails 文本。我认为你可以使用这样的东西:

var json=new JObject(details.InnerText);
var license=new LicenseDetails();
license.Product=json["Product"];
license.ProductVersion=json["ProductVersion"];
....

请注意,尽管像这样手动执行它需要更多的工作。

于 2013-04-29T00:36:41.620 回答