2013-04-28 98 views
0

我有包含两个项目的C#溶液未知物体,一个是主应用程序,另一个是许可项目。项目工作进展顺利。我已经使用json来序列化许可证的细节。现在我需要对我的授权项目进行模糊处理,以避免欺诈或黑客的攻击。我已经使用Dotfuscator进行混淆。我已经使用了下面的行来反序列化应用程序收到的许可证详细信息。 xmlDocument.LoadXml(xml); details = xmlDocument.SelectSingleNode("/license/details"); licenseDetails = JsonConvert.DeserializeObject<LicenseDetails>(details.InnerText);JsonConvert.DeserializeObject()返回时组件被混淆

此行在模糊处理后返回未知对象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>

我不知道混淆过程中会出现什么问题。

+0

尝试此解决方案http://stackoverflow.com/questions/33062867/json-net-and-obfuscation,我希望这可以帮助! – SteBert 2015-10-11 08:19:47

回答

0

你必须排除LicenseDetails从更名化JSON公开的属性。

另外,如果你不希望公开这些名字,你可以手动从Json的转换为你的LicenseDetails文本不涉及反射的方式。你可以用这样的东西我想:

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

注意它需要更多的工作,虽然这样做手动。

+0

感谢您的建议,它的工作虽然经过数据类型的显式转换,例如'licenseDetails.Product = json [“Product”]。ToString();' 没有显式转换,它给出了一个错误,如'不能转换源类型“ Newtonsoft.Json.Linq.JToken'目标类型字符串' 现在我有'RegistrationDate&PayloadEntries'问题,因为它们是DateTime和List <>类型,我怎样才能明确地将它们转换为相关数据类型? – 2013-04-29 05:13:40

+0

@RameshKarn你必须在日期中手动执行DateTime.Parse,你可能不得不手动迭代列表并建立一个新列表,我会检查Json.Net的文档,我很生疏 – Earlz 2013-04-29 06:14:23

0

混淆意味着所有现有名称的改变,掩盖了代码的含义和意图(聪明和上进心的人仍然可以找出代码做什么,它只是涉及到更多的努力)。

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

但是,你要注意,这些属性和它们的值都是现成的人检查你的组件,因此你在真相被混淆的代码获得很少。事实上,我认为这是完全浪费你的时间,因为即使混淆代码通常可以反编译为相当明智的C#。

+0

'因为即使混淆代码通常可以反编译为相当明智的C#。'不,如果你使用体面的控制流混淆。我在Dotfuscator上工作,所以我有偏见,但我发现大多数反编译器都会阻塞混淆代码,或者无法完全反编译,或者在C#中引入逻辑错误。混淆从来不是一个100%的解决方案,但它可以防止反编译人员在5分钟的空闲时间内快速解决您的许可问题(或其他问题) – Earlz 2013-04-29 00:29:17

+0

@Earlz尽管我同意反编译器有时会窒息,但真的很难掩盖什么是继续使用IL代码,因为方法是按名称调用的(所以至少所有的BCL访问都很容易找到)。混淆可能有助于保护知识产权(代码),但当然不会阻止任何有意规避许可证保护的人。此外,对代码进行大胆的重写可能会引入微妙的错误,这些错误只会在发布代码中体现出来。至少从我的角度来看,额外的许可证保护并不能证明这一风险。 – 2013-04-29 19:05:42