2013-04-28 41 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