我正在寻找有关使用带混淆的原始buf网(Dotfuscator)时发生的情况的指导。该项目的一半是DLL,另一部分是其他地方的EXE,并且使用pro-buf NET可以完美地交换数据。直到我混淆了DLL。
那时,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窒息了。如果我免除了该类的重命名(只是该类的名称,而不是props / members),它似乎又可以工作了。 P-BN仅能对具有适当名称的对象起作用,这是有道理的,尽管当要求序列化一个空命名对象时,似乎有可能是一个例外。
另一方面,PB-N的许多魅力应该是序列化,而不依赖于从属性工作的.NET名称-至少据我所知。但是在这种情况下,它似乎仅适用于带有名称的类。我尝试使用如上所示的名称限定符或参数,但无济于事-它显然没有按照我的想法做。
所以,我很好奇:
a)...我基本上已经正确地推测了这个问题
b)...还有一些其他可能有助于序列化的属性或标志
一个空的命名对象
c)...如果还有其他见解会有所帮助。
如果我从Dotfuscator重命名中免除所有3个或4个类(实际上尚未实现LList,离开DMailer,Cert和Sys),则DLL似乎可以再次工作-至少输出的大小正确。我可以忍受,尽管使用模糊的名称会更好:Dotfuscator(CE)可以免除它们,也可以将名称设置为Null-我似乎无法找到一种方法来强制将其重命名。
我考虑的一种替代方案不是免除3或4个类的重命名,而只是将Cert和Sys的序列化器输出作为字节数组或Base64字符串存储在DMailer中,而不是类。然后让接收器分别对每个对象进行反序列化。能够解开一件东西,然后把玩具放在那里,就好像是魔术一样,真是太好了。
(许多)TIA
最佳答案
由于有一些有趣的问题,因此可以使用以下方法:
a)任何形式的反射都将无法获得混淆类型的属性列表。
我尝试遍历所有类型以找到带有ProtoContract的类型,我可以找到它们
但是属性名称都更改为a,m,b,j,g。
我也尝试了Me.GetType.GetProperties具有相同的结果。
您可以从输出中实现一个映射,以指示Employee.FirstName现在为a0.j,但是将其分发会破坏混淆的目的。
b)在某种程度上有效的是使NAME类免于混淆。由于PB-N寻找ProtoMember属性来获取数据,因此您可以混淆属性/成员名称,而不是CLASS /类型名称。如果名称类似于FederalReserveLogIn,则您的类/类型上有一个靶心。
我在以下方面取得了初步的成功:
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
是您希望使用的任何密钥类型。整数产生最小的输出,并且仍然允许订阅代码使用枚举。但这可能是String。TT
是原始类型:myFoo = props.GetTItem(Of Long)(propsEnum.Foo)
3)将内部列表(词典)暴露给PBN和宾果游戏,所有操作都完成了。
添加用于点,矩形,字体,大小,颜色甚至位图的转换器也非常容易。
高温超导
关于serialization - 使用混淆处理的原始Buf序列化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8304997/