我正在尋找一些關於使用原始-buf網絡混淆(Dotfuscator)時發生了什麼的指導。該項目的一半是一個DLL,另一半是其他地方的EXE,使用proto-buf NET,他們完美地交換數據。直到我混淆了DLL。原始buf序列化與混淆
在這一點上,P-BN失敗時不會引發異常,根據我所處理的內容不同,返回0長度的字節數組或縮短的數組。這個類很簡單(VB):
<ProtoContract(Name:="DMailer")> _
Friend Class DMailer
Private _Lic As Cert
Private _Sys As Sys
Private _LList As List(Of LItem)
..
..
End Class
有3個道具都用ProtoMember裝飾來獲取/設置組成類對象。爲簡潔起見剪斷。
同樣,它工作得很好,直到我混淆了DLL。然後,Dotfuscator將其中的每一個重命名爲null,顯然是因爲它們都是Friend,而這似乎阻止了原始buff。如果我免除重命名類(只是類名,而不是道具/成員),它似乎再次起作用。有意義的是,P-BN只能夠對具有合適名稱的對象進行操作,但當被要求序列化一個空命名對象時,它看起來像是一個異常。另一方面,PB-N的許多魅力應該是序列化的獨立的 .NET屬性的工作從屬性 - 至少據我瞭解。然而在這種情況下,它似乎只適用於名稱類。我嘗試使用上面顯示的名稱限定符或參數,無濟於事 - 它顯然沒有做我認爲可能的事情。
所以,我很好奇,如果:
一)......我已經基本推測問題正確
B)...有一些其他的屬性或標誌,可能有助於序列化 空命名對象
c)...如果有任何其他見解有幫助。
如果我免除Dotfuscator重命名中的所有3或4個類(實際上還沒有實現LList,離開DMailer,Cert和Sys),DLL似乎再次工作 - 至少輸出是正確的大小。我可以忍受,儘管模糊的名字會更好:Dotfuscator(CE)會豁免它們或將名稱設置爲Null - 我似乎找不到一種方法來強制它們被重命名。
我不考慮重新命名3或4類,我正在考慮的一個選擇是簡單地將字符串數組或Base64字符串存儲在Certa和Sys的Serializer輸出中,而不是類。然後讓接收器單獨反序列化每個對象。能夠解壓一件東西,並讓你的玩具就像通過魔術一樣,真是太好了。
(很多)TIA
謝謝。我會毫無疑問地嘗試一種簡化的手段來重現,現在我想嘗試一下你的其他建議。對於那些在這裏打主場比賽是模型創建的VB版本:'進口ProtoBuf.Meta 進口[此處插入您的DLL名稱} 模塊模塊1 子的Main() 昏暗的模型作爲對象模型 = RuntimeTypeModel。創建 model.add(的GetType(DMailer),真) '根據需要添加其他類型的 model.Compile( 「MailSerializer」, 「MailSerializer.dll」) 結束Sub' ......好吧,我不知道怎麼代碼標籤在快速回復中工作 – Plutonix
@Plutonix我爲我的示例使用了C#,純粹是爲了我自己的簡單;如果我試圖用VB編寫它,我可能會做出微妙但很難發現的錯誤,因爲我相信您可以輕鬆閱讀C#並轉換爲VB。該庫並不關心語言,顯然; p –
靜態DLL並不真正起作用:爲了製作DLL,您需要公開所有涉及的類型,以便它們可以獲取它們。但是,然後在運行時它會窒息,除非你免除所有這些類型的混淆,否則你會得到'無法從程序集中加載類型'xxx'對於任何相關的類,枚舉等。我從消息中假設他們將不得不保持公開未混淆(不僅僅是爲了構建靜態DLL),這使我們比以前更糟糕。儘管感謝這個想法! – Plutonix