2011-11-29 89 views
4

我正在尋找一些關於使用原始-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

回答

2

因爲有利益的幾個upticks,這裏是什麼樣子將工作:

一)反射的任何形式將能夠得到的屬性列表一個模糊的類型。 我試圖通過所有類型來找到ProtoContract,我可以找到它們 ,但屬性名稱全部更改爲a,m,b,j,g。

我也試過Me.GetType.GetProperties與相同的結果。

可能從輸出實現一個映射表示Employee.FirstName現在是a0.j,但分發這個失敗的目的是混淆。

b)什麼對一定程度的工作是免除混淆類NAME。由於PB-N查找ProtoMember屬性以獲取數據,因此可以對屬性/成員名稱進行混淆,而不是CLASS /類型名稱。如果名稱與FederalReserveLogIn類似,則您的班級/類型會有Bullseye。

我已經初見成效執行以下操作:

1)建立一個簡單的類來存儲屬性令牌和價值。使用ConvertFromInvariantString將所有內容存儲爲字符串。從PBN獲取一個小費,我使用了一個令牌整數:

<ProtoMember(propIndex.Foo)> 
Property Foo As String 

枚舉有助於將所有內容綁定在一起。將這些存儲在一個Dictionary(Of T, NameValuePair)

2)添加一些訪問器。這些都可以進行類型轉換爲你:

Public Sub Add(ByVal Key As T, ByVal value As Object) 
     If _col.ContainsKey(Key) Then 
      _col.Remove(Key) 
     End If 

     _col.Add(Key, New TValue(value)) 

    End Sub 

    Public Function GetTItem(Of TT)(key As T) As TT 
     If _col.ContainsKey(key) Then 
      Return CType(_col(key).TValue, TT) 
     Else 
      Return Nothing 
     End If 
    End Function 

T是你想使用的任何密鑰類型。整數產生最小的輸出,並且仍然允許訂閱代碼使用Enum。但它可能是String。

TT是原始類型:

myFoo = props.GetTItem(Of Long)(propsEnum.Foo) 

3)顯露innerlist(字典)至PBN和賓果遊戲,全部完成。

它也很容易添加轉換器的點,矩形,字體,大小,顏色,甚至位圖。

HTH

3

有趣。我承認我從來沒有嘗試過這種情況,但是如果你能讓我通過你的過程(或者更好:也許提供一個基本的複製例子,「運行這個,然後這個,然後這個:繁榮」),我很樂意進行調查。

注:ProtoContract上的Name主要用於GetProto()的使用;核心序列化器不需要它,並且可以省略它以減少暴露。另外,protobuf-net對字段不感興趣,除非這些字段用屬性​​裝飾,所以不應該成爲問題。

但是!這裏可能有一個解決方法,現在;你可以預先生成一個靜態序列化的DLL;例如,在一個單獨的控制檯exe文件(就像一個工具,我真的需要一個獨立的工具來包裝這個!)

因此,如果你創建一個控制檯EXE引用您的是非模糊圖書館的protobuf-net.dll:

var model = RuntimeTypeModel.Create(); 
model.Add(typeof(DMailer), true); // true means "use the attributes etc" 
// and other types needed, etc 
model.Compile("MailSerializer", "MailSerializer.dll"); 

這應該寫MailSerializer.dll,然後你就可以從你的代碼中引用(除了protobuf網),並使用:

var ser = new MailSerializer(); // our pre-genereated serializer 
ser.Serialize(...); // etc 

然後在您的模糊有效載荷中包含MailSerializer.dll

(這是所有v2的具體,順便說一句)

如果工作,我需要調查的主要問題,但我不是一個模糊專家,所以可以用你的攝製做腳步。

+0

謝謝。我會毫無疑問地嘗試一種簡化的手段來重現,現在我想嘗試一下你的其他建議。對於那些在這裏打主場比賽是模型創建的VB版本:'進口ProtoBuf.Meta 進口[此處插入您的DLL名稱} 模塊模塊1 子的Main() 昏暗的模型作爲對象模型 = RuntimeTypeModel。創建 model.add(的GetType(DMailer),真) '根據需要添加其他類型的 model.Compile( 「MailSerializer」, 「MailSerializer.dll」) 結束Sub' ......好吧,我不知道怎麼代碼標籤在快速回復中工作 – Plutonix

+0

@Plutonix我爲我的示例使用了C#,純粹是爲了我自己的簡單;如果我試圖用VB編寫它,我可能會做出微妙但很難發現的錯誤,因爲我相信您可以輕鬆閱讀C#並轉換爲VB。該庫並不關心語言,顯然; p –

+0

靜態DLL並不真正起作用:爲了製作DLL,您需要公開所有涉及的類型,以便它們可以獲取它們。但是,然後在運行時它會窒息,除非你免除所有這些類型的混淆,否則你會得到'無法從程序集中加載類型'xxx'對於任何相關的類,枚舉等。我從消息中假設他們將不得不保持公開未混淆(不僅僅是爲了構建靜態DLL),這使我們比以前更糟糕。儘管感謝這個想法! – Plutonix