我正在寻找有关使用带混淆的原始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/

10-10 19:40